python PySimpleGUI 使用

# PySimpleGUI  库 快速简单构建一个gui窗口
# PySimpleGUI 是一个用于简化 GUI 编程的 Python 包,它封装了多种底层 GUI 框架(如 tkinter、Qt、WxPython 等),提供了简单易用的 API。
# PySimpleGUI 包含了大量的控件(也称为小部件或组件),这些控件可以帮助你快速构建用户界面
# 导包
import PySimpleGUI as sg
import cv2
import keyboard
from PIL import Image
import os
# 创建一个布局组件 往窗口里面放什么东西
# 列表嵌套列表,列表里面的每一个列表都是一个组件
# 组件类型 sg.Text 传参 文字  sg.Button按钮 实际上是实现类
def demo1(): # 在 PySimpleGUI 中,调整组件的布局通常涉及修改布局列表 layout 中的元素排列。每个子列表代表窗口中的一行,而子列表内的元素则按照从左到右的顺序排列在该行中。
    layout = [
        [sg.Text("编号:", size=(10, 1)), sg.InputText(key="id")],
        [sg.Text("姓名:", size=(10, 1)), sg.InputText(key="name")],
        [sg.Text(key="input_tips_text")],
        [sg.Button('保存'),sg.Button('关闭'),sg.Button('人脸采集')]
    ]
    # 创建窗口 跟cv2 差不多
    window=sg.Window("我的第一个窗口",layout)
    while True:
        # 读取窗口信息 返回窗口的数据和鼠标事件
        event,value=window.read()
        # values(通常命名为 value 或 values): 这是一个字典,包含了窗口中所有元素当前的值。
        # 例如,如果窗口中有一个文本输入框,那么这个字典将包含该输入框当前的文本。
        # 对于按钮来说,如果这个按钮(没有设置key的)被点击了,其对应的值(通常是按钮的文本)将出现在这个字典中。
        # event(通常命名为event): 这是一个字符串,表示发生了哪个事件。最常见的事件是窗口关闭('WINDOW_CLOSED')或某个按钮被点击(此时event的值将是按钮(有设置key的)的文本 )。

        if event=='关闭' or keyboard.on_press(lambda event:event.name)=="esc":
            print("窗口关闭")
            break
        elif event=='人脸采集':
            print("人脸采集")
        elif event=="保存" or keyboard.on_press(lambda event:event.name)=="enter":
            print(value["id"],value["name"])
            sg.popup(f'id:{value["id"]} name:{value["name"]}') # sg.popup()传入一个字符串 把这个字符串弹窗 弹出来
            window["input_tips_text"].update(f'id:{value["id"]} name:{value["name"]}') # 用key去取到window的控件然后更新控件的信息 传入的是字符串
    keyboard.unhook_all()
    window.close()
def demo2(): # 视频处理
    cap=cv2.VideoCapture(0)
    if cap.isOpened()==False:
        print("没有摄像头")
    layout = [
        [sg.Image(key="video")], # 图片组件
        [sg.Button('保存'), sg.Button('关闭'), sg.Button('人脸采集')]
    ]
    window=sg.Window("人脸识别",layout)
    while True:
        ret,frame=cap.read()
        event,value=window.read(timeout=10) # timeout设置帧之间的间隔 不然帧率太高显示不了窗口
        if event in ("关闭",None):
            break
        if ret:
            # 要把数据帧转为图片PySimpleGUI才能显示
            # #把数据帧对象转换成bytes数据类型,更新窗口对象window信息
            imgbyts = cv2.imencode('.png', frame)[1].tobytes() # imgbyts 就是这个图片的bytes数据类型
            window["video"].update(data=imgbyts)

    cv2.destroyAllWindows()
    window.close()
    pass
def demo3(): # 文件上传
    layout = [
        [sg.Input("请选择一张图片",key="img_filepath", enable_events=True), sg.FileBrowse(file_types=(("Image Files", "*.*"),))], # sg.FileBrowse创建一个文件浏览按钮 选择文件获得路径 选中的文件路径将自动填充到旁边的输入框中  限定为图片
        [sg.Image(key='-IMAGE-')],
        [sg.Button('保存'), sg.Button('关闭'), sg.Button('人脸采集'), sg.Button('上传')]
    ]
    # 创建窗口 跟cv2 差不多
    window = sg.Window("文件处理", layout)
    while True:
        event, value = window.read(timeout=10)  # timeout设置帧之间的间隔 不然帧率太高显示不了窗口
        if event in ("关闭",None):
            break
        elif event == "img_filepath":
        # 更新图片
            image_path = value["img_filepath"] # "img_filepath"是文本输入框 value会直接包含他的内容
            print(image_path)
            if image_path: # 同时 input发生了输入事件 event事件字典 也会包含 input的key
                image = Image.open(image_path)
                image.save(image_path[0:-4]+".png", 'PNG')
                window['-IMAGE-'].update(filename=image_path[0:-3]+'png') # 把文件路径重新传给sg.Image filename 不支持jpg格式版本不同 转为png就可以忽略版本问题
                if os.path.exists(image_path) and image_path[::-1][0:3]!="png":
                    # 删除原来的文件 只留下png的
                    os.remove(image_path)
    window.close()
    pass
def demo4(): # 文件上传
    layout = [
        [sg.Input("请选择一张图片",key="img_filepath", enable_events=True), sg.FileBrowse(file_types=(("Image Files", "*.*"),))], # sg.FileBrowse创建一个文件浏览按钮 选择文件获得路径 选中的文件路径将自动填充到旁边的输入框中  限定为图片
        [sg.Image(key='-IMAGE-')],
        [sg.Button('保存'), sg.Button('关闭'), sg.Button('人脸采集'), sg.Button('上传')]
    ]
    # 创建窗口 跟cv2 差不多
    window = sg.Window("文件处理", layout)
    while True:
        event, value = window.read(timeout=10)  # timeout设置帧之间的间隔 不然帧率太高显示不了窗口
        if event in ("关闭",None):
            break
        elif event == "img_filepath":
        # 更新图片
            image_path = value["img_filepath"] # "img_filepath"是文本输入框 value会直接包含他的内容
            print(image_path)
            if image_path: # 同时 input发生了输入事件 event事件字典 也会包含 input的key
                img = cv2.imread(image_path)
                imgbyts = cv2.imencode('.png', img)[1].tobytes()  # imgbyts 就是这个图片的bytes数据类型
                window['-IMAGE-'].update(filename=imgbyts) # 把文件路径重新传给sg.Image filename 不支持jpg格式版本不同 转为p数据流就可以忽略版本问题
    window.close()
    pass
if __name__=="__main__":
    pass
    demo1()
    # demo2()
    # demo3()
    # demo4()

你可能感兴趣的:(python)