11.6学习日志

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()



上一篇:Maven(18)如何使用Maven打包项目?


下一篇:QT开发的程序实现界面语言切换中文英文