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.
相关产品推荐
相关产品推荐

