PySimpleGUI技术疑问:为何事件循环中无法检测窗口关闭事件?
问题原因及解决办法
你的代码不是不能存在多个事件检查,而是处理逻辑有两个关键问题:
- 执行
window.close()后没有终止while循环,下一次调用window.read()时,窗口已经关闭,会直接抛出异常,导致程序崩溃,看起来像是关闭事件没生效。 - 没处理
Quit按钮的事件,点击Quit也不会触发窗口关闭。
另外,event == None是旧版本PySimpleGUI的写法,新版本里关闭窗口的事件统一用sg.WINDOW_CLOSED,可以不用再判断None。
修正后的代码
import PySimpleGUI as sg # Define the window's contents layout = [[sg.Text("What's your name?")], [sg.Input(key='-INPUT-')], [sg.Text(size=(40,1), key='-OUTPUT-')], [sg.Button('Ok'), sg.Button('Quit')]] # Create the window window = sg.Window('Window Title', layout) # Display and interact with the Window using an Event Loop while True: event, values = window.read() # 先处理退出类事件:关闭窗口或点击Quit if event == sg.WINDOW_CLOSED or event == 'Quit': print(event) break # 终止循环,避免后续执行window.read() # 再处理Ok按钮事件 if event == 'Ok': print(event) window['-OUTPUT-'].update('Hello ' + values['-INPUT-'] + "!") # 循环结束后统一关闭窗口 window.close()
关键修改点
- 把退出类事件的判断放在前面,触发后用
break终止while循环,避免窗口关闭后仍执行window.read()引发异常 - 将窗口关闭操作移到循环外面,统一处理,逻辑更清晰
- 新增
Quit按钮的事件处理,匹配界面设计逻辑 - 去掉冗余的
event == None判断,适配新版本PySimpleGUI
内容的提问来源于stack exchange,提问作者Kurt
相关产品推荐
相关产品推荐

