You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免使用PySimpleGUI创建的窗口执行任务时出现无响应问题

问题原因

你当前的窗口无响应是因为q.get()是阻塞调用:队列中没有消息时,主线程(GUI线程)会一直卡在等待队列返回的状态,无法处理窗口重绘、用户交互等GUI事件,最终表现为窗口无响应。

非OOP的可行修改方案

不需要改整体逻辑,只需要把原来的死循环替换为PySimpleGUI自带的带超时的窗口读取逻辑,既可以轮询队列进度,又能保证GUI线程正常响应事件:

修改后的代码片段

elif event == "Parse":
    if layout == 1:
        q = queue.Queue()
        layout = [[GUI.Text('Parsing...')],
                  [GUI.ProgressBar(1, orientation='h', size=(20, 20), key='progressbar', bar_color = ('navy','white'))]]
        window1 = GUI.Window('Progress', layout).Finalize()
        progress_bar = window1['progressbar']
        
        t1 = threading.Thread(target=ParseTSLogs, daemon=True, args = (q,))
        t1.start()

        temp = 0
        # 替换原来的阻塞循环
        while True:
            # 每100毫秒检查一次窗口事件和队列状态,不会阻塞GUI
            event, _ = window1.read(timeout=100)
            # 处理用户手动关闭进度窗口的场景
            if event == GUI.WIN_CLOSED:
                break
            # 队列非空时才读取进度,避免阻塞
            if not q.empty():
                temp = q.get()
                progress_bar.UpdateBar(temp, 3)
                # 进度完成后退出循环
                if temp == 3:
                    break
        window1.close()

注意事项

  • 确保你的ParseTSLogs函数会按执行进度依次把进度值1/2/3put到队列中,必须要put3才能让循环自动退出
  • 超时时间(代码中的100,单位毫秒)可以自行调整,值越小进度更新越灵敏,CPU占用越高,100-200毫秒是比较平衡的选择

内容的提问来源于stack exchange,提问作者Enver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 04:45:01