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("你点了关闭按钮")breakif 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# 创建layoutlayout = [[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,"关闭"):breakif 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():#创建layoutlayout = [[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,"关闭"):breakif 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()# 定义sqlsql = "insert into user_list (user_name,user_num) values(%s,%s)"# 运行sqlcur.execute(sql, (name, num))# 返回这串sql语句影响了多少行数据num = cur.rowcountif 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()# 定义sqlsql = "select * from user_list where user_num=%s"# 运行sqlcur.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()# 定义sqlsql = "delete from user_list where user_id=%s"# 运行sqlcur.execute(sql, (id,))# 返回这串sql语句影响了多少行数据num = cur.rowcountif 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()# 定义sqlsql = "insert into user_list (user_name,user_num) values(%s,%s)"# 运行sqlcur.execute(sql, (name, num))# 返回这串sql语句影响了多少行数据num = cur.rowcount# 提交con.commit()# 释放资源cur.close()con.close()if num > 0:print("新增成功")return Trueelse: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()# 定义sqlsql = "select * from user_list where user_num=%s"# 运行sqlcur.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("没有读取图片")breakelse:# 获取已知图片的特征变量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},打卡成功")breakelse:sg.popup("人脸库没有此人")# 资源释放cap.release()window.close()if __name__ == '__main__':datacGet()
以上代码在不同的设备上使用,需要注意代码中路径的设置,以及检查是否安装了必需的第三方库