【Python】pysimplegui主动事件(多线程执行耗时任务解决主线程卡死问题)

2023-05-16

1.说明

PySimpleGui是一个免费开源的Python GUI库,用起来比Tkinter、PyQt5等库更简单,所以可以用来快速开发GUI程序,高效便捷。关于PySimpleGUI的基本使用,可以参考之前的文章,【Python】Python图形化界面库PySimpleGUI的简单使用

默认情况下我们习惯在主线程更新UI,但是,一旦遇到耗时任务,界面就会卡住,甚至进入假死状态,Win系统会提示你“程序无响应”,这明显对用户很不友好,所以我们要考虑把耗时任务放在子线程执行,主线程就只管更新UI,保证主线程不会卡死

2.主动发出事件

开启多线程的方式我们都学过,但问题是,在子线程里执行任务就变得不好与主线程交互了,比如说,想要把子线程里的执行进度更新到UI,这就需要子线程与主程序进行交互,即主线程需要拿到子线程的数据。

之前我们处理的事件都是通过点击UI等方式发出的,即由用户发出,实际上,Window对象也可以主动发出事件,只要调用一下Window对象的write_event_value()方法就行

import PySimpleGUI as sg

layout = [
    [sg.Button('开始'), sg.Button('退出')]
]
window = sg.Window('新窗口', layout)

while True:
    event, values = window.read()
    print(f"event: {event}, values:{values}")
    if event == sg.WIN_CLOSED or event == '退出' or event == "主动事件":
        break
    else:
        # 主动发出事件,事件名是“主动事件”,事件值是“主动发出的事件”
        window.write_event_value("主动事件", "主动发出的事件")

window.close()

3.在子程更新UI

知道了Window对象有write_event_value()方法之后,我们就可以在子线程与主线程交互了,即只要在子线程里调用Window对象的write_event_value()方法,主线程监听到子线程发出的事件就更新UI,演示代码如下

import PySimpleGUI as sg

import time
import threading


def long_time_work(window):
    for i in range(10):
        time.sleep(1)
        window.write_event_value('任务进度', i)
    window.write_event_value('任务结束', '')


layout = [
    [sg.Output(size=(60, 10))],
    [sg.Button('开始'), sg.Button('退出')]
]

window = sg.Window('耗时任务演示', layout)

while True:
    event, values = window.read()
    if event == sg.WIN_CLOSED or event == '退出':
        break
    if event == '开始':
        print('点击了“开始”按钮,即将调用耗时函数')
        threading.Thread(target=long_time_work, args=(window,), daemon=True).start()
        print('已调用耗时函数')
    elif event == '任务结束':
        print('任务已结束')
    else:
        print(f'-- {event}: {values["任务进度"]}')
window.close()

上面的代码中使用了sg.Output元素,该元素继承自Multiline,它会把标准输出重定向到Output里,即打印东西不会在控制台显示而是会在Output界面演示

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Python】pysimplegui主动事件(多线程执行耗时任务解决主线程卡死问题) 的相关文章

  • f103 hal库中PWM的使用方法

    1 初始化复用管脚 span class token keyword void span span class token function BEEP Init span span class token punctuation span
  • EFR32FG14 使用定时器TIMER做毫秒级定时

    EFR32FG14 使用定时器TIMER做毫秒级定时 1 添加头文件 span class token macro property span class token directive keyword include span span
  • EFR32FG14 UART的使用方法

    EFR32FG14 UART的使用方法 1 初始化串口 xff08 PA0 gt TX PA1 gt RX xff09 span class token keyword void span span class token function
  • EFR32解锁方法

    EFR32锁住的解锁方法 在某些情况下 xff0c 芯片可能会被锁住 xff0c 导致J LINK等工具连接不上 xff0c 可以参考如下方法 xff1a 1 进入commander exe所在的目录 xff1b 按住Shift 43 右键
  • TFT1.44寸屏ST7735S屏幕使用-stm32f103c8t6

    TFT1 44寸屏ST7735S屏幕使用 stm32f103c8t6 K xff1a 背景灯 RESET xff1a tft复位 RS xff1a 控制线 xff08 数据或者命令 xff09 SDA xff1a 数据线 xff08 SPI
  • 8421拨码器 R7H3-16 的使用

    8421拨码器 R7H3 16 的使用 使用方法极其简单 xff0c 1 2 4 8脚分解与单片机的4个IO脚连接 xff0c IO配置为输入即可 0代表低电平 xff0c 1代表高电平 档位 脚位124801111101112101130
  • Ubuntu 18 上不了网解决方法

    Ubuntu 18 出现网络异常 1 打开命令行 Ctrl 43 Alt 43 t 2 关闭网络 sudo service network manager stop 3 删除网络 sudo rm var lib NetworkManager
  • GPIO引脚 模拟 IIC(软件IIC)

    GPIO引脚 模拟 IIC 软件IIC IIC总线在传输数据的过程中一共有三种类型信号 xff0c 分别为 xff1a 开始信号 结束信号和应答信号 IIC总线的时序图 xff1a 空闲状态 当IIC总线的数据线SDA和时钟线SCL两条信号
  • ESP32/ESP8266 MQTT协议接入阿里云(一)

    ESP32 ESP8266 MQTT协议接入阿里云 xff08 一 xff09 1 搭建阿里云环境 xff08 1 xff09 跳转连接 xff1a https iot console aliyun com lk summary new x
  • ESP32/ESP8266 MQTT协议接入阿里云(二)

    ESP32 ESP8266 MQTT协议接入阿里云 xff08 二 xff09 1 在连接阿里云之前 xff0c 需要先了解MQTT的连接协议 CONNECT 协议格式 xff1a 固定包头 43 可变包头 43 有效载体 xff08 1
  • https是如何验证证书的有效性的

    证书验证的过程是使用非对称加密的 xff0c 客户端对服务器端发起请求 xff0c 服务器返回一个证书 xff0c 客户端验证这个证书的合法性 xff0c 如果这个证书是合法的 xff0c 那么就生成一个随机值 xff0c 利用这个随机值作
  • Kali Linux 更新源

    vi etc apt source list 添加下列更新源 中科大 deb http mirrors ustc edu cn kali kali rolling main non free contrib deb src http mir
  • 安装所有Kali 工具包

    apt get kali linux all
  • 路由选路三原则

    路由选路的三原则 最长掩码匹配原则AD值 Administrative Distance 通告距离 路由类型AD值Connect0Static1EIGRP Summary5EBGP20EIGRP 内部90OSPF110RIP120EIGRP
  • OSPF7种状态

  • CentOS 7 由原来的root@localhost~# 变成了-bash-4.2#

    发生这种原因可能是 root 目录下缺少了几个配置 bashrc 和 bash profile 进入 etc skel 目录下 将 bashrc 和 bash profile复制到 root 目录下 1 cp etc skel bashrc
  • Kali 中 dnsdict6 安装过程

    更新下载源 文件目录 etc apt source list 增加源deb http mirrors ustc edu cn kali kali rolling main non free contrib deb src http mirr
  • 在CentOS 7上搭建代理服务器(Socks 5)

    安装环境配置 1 yum install gcc 2 yum install openldap devel 3 yum install pam devel 4 yum install openssl devel 安装Socks 5 wget
  • Archlinux 安装教程 - 附详细图文(一)

    博主声明 xff1a 转载请在开头附加本文链接及作者信息 xff0c 并标记为转载 本文由博主 威威喵 原创 xff0c 请多支持与指教 本文首发于此 博主 xff1a 威威喵 博客主页 xff1a https blog csdn net
  • C语言实战——生产者消费者问题

    C语言实战 生产者消费者问题 方法摘要 生产者消费者共享缓冲区 xff0c 生产者向缓冲区中放数据 xff0c 消费者从缓冲取中取数据 xff0c 当缓冲区中被放满时 xff0c 生产者进程就必须进入挂起状态 xff0c 直到消费者从缓冲中

随机推荐