这个问题我也遇到过,就是还需要一个while循环的时候,放到gui本身循环会卡死,这时候就需要启动多线程

需要“长时间”的操作

如果您是 Windows 用户,您会在其标题栏中看到窗口显示“未响应”,然后很快会出现一个 Windows 弹出窗口,指出“您的程序已停止响应”。好吧,如果您愿意,您也可以使该消息和弹出窗口出现!您需要做的就是在您的事件循环中执行一个花费“太长”(即几秒钟)的操作。

你有几个选择来处理这个问题。如果您的操作可以分解成更小的部分,那么您可以Window.Refresh()偶尔调用以避免出现此消息。例如,如果您正在运行一个循环,请将该调用与您的其他工作一起放入。这将使 GUI 保持快乐,Window 不会抱怨。

另一方面,如果您的操作不受您的控制,或者您无法添加Refresh调用,那么您可以使用的下一个选项是将您的长操作移动到一个线程中。

“老路”

有几个演示程序可供您查看如何执行此操作。你基本上把你的工作放到一个线程中。当线程完成时,它通过队列发送消息来告诉 GUI。事件循环将运行一个计时器,该计时器设置为一个值,该值表示您希望您的 GUI 对工作完成的“响应”程度。

“新方式”—— Window.write_event_value

这个截至 2020 年 7 月目前仅在 tkinter 端口中可用的新功能令人兴奋,它代表了在 PySimpleGUI 中处理多线程的未来方式(或者希望如此)。

以前,使用队列,您的事件循环将轮询来自线程的传入消息。

现在,线程可以直接将事件注入到 Window 中,以便它显示在window.read()调用中。这允许您的事件循环“挂起”,等待正常的窗口事件以及线程生成的事件。

您可以在此演示中看到此新功能的实际效果:Demo_Multithreaded_Write_Event_Value.py

这是您的检查和教育计划。不再轮询线程事件真是太好了。

import threading
import time
import PySimpleGUI as sg """
Threaded Demo - Uses Window.write_event_value communications Requires PySimpleGUI.py version 4.25.0 and later This is a really important demo to understand if you're going to be using multithreading in PySimpleGUI. Older mechanisms for multi-threading in PySimpleGUI relied on polling of a queue. The management of a communications
queue is now performed internally to PySimpleGUI. The importance of using the new window.write_event_value call cannot be emphasized enough. It will hav a HUGE impact, in
a positive way, on your code to move to this mechanism as your code will simply "pend" waiting for an event rather than polling. Copyright 2020 PySimpleGUI.org
""" THREAD_EVENT = '-THREAD-' cp = sg.cprint def the_thread(window):
"""
The thread that communicates with the application through the window's events. Once a second wakes and sends a new event and associated value to the window
"""
i = 0
while True:
time.sleep(1)
window.write_event_value('-THREAD-', (threading.current_thread().name, i)) # Data sent is a tuple of thread name and counter
cp('This is cheating from the thread', c='white on green')
i += 1 def main():
"""
The demo will display in the multiline info about the event and values dictionary as it is being
returned from window.read()
Every time "Start" is clicked a new thread is started
Try clicking "Dummy" to see that the window is active while the thread stuff is happening in the background
""" layout = [ [sg.Text('Output Area - cprint\'s route to here', font='Any 15')],
[sg.Multiline(size=(65,20), key='-ML-', autoscroll=True, reroute_stdout=True, write_only=True, reroute_cprint=True)],
[sg.T('Input so you can see data in your dictionary')],
[sg.Input(key='-IN-', size=(30,1))],
[sg.B('Start A Thread'), sg.B('Dummy'), sg.Button('Exit')] ] window = sg.Window('Window Title', layout, finalize=True) while True: # Event Loop
event, values = window.read()
cp(event, values)
if event == sg.WIN_CLOSED or event == 'Exit':
break
if event.startswith('Start'):
threading.Thread(target=the_thread, args=(window,), daemon=True).start()
if event == THREAD_EVENT:
cp(f'Data from the thread ', colors='white on purple', end='')
cp(f'{values[THREAD_EVENT]}', colors='white on red')
window.close() if __name__ == '__main__':
main()

多线程程序

在讨论多线程主题时,准备了另一个演示,展示了如何在程序中运行多个线程,这些线程都与事件循环通信,以便在 GUI 窗口中显示某些内容。回想一下,对于 PySimpleGUI(至少是 tkinter 端口),您不能在主程序线程以外的线程中进行 PySimpleGUI 调用。

这些线程程序的关键是从线程到事件循环的通信。为这些演示选择的机制使用 Python 内置queue模块。事件循环轮询这些队列以查看是否从要显示的线程之一发送了某些内容。

您会发现显示多个线程与单个 GUI 通信的演示被称为:

Demo_Multithreaded_Queued.py

对于普通的 PySimpleGUI(基于 tkinter)再次发出警告- 您的 GUI 绝不能作为除主程序线程之外的任何东西运行,并且没有线程可以直接调用 PySimpleGUI 调用

pysimplegui之使用多线程,避免程序卡死的更多相关文章

  1. C#多线程解决界面卡死问题的完美解决方案

    C#多线程解决界面卡死问题的完美解决方案 文章转自http://www.sufeinet.com/thread-3556-1-1.html 问题描述: 当我们的界面需要在程序运行中不断更新数据时, 当 ...

  2. C#多线程解决界面卡死问题

    C#多线程解决界面卡死问题的完美解决方案 文章下最方有源码下载 问题描述:当我们的界面需要在程序运行中不断更新数据时, 当一个textbox的数据需要变化时, 对于这个问题可以先参考下我的另外一个文章 ...

  3. [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(三) 利用多线程提高程序性能(下)

    [.net 面向对象程序设计进阶] (18) 多线程(Multithreading)(二) 利用多线程提高程序性能(下) 本节导读: 上节说了线程同步中使用线程锁和线程通知的方式来处理资源共享问题,这 ...

  4. [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中)

    [.net 面向对象程序设计进阶] (17) 多线程(Multithreading)(二) 利用多线程提高程序性能(中) 本节要点: 上节介绍了多线程的基本使用方法和基本应用示例,本节深入介绍.NET ...

  5. [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上)

    [.net 面向对象程序设计进阶] (16) 多线程(Multithreading)(一) 利用多线程提高程序性能(上) 本节导读: 随着硬件和网络的高速发展,为多线程(Multithreading) ...

  6. posix 线程(一):线程模型、pthread 系列函数 和 简单多线程服务器端程序

    posix 线程(一):线程模型.pthread 系列函数 和 简单多线程服务器端程序 一.线程有3种模型,分别是N:1用户线程模型,1:1核心线程模型和N:M混合线程模型,posix thread属 ...

  7. ctrl+c关闭多线程python程序

    项目中经常需要用到多线程,如果一个python程序用了多线程,当子线程没有结束时,用ctrl+c是关闭不了主线程的,这时候就只能用kill命令杀掉,这样会很麻烦. 所以探讨了下怎么ctrl+C关闭多线 ...

  8. java Socket多线程聊天程序

    参考JAVA 通过 Socket 实现 TCP 编程 参考java Socket多线程聊天程序(适合初学者) 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包 ...

  9. FreeRTOS 启动进程调度后,程序卡死的部分原因分析。

    现象:1,RTOS  使用时 系统卡启动文件               B       .处. 原因分析:该种情况是由于定义开启了中断,但是未开启中断处理服务.程序执行到中断响应式无对应的程序响应 ...

  10. 解决Protege打开owl文件时程序卡死问题

    Protege在打开本地owl文件时,程序卡死,而且在终端或是命令行中也没有报错.这是因为存放该本体的文件夹下面有很多其他的文件,只需要创建一个新的文件夹并把owl文件放入其中就可以解决该问题.

随机推荐

  1. 按list大小进行分组

    package cn.tk.netcore.rest;import java.util.ArrayList;import java.util.Arrays;import java.util.List; ...

  2. 艾思最新案例分享:塔蓝物流app-物流仓储管理系统app. app开发

    塔蓝物流app是一款物流仓储管理app:主要业务范围空运,海运,进出口货物及过境货物的运输代理,包括揽物订舱,仓储(危险品除外),包装,搬运装卸,中转,流通加工,集装箱拼装拆箱(危险品除外),结算运杂 ...

  3. break跳出循环

  4. mysql创建函数时提示1418。可选关闭二进制日志或者设置log_bin_trust_function_creators=1

    报错详情如下:1418--This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration a ...

  5. 第二章 excel的快捷键操作

    本章介绍excel中部分常用的快捷键 1.文件类 工作簿操作:Ctrl + N 新建:Ctrl + w 关闭当前:Ctrl + S 保存 F12 当前另存为 Ctrl + p 打印当前 2.通用类 C ...

  6. ubuntu 16.04 安装VNC远程桌面 安装wine+hfs

    1.安装$sudo apt-get install xfce4 $sudo apt-get install vnc4server$sudo apt-get install xrdp 2.启动VNC s ...

  7. 导出生成word

    用XML做就很简单了.Word从2003开始支持XML格式,大致的思路是先用office2003或者2007编辑好word的样式,然后另存为xml,将xml翻译为FreeMarker模板(后缀为.ft ...

  8. linux查看mac地址

    1. ip addr show (ip address show .ip addr ) 查看本机ip和额外的一些信息 2.ifconfig -a  其中 HWaddr 就是mac地址 3.cat /s ...

  9. VUE配置proxy代理、开发环境、测试环境、生产环境

    VUE配置proxy代理.开发环境.测试环境.生产环境 前端开发过程中,我们经常会碰到跨域的问题,下面我们来配置下,不同的环境下,统一的跨域问题解决. 1.根目录下新建三个环境的配置文件,.env.d ...

  10. 接口自动化之request几种常见请求及响应方法

    request 的几种常见方法 1.request.get() 发送get请求 2.request.post() 发送post请求 3.request.delete() 发送delete请求 4.re ...