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

PySimpleGUI打开子窗口后主窗口无响应,按钮点击失效问题求助

问题原因与解决方案

问题根源

你的代码中,打开子窗口的win()函数使用了阻塞式的window.read()调用:当子窗口打开后,该函数会卡在自身的while循环里,直到子窗口关闭才会返回。这期间主窗口的事件循环(main()里的while循环)完全暂停,主窗口的按钮点击事件会被缓存,直到子窗口关闭后才会被一次性处理,因此看起来点击没有即时反应。

修复方案

要实现主窗口和子窗口同时响应事件,需要把所有窗口的事件处理统一放到主循环中,避免阻塞主线程。以下是修改后的代码:

import PySimpleGUI as sg

def create_sub_window():
    # 仅创建子窗口,不启动阻塞循环
    layout = [[sg.Text('Window')]]
    return sg.Window('Database Table View', layout, size=(500,500))

def main():
    layout = [[sg.Button('Get Hello', key='hello')],
              [sg.Button('Get Window', key='window')],
              [sg.Text('', key='text')]]

    main_window = sg.Window('Test', layout, size=(1000,500))
    sub_window = None  # 跟踪子窗口状态

    while True:
        # 同时监听所有打开窗口的事件
        window, event, values = sg.read_all_windows(timeout=100)

        # 处理窗口关闭事件
        if event == sg.WIN_CLOSED:
            if window == sub_window:
                sub_window.close()
                sub_window = None
            else:
                # 主窗口关闭时,先清理子窗口再退出
                if sub_window:
                    sub_window.close()
                break

        # 处理主窗口按钮事件
        if event == 'hello':
            main_window['text'].Update('Hello')
        elif event == 'window':
            main_window['text'].Update('')
            # 避免重复打开子窗口
            if not sub_window:
                sub_window = create_sub_window()

if __name__ == "__main__":
    main()

修改说明

  • 将原win()函数改为create_sub_window(),只负责创建子窗口,不启动阻塞循环
  • 使用sg.read_all_windows()替代主窗口的read(),同时监听主窗口和子窗口的事件,保证所有操作即时响应
  • 新增sub_window变量跟踪子窗口状态,避免重复打开,同时正确处理子窗口的关闭逻辑

内容的提问来源于stack exchange,提问作者Tom F.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:02:41