PySimpleGUI库和pymysql库

1.PySimpleGUI 库

PySimpleGUI 是一个用于简化 GUI 编程的 Python 包,它封装了多种底层 GUI 框架(如 tkinter、Qt、WxPython 等),提供了简单易用的 API。PySimpleGUI 包含了大量的控件(也称为小部件或组件),这些控件可以帮助你快速构建用户界面

安装:

pip install PySimpleGUI==4.60.5

说明:5.0以上的版本不免费

1.布局和窗口

python 复制代码
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("你点了关闭按钮")
        break
    if event in("人脸采集",):
        # 提示
        sg.popup("你点了人脸采集1按钮")
window.close()

2.文本框组件

python 复制代码
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()
    if event == "关闭":
        # 提示
        print("你点了关闭")
        sg.popup("你点了关闭按钮")
        break
    if event in("保存",):
        # 提示
        # 获取编号
        id_value = value["id"]
        name_value = value["name"]
        window["msg"].update(f"id:{id_value},name:{name_value}")
        sg.popup("保存")
window.close()

3.视频处理

python 复制代码
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:
            # 将图片转换为png格式
            imgType = cv2.imencode(".png", frame)[1].tobytes()
            print(imgType)
            window["video"].update(imgType)

    # 释放资源
    cap.release()
    window.close()

demo()

4.图片处理

python 复制代码
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(timeout=10)
        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()

2.pymysql

PyMySQL 是一个用于连接 MySQL 数据库的纯 Python 实现。它允许 Python 程序与 MySQL 数据库进行交互,执行 SQL 查询,并处理结果集

安装:

pip install pymysql

对数据库中数据的增删改查:

python 复制代码
import pymysql

# 新增
def sql_add(name, num):
    # 创建数据库链接
    con = pymysql.connect(
        host="localhost",
        user="root",
        passwd="123456",
        port=3306,
        database="demo01",
        charset="utf8"
    )
    # 创建游标对象 增删改查函数
    cur = con.cursor()
    sq1 = "insert into demo01 (user_name,user_num) value (%s, %s)"
    # 运行sq1(增删改sq1的函数)
    cur.execute(sq1, (name,num))
    # 执行增删改sq1函数 返回一个受影响行数的数值
    num = cur.rowcount
    if num > 0:
        print("新增成功!")
    else:
        print("新增失败!")
    # 提交
    con.commit()
    # 释放资源
    cur.close()
    con.close()

# 修改
def sql_update(name,num):
    # 创建数据库链接
    con = pymysql.connect(
        host="localhost",
        user="root",
        passwd="123456",
        port=3306,
        database="demo01",
        charset="utf8"
    )
    # 创建游标对象 增删改查函数
    cur = con.cursor()
    sq1 = "update  demo01 set user_name=%s where user_num=%s"
    # 运行sq1(增删改sq1的函数)
    cur.execute(sq1, (name, num))
    # 执行增删改sq1函数 返回一个受影响行数的数值
    num = cur.rowcount
    if num > 0:
        print("修改成功!")
    else:
        print("修改失败!")
    # 提交
    con.commit()
    # 释放资源
    cur.close()
    con.close()

def sql_query(num):
    # 创建数据库链接
    con = pymysql.connect(
        host="localhost",
        user="root",
        passwd="123456",
        port=3306,
        database="demo01",
        charset="utf8"
    )
    # 创建游标对象 增删改查函数
    cur = con.cursor()
    sq1 = "select * FROM demo01 WHERE user_num=%s"
    # 运行sq1(增删改sq1的函数)
    cur.execute(sq1, (num,))
    # 查询的结构返回到一个变量
    rs = cur.fetchall()
    """print(rs)
    print(rs[0][1])"""
    cur.close()
    con.close()
    if len(rs) > 0:
        return rs[0][1]
    else:
        return "查无此人"

def sql_delete(id):
    # 创建数据库链接
    con = pymysql.connect(
        host="localhost",
        user="root",
        passwd="123456",
        port=3306,
        database="demo01",
        charset="utf8"
    )
    # 创建游标对象 增删改查函数
    cur = con.cursor()
    sq1 = "delete from demo01 where user_id=%s"
    # 运行sq1(增删改sq1的函数)
    cur.execute(sq1, (id,))
    # 执行增删改sq1函数 返回一个受影响行数的数值
    num = cur.rowcount
    if num > 0:
        print("删除成功!")
    else:
        print("删除失败!")
    # 提交
    con.commit()
    # 释放资源
    cur.close()
    con.close()
if __name__ == '__main__':
    """sql_add("lisi",2)
    sql_update("王五",1)
    sql_query(3)"""
    sql_delete(1)

3.PySimpleGUI库和pymysql库组合实现人脸采集和人脸识别

1.人脸采集

准备:

  • 创建一个文件夹接收采集的人脸图片
  • 数据库中创建一张用来接收身份信息的表

实现:

python 复制代码
import pymysql
import PySimpleGUI as sg
import cv2

# 人脸用户的记录
def sql_add(name, num):
    # 创建数据库链接
    con = pymysql.connect(
        host="localhost",
        user="root",
        passwd="123456",
        port=3306,
        database="demo01",
        charset="utf8"
    )
    # 创建游标对象 增删改查函数
    cur = con.cursor()
    sq1 = "insert into demo01 (user_name,user_num) value (%s, %s)"
    # 运行sq1(增删改sq1的函数)
    cur.execute(sq1, (name,num))
    # 执行增删改sq1函数 返回一个受影响行数的数值
    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 not cap.isOpened():
        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:
            imgType = cv2.imencode(".png",frame)[1].tobytes()
            window["video"].update(imgType)

        if event == "采集":
            num = value["num"]
            name = value["name"]
            # 写入人脸图片
            iss = cv2.imwrite(f"..\\face_images\\{num}.png",frame)
            if iss:
                is_add = sql_add(name,num)
                if is_add:
                    sg.popup("收集人脸成功")
                else:
                    sg.popup("收集人脸失败")
    cap.release()
    window.close()

dataGet()

2.人脸识别

python 复制代码
import cv2
import PySimpleGUI as sg
import pymysql
import face_recognition
import os
import numpy as np

def sql_query(num):
    # 创建数据库链接
    con = pymysql.connect(
        host="localhost",
        user="root",
        passwd="123456",
        port=3306,
        database="demo01",
        charset="utf8"
    )
    # 创建游标对象 增删改查函数
    cur = con.cursor()
    sq1 = "select * FROM demo01 WHERE user_num=%s"
    # 运行sq1(增删改sq1的函数)
    cur.execute(sq1, (num,))
    # 查询的结构返回到一个变量
    rs = cur.fetchall()
    """print(rs)
    print(rs[0][1])"""
    cur.close()
    con.close()
    if len(rs) > 0:
        return rs[0][1]
    else:
        return "查无此人"


def queryGet():
    # 开启摄像头
    cap = cv2.VideoCapture(0)
    if not cap.isOpened():
        print("摄像头没有开启")
        return

    # 创建布局
    layout=[
        [sg.Image(key = "video")],
        [sg.Button("人脸识别"),sg.Button("关闭")]
    ]

    # 创建窗口
    window = sg.Window("人脸信息采集",layout)
    # 循环
    list_dir = os.listdir("../face_images")
    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()
            window["video"].update(imgType)


        if event == "人脸识别":
            if len(list_dir) > 0:
                for i in list_dir:
                    # 读取图片
                    img = cv2.imread(f"../face_images/{i}")
                    print(i)
                    if img is None:
                        print("没有图片")
                    else:
                        # 获取已知图片的特征变量
                        en1 = face_recognition.face_encodings(img)[0]
                        en2 = face_recognition.face_encodings(frame)
                        if len(en2) == 0:
                            sg.popup("未检测到人脸")
                            break
                        else:
                            # 计算欧几里得距离
                            rs = np.linalg.norm(en2[0] - en1)
                            print(rs)
                            if rs < 0.5:

                                b = i.split(".")[0]
                                a = sql_query(b)
                                sg.popup(f"用户{a}打卡成功")
                                list_dir.remove(i)

                                # 终止循环
                                break
                            else:
                                sg.popup("人脸库没有此人")

            else:
                sg.popup("已全部完成打卡!")
                break


    cap.release()
    window.close()
if __name__ == '__main__':
    queryGet()
相关推荐
yaosheng_VALVE11 分钟前
稀硫酸介质中 V 型球阀的材质选择与选型要点-耀圣
运维·spring cloud·自动化·intellij-idea·材质·1024程序员节
Leo.yuan20 分钟前
数据量大Excel卡顿严重?选对报表工具提高10倍效率
数据库·数据分析·数据可视化·powerbi
Runing_WoNiu28 分钟前
MySQL与Oracle对比及区别
数据库·mysql·oracle
天道有情战天下1 小时前
mysql锁机制详解
数据库·mysql
看山还是山,看水还是。1 小时前
Redis 配置
运维·数据库·redis·安全·缓存·测试覆盖率
谷新龙0011 小时前
Redis运行时的10大重要指标
数据库·redis·缓存
CodingBrother1 小时前
MySQL 中单列索引与联合索引分析
数据库·mysql
扣得君1 小时前
C++20 Coroutine Echo Server
运维·服务器·c++20
精进攻城狮@1 小时前
Redis缓存雪崩、缓存击穿、缓存穿透
数据库·redis·缓存
小酋仍在学习1 小时前
光驱验证 MD5 校验和
数据库·postgresql