PySimpleGUI 库
PySimpleGUI 是一个用于简化 GUI 编程的 Python 包,它封装了多种底层 GUI 框架(如 tkinter、Qt、WxPython 等),提供了简单易用的 API。PySimpleGUI 包含了大量的控件(也称为小部件或组件),这些控件可以帮助你快速构建用户界面
安装
pip install pysimplegui
布局和窗口
import PySimpleGUI as sg
def windows():
# 定义布局
layout = [
[sg.Text('你好')],
[sg.Button('关闭')]
]
# 创建窗口
window = sg.Window('我的窗口', layout)
# 事件循环
while True:
event, values = window.read()
# 点击X和退出按钮,关闭窗口
if event in (None, "关闭"):
break
# 关闭窗口
window.close()
def texts():
# 定义布局
layout = [
[sg.Text("编号:", size=(10, 1)), sg.InputText(key='id')],
[sg.Text("姓名:", size=(10, 1)), sg.InputText(key='name')],
[sg.Text(key="text")],
[sg.Button('保存'), sg.Button('关闭')]
]
# 创建窗口
window = sg.Window('我的窗口', layout)
# 事件循环
while True:
event, values = window.read()
if event in (sg.WIN_CLOSED, '关闭'):
break
# 确保values中包含有效的输入
id_value = values.get('id') # 使用.get()来获取值,避免None值的错误
name = values.get('name')
if event == '保存' and id_value is not None:
print(f'id={id_value}')
print(f'name={name}')
window['text'].update(f'id={id_value},name={name}')
window.close()
if __name__ == '__main__':
# windows()
texts()
视频处理
import cv2
import PySimpleGUI as sg
def demo():
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print('没有开启摄像头')
return
# 创建layout
layout = [
[sg.Image(key='video')],
[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:
img_type = cv2.imencode('.png',frame)[1].tobytes()
print(img_type)
window['video'].update(img_type)
cap.release()
window.close()
if __name__ == '__main__':
demo()
图片上传
import cv2
import PySimpleGUI as sg
def demo():
# 创建layout
layout = [
[sg.Image(key='-IMAGE-')],
[sg.Input(key='-FILE-', enable_events=True),sg.FileBrowse(file_types=(("Image Files", "*.png;*.jpg;*.jpeg;*.gif"),))],
[sg.Button('上传'), sg.Button('关闭')]
]
# 创建窗口
window = sg.Window('文件处理',layout)
while True:
# 读取数据和事件
event,value = window.read()
if event in ('关闭',None) :
break
if event == '上传':
# 更新图片
image_path = value['-FILE-']
print(image_path)
img = cv2.imread(image_path)
if img is None:
sg.popup_error(f"无法加载图像:{image_path}\n请确保文件路径正确且文件不是损坏的!")
continue # 跳过后续代码,重新等待用户选择有效的图像
img_type = cv2.imencode(".png", img)[1].tobytes()
window['-IMAGE-'].update(img_type)
window.close()
if __name__ == '__main__':
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 = 'shijianxu123',# 密码
port= 3306,# 端口
database= 'demo',# 数据库名
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的函数,返回一个受行数影响的数值
num = cur.rowcount
if num > 0:
print('新增成功')
else:
print('新增失败')
# 提交
con.commit()
#释放资源
con.close()
cur.close()
# 查询
def query(num):
# 创建数据库连接
con = pymysql.connect(
host= 'localhost',# 数据库地址
user = 'root',# 用户名
passwd = 'shijianxu123',# 密码
port= 3306,# 端口
database= 'demo',# 数据库名
charset = 'utf8'# 中文编码
)
# 创建游标对象,包含了增删改查的函数
cur = con.cursor()
# 定义sql
sql = 'select * from user_info where user_num = %s'
# 运行sql(增删改查sql的函数)
cur.execute(sql,(num,))
# 查询
rs = cur.fetchall()
#释放资源
con.close()
cur.close()
if len(rs) > 0:
return rs[0][1]
else:
return'查无此人'
def del_num(id):
# 创建数据库连接
con = pymysql.connect(
host= 'localhost',# 数据库地址
user = 'root',# 用户名
passwd = 'shijianxu123',# 密码
port= 3306,# 端口
database= 'demo',# 数据库名
charset = 'utf8'# 中文编码
)
# 创建游标对象,包含了增删改查的函数
cur = con.cursor()
# 定义sql
sql = 'delete from user_info where user_num = %s'
# 运行sql(增删改查sql的函数)
cur.execute(sql,(id,))
# 查询
num = cur.rowcount
#释放资源
if num > 0:
print('删除成功')
else:
print('删除失败')
# 提交
con.commit()
# 释放资源
con.close()
cur.close()
if __name__ == '__main__':
# add('王五',1)
# add('李四', 2)
# rs = query(2)
# print(rs)
del_num(2)
人脸采集
1 准备工作:创建人脸表
2 完成人脸保存
import pymysql
import cv2
import PySimpleGUI as sg
# 人脸入库新增
def add(name,num):
# 创建数据库连接
con = pymysql.connect(
host= 'localhost',# 数据库地址
user = 'root',# 用户名
passwd = 'shijianxu123',# 密码
port= 3306,# 端口
database= 'demo',# 数据库名
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的函数,返回一个受行数影响的数值
num = cur.rowcount
# 提交
con.commit()
#释放资源
con.close()
cur.close()
if num > 0:
print('新增成功')
return True
else:
print('新增失败')
return False
# 数据采集窗口
def data_get():
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print('没有开启摄像头')
return
# 创建layout
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:
img_type = cv2.imencode('.png', frame)[1].tobytes()
window['video'].update(img_type)
if event =='人脸采集':
num = value['num']
name = value['name']
# 写入人脸图片
iss = cv2.imwrite(f'E:/pych/pythonProject_study/image/{num}.png',frame)
if iss:
is_add = add(name,num)
if is_add:
sg.popup('人脸采集成功')
else:
sg.popup('人脸采集失败')
cap.release()
window.close()
if __name__ == '__main__':
data_get()
人脸识别
import pymysql
import cv2
import PySimpleGUI as sg
import face_recognition
import os
import numpy as np
# 查询
def query(num):
# 创建数据库连接
con = pymysql.connect(
host= 'localhost',# 数据库地址
user = 'root',# 用户名
passwd = 'shijianxu123',# 密码
port= 3306,# 端口
database= 'demo',# 数据库名
charset = 'utf8'# 中文编码
)
# 创建游标对象,包含了增删改查的函数
cur = con.cursor()
# 定义sql
sql = 'select * from user_info where user_num = %s'
# 运行sql(增删改查sql的函数)
cur.execute(sql,(num,))
# 查询
rs = cur.fetchall()
#释放资源
con.close()
cur.close()
if len(rs) > 0:
return rs[0][1]
else:
return'查无此人'
# 数据采集窗口
def data_get():
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print('没有开启摄像头')
return
# 创建layout
layout = [
[sg.Image(key='video')],
[sg.Button('关闭'),sg.Button('人脸识别')]
]
# 创建窗口
window = sg.Window('人脸识别', layout)
# 标记是否已经成功识别
recognition_success = False
while True:
# 读取数据和事件
event, value = window.read(timeout=10)
# 读取视频
ret, frame = cap.read()
if event in ('关闭', None):
break
if ret:
img_type = cv2.imencode('.png', frame)[1].tobytes()
window['video'].update(img_type)
if event =='人脸识别':
# 查找人脸库
list_dir = os.listdir('E:/pych/pythonProject_study/image')
if len(list_dir)>0:
for i in list_dir:
# 读取一个图片对象
img = cv2.imread(f'E:/pych/pythonProject_study/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.5:
a = query(i)
sg.popup(f'用户{a}识别成功')
recognition_success = True # 标记为已识别
break # 一旦识别成功,退出循环
if not recognition_success:
sg.popup('识别失败')
cap.release()
window.close()
if __name__ == '__main__':
data_get()