PySimpleGUI 库
PySimpleGUI 是一个用于简化 GUI 编程的 Python 包,它封装了多种底层 GUI 框架(如 tkinter、Qt、WxPython 等),提供了简单易用的 API。PySimpleGUI 包含了大量的控件(也称为小部件或组件),这些控件可以帮助你快速构建用户界面
安装
直接pip install pysimplegui安装的是最新版PysimpleGUI,这个5.0之后就是收费的,只能试用。pip install PySimpleGUI==4.60.5,可以下载旧版,免费使用
先卸载,使用命令pip uninstall pysimplegui,然后使用命令安装旧版本
pip install PySimpleGUI==4.60.5
pip install pysimplegui
布局和窗口
文本输入输出案例
import PySimpleGUI as sg
# 创建一个布局组件
layout = [
[sg.Text("ID", size=(10, 1), ), sg.InputText()],
[sg.Text("Name", size=(10, 1), ), sg.InputText()],
[sg.Text(key="msg")],
[sg.Button("关闭"), sg.Button("保存")]
]
# 创建窗口
window = sg.Window("我的第一个窗口", layout)
while True:
event01, value01 = window.read()
print(value01)
if event01 == "关闭":
sg.popup("你点了关闭按钮")
break
if event01 in "保存":
id = value01[0]
name = value01[1]
window["msg"].update(f"ID:{id} Name:{name}")
sg.popup("你点了人脸采集按钮")
# 资源释放
window.close()
视频处理
import PySimpleGUI as sg
import cv2
# 开启摄像头
def demo():
# 获取摄像头
cap = cv2.VideoCapture(0)
# 判断摄像头是否开启
if cap.isOpened() == False:
print("没有开启摄像头")
return
# 创建layout
layout = [
[sg.Button("关闭")],
[sg.Image(key="Video")]
]
# 创建窗口
window = sg.Window("视频处理", layout)
while True:
# 读取数据和事件
event, value = window.read(timeout=10)
# 读取数据帧
ret, frame = cap.read()
if event in (None,"关闭"):
break
if ret:
imgType = cv2.imencode(".png", frame)[1].tobytes()
print(imgType)
window["Video"].update(imgType)
# 释放资源
cap.release()
window.close()
if __name__ == '__main__':
demo()
图片上传
import cv2
import PySimpleGUI as sg
#开启摄像头
def demo():
#创建layout
layout = [
[sg.Button("关闭"),sg.Button("上传")],
[sg.Input(key='-FILE-', enable_events=True),
sg.FileBrowse(file_types=(("Image Files", "*.png;*.jpg;*.jpeg;*.gif"),))],
[sg.Image(key="video")]
]
#创建窗口
window = sg.Window("文件处理",layout)
while True:
event,value = window.read()
if event in (None,"关闭"):
break
if event == "上传":
#图片路径不能用中文
path = value["-FILE-"]
print(path)
img = cv2.imread(path)
imgType = cv2.imencode(".png", img)[1].tobytes()
window["video"].update(imgType)
window.close()
demo()
pymsql 库
PyMySQL
是一个用于连接 MySQL 数据库的纯 Python 实现。它允许 Python 程序与 MySQL 数据库进行交互,执行 SQL 查询,并处理结果集
安装
pip install pymysql
数据库操作
import pymysql
# 新增
def add(name, num):
con = pymysql.connect(
host="localhost", # 主机名
user="root",
password="xz413613",
database="demo1", # 数据库名
charset="utf8" # 编码
)
# 创建游标对象,包含了增删改查的函数
cur = con.cursor()
# 定义sql
sql = "insert into user_list (user_name,user_num) values(%s,%s)"
# 运行sql
cur.execute(sql, (name, num))
# 返回这串sql语句影响了多少行数据
num = cur.rowcount
if num > 0:
print("新增成功")
else:
print("新增失败")
# 提交
con.commit()
# 释放资源
cur.close()
con.close()
def update(num):
con = pymysql.connect(
host="localhost", # 数据库地址
user="root", # 用户名
password="xz413613", # 密码
database="demo1", # 数据库名
charset="utf8" # 编码
)
# 创建游标对象,包含了增删改查的函数
cur = con.cursor()
# 定义sql
sql = "select * from user_list where user_num=%s"
# 运行sql
cur.execute(sql, (num,))
# 查询
rs = cur.fetchall()
# 释放资源
cur.close()
con.close()
if len(rs) > 0:
print(rs)
print(rs[0][1])
else:
return "查无此人"
def del_num(id):
con = pymysql.connect(
host="localhost", # 主机名
user="root",
password="xz413613",
database="demo1", # 数据库名
charset="utf8" # 编码
)
# 创建游标对象,包含了增删改查的函数
cur = con.cursor()
# 定义sql
sql = "delete from user_list where user_id=%s"
# 运行sql
cur.execute(sql, (id,))
# 返回这串sql语句影响了多少行数据
num = cur.rowcount
if num > 0:
print("删除成功")
else:
print("删除失败")
# 提交
con.commit()
# 释放资源
cur.close()
con.close()
if __name__ == '__main__':
# add("小11", 111)
update(1)
# del_num(1)
人脸采集
1 准备工作:创建人脸表
2 完成人脸保存
import PySimpleGUI as sg
import cv2
import pymysql
# 新增
def add(name, num):
con = pymysql.connect(
host="localhost", # 主机名
user="root",
password="xz413613",
database="demo1", # 数据库名
charset="utf8" # 编码
)
# 创建游标对象,包含了增删改查的函数
cur = con.cursor()
# 定义sql
sql = "insert into user_list (user_name,user_num) values(%s,%s)"
# 运行sql
cur.execute(sql, (name, num))
# 返回这串sql语句影响了多少行数据
num = cur.rowcount
# 提交
con.commit()
# 释放资源
cur.close()
con.close()
if num > 0:
print("新增成功")
return True
else:
print("新增失败")
return False
# 数据窗口采集
def datacGet():
# 开启摄像头
cap = cv2.VideoCapture(0)
if cap.isOpened() == False:
print("摄像头没开")
return
# 创建布局
layout = [
[sg.Text("编号:"), sg.InputText(key="num")],
[sg.Text("姓名:"), sg.InputText(key="name")],
[sg.Image(key="video")],
[sg.Button("关闭"), sg.Button("采集")]
]
# 创建窗口
window = sg.Window("人脸信息采集", layout)
# 循环
while True:
event, value = window.read(timeout=10)
# 读取视频
ret, frame = cap.read()
if event in (None, "关闭"):
# 终止循环
break
# 视频流的处理
if ret:
# 已经读取到视频,现在进行转换,然后放进image里面
imType = cv2.imencode(".png", frame)[1].tobytes()
window["video"].update(imType)
if event == "采集":
# 获取编号和姓名
num = value["num"]
name = value["name"]
# 写入人脸图片
iss = cv2.imwrite(f"D:\\HQYJ\\HQYJPY Project\\241031AI OpenCV Project\\face_package\\face_image\\{num}.png",
frame)
if iss:
issAdd = add(name, num)
if issAdd:
sg.popup("人脸采集成功")
else:
sg.popup("人脸采集失败")
# 资源释放
cap.release()
window.close()
if __name__ == '__main__':
datacGet()
人脸识别
import os
import PySimpleGUI as sg
import cv2
import face_recognition
import numpy as np
import pymysql
# 新增
def update(num):
con = pymysql.connect(
host="localhost", # 数据库地址
user="root", # 用户名
password="xz413613", # 密码
database="demo1", # 数据库名
charset="utf8" # 编码
)
# 创建游标对象,包含了增删改查的函数
cur = con.cursor()
# 定义sql
sql = "select * from user_list where user_num=%s"
# 运行sql
cur.execute(sql, (num,))
# 查询
rs = cur.fetchall()
# 释放资源
cur.close()
con.close()
if len(rs) > 0:
print(rs)
return rs[0][1]
else:
return "查无此人"
# 数据窗口采集
def datacGet():
# 开启摄像头
cap = cv2.VideoCapture(0)
if cap.isOpened() == False:
print("摄像头没开")
return
# 创建布局
layout = [
[sg.Image(key="video")],
[sg.Button("关闭"), sg.Button("识别")]
]
# 创建窗口
window = sg.Window("人脸信息识别", layout)
# 循环
while True:
event, value = window.read(timeout=10)
# 读取视频
ret, frame = cap.read()
if event in (None, "关闭"):
# 终止循环
break
# 视频流的处理
if ret:
# 已经读取到视频,现在进行转换,然后放进image里面
imType = cv2.imencode(".png", frame)[1].tobytes()
window["video"].update(imType)
if event == "识别":
# 查找人脸库
list_dir = os.listdir("D:\\HQYJ\HQYJPY Project\\241031AI OpenCV Project\\face_package\\face_image")
if len(list_dir) > 0:
for i in list_dir:
# 读取一个图片对象
img = cv2.imread(f"D:\\HQYJ\HQYJPY Project\\241031AI OpenCV Project\\face_package\\face_image\\{i}")
if img is None:
print("没有读取图片")
break
else:
# 获取已知图片的特征变量
en1 = face_recognition.face_encodings(img)[0]
# 获取需要检测图片的特征变量
en2 = face_recognition.face_encodings(frame)[0]
# 计算欧几里得距离
rs = np.linalg.norm(en1 - en2)
print(rs)
if rs < 0.4:
b = i.split(".")[0]
a = update(b)
sg.popup(f"用户{a},打卡成功")
break
else:
sg.popup("人脸库没有此人")
# 资源释放
cap.release()
window.close()
if __name__ == '__main__':
datacGet()
以上代码在不同的设备上使用,需要注意代码中路径的设置,以及检查是否安装了必需的第三方库