PySimpleGUI 库
PySimpleGUI 是一个用于简化 GUI 编程的 Python 包,它封装了多种底层 GUI 框架(如 tkinter、Qt、WxPython 等),提供了简单易用的 API。PySimpleGUI 包含了大量的控件(也称为小部件或组件),这些控件可以快速构建用户界面
安装
pip install pysimplegui
pip install PySimpleGUI==4.60.5
#5.0之后的版本收费,如果要卸载当前的版本用:pip uninstall pysimplegui
布局和窗口
import PySimpleGUI as sg
# 定义布局
layout = [
[sg.Text('你好')],
[sg.Button('关闭')]
]
# 创建窗口
window = sg.Window('我的窗口', layout)
# 事件循环
while True:
event, values = window.read()
# 点击X和退出按钮,关闭窗口
if event in (None, "关闭"):
break
# 关闭窗口
window.close()
import PySimpleGUI as sg
#创建一个布局组件
layout=[
[sg.Button("关闭"),sg.Button("人脸采集")]
]
#创建窗口
window=sg.Window("我的窗口",layout)
while True:
#读取窗口信息,返回窗口的数据和鼠标事件
event,value=window.read()
# if event in(None,"关闭"):
# print("你点了关闭按钮")
# sg.popup("你点了关闭按钮")
# # 提示
if event == "关闭":
print("你点了关闭按钮")
# 提示
sg.popup("你点了关闭按钮")
break
if event in("人脸采集",):
print("你点了人脸采集按钮")
#提示
sg.popup("你点了人脸采集按钮")
#资源释放,关闭窗口
window.close()
文本输入输出案例
import PySimpleGUI as sg
# 定义布局
layout = [
[sg.Text("编号:", size=(10, 1)), sg.InputText()],
[sg.Text(key="text")],
[sg.Button('保存'),sg.Button('关闭')]
]
# 创建窗口
window = sg.Window('我的窗口', layout)
# 事件循环
while True:
event, values = window.read()
# 获取编号
id = values[0]
if event == '保存':
print(f'id={id}')
sg.popup(f'id={id}')
# 更新文本
window['text'].update('新的文本内容')
if event == sg.WIN_CLOSED or event == '关闭':
break
# 关闭窗口
window.close()
import PySimpleGUI as sg
#创建一个布局组件
layout=[
[sg.Text("编号:",size=(10,1)),sg.InputText(key="id")],
[sg.Text("姓名:",size=(10,1)),sg.InputText(key="name")],
[sg.Text(key="msg")],
[sg.Button("关闭"),sg.Button("保存")]
]
#创建窗口
window=sg.Window("我的第一个窗口",layout)
while True:
#读取窗口信息,返回窗口的数据和鼠标事件
event,value=window.read()
#value是信息,event是事件
# if event in(None,"关闭"):
# print("你点了关闭按钮")
# sg.popup("你点了关闭按钮")
# # 提示
if event == "关闭":
# print("你点了关闭按钮")
# 提示
sg.popup("你点了关闭按钮")
break
if event in("保存",):
#获取编号
id=value["id"]
name=value["name"]
window["msg"].update(f"id:{id},姓名:{name}")
#提示
print(f"id:{id},姓名:{name}")
sg.popup(f"id:{id},姓名:{name}")
#print("你点了人脸采集按钮")
#资源释放,关闭窗口
window.close()
视频处理
import PySimpleGUI as sg
import cv2
def rendVideo():
# 读取视频
cap = cv2.VideoCapture(0)
#界面布局
layout =[
[
sg.Button("退出", size=(10, 1))
],
[sg.Image(key='image')],
]
#创建一个window对象
#location 视频位置
#size 视频大小
window =sg.Window("视频播放",layout,location=(350,50),size=(800,500))
# 开始人脸录入
while cap.isOpened():
event, values = window.read(timeout=10)
ret,frame = cap.read()
if ret:
#把数据帧对象转换成bytes数据类型,更新窗口对象window信息
imgbyts = cv2.imencode('.png', frame)[1].tobytes()
window['image'].update(data=imgbyts)
#点击X和退出按钮,关闭窗口
if event in (None,"退出"):
break
#关闭窗口
window.close()
cap.release()
if __name__ =="__main__":
rendVideo()
import cv2
import PySimpleGUI as sg
#开启摄像头
def demo():
cap = cv2.VideoCapture(0)
if cap.isOpened() == False:
print("没有开启摄像头")
return
#创建layout
layout=[
[sg.Button("关闭"), sg.Button("保存")],
[sg.Image(key="video")]
]
#创建窗口
window=sg.Window("视频处理",layout)
while True:
# 读取数据和事件
event,value=window.read(timeout=10)
#读取数据帧
ret,frame=cap.read()
#print(event)
#事件执行的逻辑先后顺序,点×表示没有任何事件
if event in(None,"关闭"):
break
if ret:
imgType=cv2.imencode(".png",frame)[1].tobytes()
print(imgType)
window["video"].update(imgType)
#释放资源
cap.release()
window.close()
demo()
图片上传
import PySimpleGUI as sg
def main():
# 设置主题
sg.theme('LightBlue')
# 布局定义
layout = [
[sg.Text('请选择一张图片:')],
[sg.Input(key='-FILE-', enable_events=True), sg.FileBrowse(file_types=(("Image Files", "*.png;*.jpg;*.jpeg;*.gif"),))],
[sg.Button('退出')],
[sg.Image(key='-IMAGE-')]
]
# 创建窗口
window = sg.Window('图片上传示例', layout)
while True:
event, values = window.read()
# 处理事件
if event in (sg.WINDOW_CLOSED, '退出'):
break
elif event == '-FILE-':
# 更新图片
image_path = values['-FILE-']
print(image_path)
if image_path:
window['-IMAGE-'].update(filename=image_path)
window.close()
if __name__ == '__main__':
main()
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", passwd="1234", database="demo01", charset="utf8");
# 创建游标
cr = con.cursor();
# 定义一个sql语句变量
sql = "insert into user_info (user_name,num) values(%s,%s)";
# 执行sql
cr.execute(sql,(name,num))
# 执行返回的插入数量
num = cr.rowcount;
if num > 0:
print("插入成功");
else:
print("插入失败");
# 提交操作
con.commit();
# 关闭连接
con.close();
数据查询
import PySimpleGUI as sg import cv2 import pymysql import os import face_recognition import numpy as np #查询人脸库 def query(id): # 创建数据库连接 con = pymysql.Connect(host="localhost", user="root", passwd="1234", database="demo01", charset="utf8"); # 创建游标 cr = con.cursor(); # 定义一个sql语句变量 sql = "select * from user_info where num = %s "; # 执行sql cr.execute(sql,id) # 执行返回的插入数量 num = cr.fetchall() print(num) if len(num) > 0: return num[0][1] else: return "无" # 提交操作 con.commit(); # 关闭连接 con.close();
#数据库增删改查操作
import pymysql
#新增
def add(name,num):
# 创建数据库连接
con=pymysql.connect(
host="localhost",#数据库地址
user="root",#用户名
passwd="123456",#密码
port=3306,#端口
database="demo91",#数据库名
charset="utf8"#中文编码
)
#创建游标对象,包含了增删改查的函数
cur=con.cursor()
#定义sql
sql="insert into user_info(user_name,user_num) value(%s,%s)"
#
#sql = "update user_info set user_name=%s where user_id=%s)"
#运行sql(增删改查sql的函数)
cur.execute(sql, (name,num))
#执行增删改sql的函数,返回一个受影响行数的数值,=0表示执行失败
num=cur.rowcount
if num>0:
print("新增成功")
else:
print("新增失败")
#提交
con.commit()
#释放资源
cur.close()
con.close()
def update(name,id):
# 创建数据库连接
con = pymysql.connect(
host="localhost", # 数据库地址
user="root", # 用户名
passwd="123456", # 密码
port=3306, # 端口
database="demo91", # 数据库名
charset="utf8" # 中文编码
)
# 创建游标对象,包含了增删改查的函数
cur = con.cursor()
# 定义sql#更新
sql = "update user_info set user_name=%s where user_id=%s"
# 运行sql(增删改查sql的函数)
cur.execute(sql, (name, id))
# 执行增删改sql的函数,返回一个受影响行数的数值,=0表示执行失败
num = cur.rowcount
if num > 0:
print("更新成功")
else:
print("更新失败")
# 提交
con.commit()
# 释放资源
cur.close()
con.close()
def select(num):
# 创建数据库连接
con = pymysql.connect(
host="localhost", # 数据库地址
user="root", # 用户名
passwd="123456", # 密码
port=3306, # 端口
database="demo91", # 数据库名
charset="utf8" # 中文编码
)
# 创建游标对象,包含了增删改查的函数
cur = con.cursor()
# 定义sql#更新
sql = "select * from user_info where user_num=%s"
# 运行sql(增删改查sql的函数)
cur.execute(sql, (num,))
# 执行查询sql的函数
rs=cur.fetchall()
print(rs)
# 释放资源
cur.close()
con.close()
if len(rs)>0:
print(rs[0][1])
return rs[0][1]
else:
return print("查无此人")
def delNum(id):
# 创建数据库连接
con = pymysql.connect(
host="localhost", # 数据库地址
user="root", # 用户名
passwd="123456", # 密码
port=3306, # 端口
database="demo91", # 数据库名
charset="utf8" # 中文编码
)
# 创建游标对象,包含了增删改查的函数
cur = con.cursor()
# 定义sql#更新
sql = "delete from user_info where user_id=%s"
# 运行sql(增删改查sql的函数)
cur.execute(sql, (id,))
# 执行增删改sql的函数,返回一个受影响行数的数值,=0表示执行失败
num = cur.rowcount
if num > 0:
print("删除成功")
else:
print("删除失败")
# 提交
con.commit()
# 释放资源
cur.close()
con.close()
if __name__=="__main__":
#add("王五",1)
#update("李四",2)
select(5)
#delNum(10)
人脸采集
1 准备工作:创建人脸表
安装mysql和navicat,用navicat连接mysql使用
具体安装可以参考:Windows系统下mysql安装过程及以管理员身份运行cmd命令行问题合集_以管理员运行mysqld --no-defaults --initialize-insecure-优快云博客
注意创建用户表时要勾选utf8#中文
2 完成人脸保存
import PySimpleGUI as sg
import cv2
import pymysql
#添加人脸信息到数据库中
def add(name,num):
# 创建数据库连接
con = pymysql.Connect(host="localhost", user="root", passwd="1234", database="demo01", charset="utf8");
# 创建游标
cr = con.cursor();
# 定义一个sql语句变量
sql = "insert into user_info (user_name,num) values(%s,%s)";
# 执行sql
cr.execute(sql,(name,num))
# 执行返回的插入数量
num = cr.rowcount;
if num > 0:
print("插入成功");
else:
print("插入失败");
# 提交操作
con.commit();
# 关闭连接
con.close();
def rendVideo():
# 读取视频
cap = cv2.VideoCapture(0)
#界面布局
layout =[
[sg.Text("编号:", size=(10, 1)), sg.InputText()],
[sg.Text("姓名:", size=(10, 1)), sg.InputText()],
[sg.Button("人脸采集", size=(10, 1)),sg.Button("退出", size=(10, 1))],
[sg.Image(key='image')],
]
window =sg.Window("视频播放",layout,location=(350,50),size=(800,500))
# 开始人脸录入
while cap.isOpened():
event, values = window.read(timeout=10)
ret,frame = cap.read()
if ret:
#把数据帧对象转换成bytes数据类型,更新窗口对象window信息
imgbyts = cv2.imencode('.png', frame)[1].tobytes()
window['image'].update(data=imgbyts)
#点击X和退出按钮,关闭窗口
if event in (None,"退出"):
break
if event in (None,"人脸采集"):
# 获取编号
id = values[0]
name = values[1]
print(id,name)
# 保存人脸
iss = cv2.imwrite(f"D:\\faceImages\\{id}.png", frame)
if iss == True:
add(name,id)
print("收集人脸成功")
else:
print("收集人脸失败")
#关闭窗口
window.close()
cap.release()
if __name__ =="__main__":
rendVideo()
人脸识别
import PySimpleGUI as sg
import cv2
import pymysql
import os
import face_recognition
import numpy as np
#查询人脸库
def query(id):
# 创建数据库连接
con = pymysql.Connect(host="localhost", user="root", passwd="1234", database="demo01", charset="utf8");
# 创建游标
cr = con.cursor();
# 定义一个sql语句变量
sql = "select * from user_info where num = %s ";
# 执行sql
cr.execute(sql,id)
# 执行查询
num = cr.fetchall()
print(num)
if len(num) > 0:
return num[0][1]
else:
return "无"
# 提交操作
con.commit();
# 关闭连接
con.close();
def rendVideo():
# 读取视频
cap = cv2.VideoCapture(0)
#界面布局
layout =[
[sg.Button("人脸识别", size=(10, 1)),sg.Button("退出", size=(10, 1))],
[sg.Image(key='image')],
]
window =sg.Window("视频播放",layout,location=(350,50),size=(800,500))
# 开始人脸录入
while cap.isOpened():
event, values = window.read(timeout=10)
ret,frame = cap.read()
if ret:
#把数据帧对象转换成bytes数据类型,更新窗口对象window信息
imgbyts = cv2.imencode('.png', frame)[1].tobytes()
window['image'].update(data=imgbyts)
#点击X和退出按钮,关闭窗口
if event in (None,"退出"):
break
if event in (None,"人脸识别"):
path = os.listdir("D:\\faceImages")
#print(path)
for i in path:
# 获取人脸特征
img = cv2.imread(f"D:\\faceImages\\{i}")
en1 = face_recognition.face_encodings(img)[0]
en2 = face_recognition.face_encodings(frame)[0]
iss = np.linalg.norm(en1 - en2)
#print(iss)
num = i.split(".")[0]
# print(num)
if iss < 0.5:
rs = query(num)
sg.popup(f"此人是{rs}")
break
else:
sg.popup(f"查无此人")
#关闭窗口
window.close()
cap.release()
if __name__ =="__main__":
rendVideo()
#数据采集
import pymysql
import PySimpleGUI as sg
import cv2
#人脸信息用户记录
def add(name,num):
# 创建数据库连接
con=pymysql.connect(
host="localhost",#数据库地址
user="root",#用户名
passwd="123456",#密码
port=3306,#端口
database="demo91",#数据库名
charset="utf8"#中文编码
)
#创建游标对象,包含了增删改查的函数
cur=con.cursor()
#定义sql
sql="insert into user_info(user_name,user_num) value(%s,%s)"
#运行sql(增删改查sql的函数)
cur.execute(sql, (name,num))
#执行增删改sql的函数,返回一个受影响行数的数值,=0表示执行失败
num=cur.rowcount
# 提交
con.commit()
# 释放资源
cur.close()
con.close()
if num>0:
print("新增成功")
return True
else:
print("新增失败")
return False
#数据采集窗口
def dataGet():
# 开启摄像头
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:
imtType=cv2.imencode(".png",frame)[1].tobytes()
window["video"].update(imtType)
if event=="人脸采集":
#获取编号和姓名
num=value["num"]
name=value["name"]
# 写入人脸图片
iss=cv2.imwrite(f"D:\\faceImages\\{num}.png",frame)
if iss:
isAdd=add(name,num)
if isAdd:
sg.popup("人脸采集成功")
else:
sg.popup("人脸采集失败")
cap.release()
window.close()
if __name__=="__main__":
dataGet()
#人脸识别
import pymysql
import PySimpleGUI as sg
import cv2
import face_recognition
import os
import numpy as np
#人脸信息用户记录
def select(num):
# 创建数据库连接
con = pymysql.connect(
host="localhost", # 数据库地址
user="root", # 用户名
passwd="123456", # 密码
port=3306, # 端口
database="demo91", # 数据库名
charset="utf8" # 中文编码
)
# 创建游标对象,包含了增删改查的函数
cur = con.cursor()
# 定义sql#更新
sql = "select * from user_info where user_num=%s"
# 运行sql(增删改查sql的函数)
cur.execute(sql, (num,))
# 执行查询sql的函数
rs=cur.fetchall()
print(rs)
# 释放资源
cur.close()
con.close()
if len(rs)>0:
print(rs[0][1])
return rs[0][1]
else:
return print("查无此人")
#人脸识别窗口
def dataGet():
# 开启摄像头
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:
imtType=cv2.imencode(".png",frame)[1].tobytes()
window["video"].update(imtType)
if event=="人脸识别":
# 查找人脸库
list_dir=os.listdir("D:\\faceImages")
if len(list_dir)>0:
for i in list_dir:
# 读取一个图片对象
img=cv2.imread(f"D:\\faceImages\\{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.5:
b=i.split(".")[0]
a=select(b)
sg.popup(f"用户{a}打卡成功")
#查到此人,终止循环
break
else:
sg.popup("人脸库没有此人")
#这里如果图片库里有多个图片,会逐一进行比对并弹框人脸库没有此人,需要修改
cap.release()
window.close()
if __name__=="__main__":
dataGet()
888

被折叠的 条评论
为什么被折叠?



