PySimpleGUI触发sg.WIN_CLOSED事件无法读取输入框内容如何解决
问题原因
- PySimpleGUI 的
window.read()方法在触发sg.WIN_CLOSED事件(用户点击窗口右上角关闭按钮)时,返回的values为None,而非正常交互事件返回的控件值字典,因此直接对values执行下标取值操作就会抛出'NoneType' object is not subscribable错误。 -SAVEAS-属于窗口内正常交互事件,此时values是完整的控件键值对字典,所以取值逻辑正常。
解决方法
有两种常用修复方案,可按需选择:
方案1:拆分事件分支分别处理
将窗口关闭事件和EXIT按钮点击事件拆分判断,避免混用values的场景:
#create Window window = sg.Window('Digispark BADUSB Script Creator', layout, size=(1500, 500)) #Eventloop while True: event, values = window.read() # 单独处理窗口右上角关闭事件 if event == sg.WIN_CLOSED: # 直接通过控件实例获取值,不依赖values字典 path = window['-PATH-'].get() filename = window['-FILENAME-'].get() # 此处添加写入配置文件的逻辑 break # 处理EXIT按钮点击事件,此时values为有效字典 if event == 'EXIT': path = values['-PATH-'] filename = values['-FILENAME-'] # 此处添加写入配置文件的逻辑 break if event == '-SAVEAS-': codeText = values['textbox'] completeText = textBegin + codeText +textEnd filename = values['-FILENAME-'] path = values['-PATH-'] if len(filename) == 0 or len(path) == 0: errorPopup('Filename or Path empty! Go to SETTINGS-TAB!') else: try: destination = path + filename file1 = open(destination, 'w') file1.write(completeText) file1.close() except: errorPopup("Invalid Path! Change Settings") window.close()
方案2:统一通过控件实例取值
无论触发哪种关闭事件,都直接从窗口的控件实例中读取值,完全规避values为空的问题:
if event == 'EXIT' or event == sg.WIN_CLOSED: # 直接调用控件的get方法取值,不受values是否为空影响 save_path = window['-PATH-'].get() save_filename = window['-FILENAME-'].get() # 此处添加写入配置文件的逻辑 break
优化建议
- 拼接路径和文件名时建议使用
os.path.join(save_path, save_filename),避免不同操作系统路径分隔符不兼容的问题。 - 写文件操作建议使用
with语法,自动处理文件资源关闭,避免异常场景下的资源泄漏。
内容的提问来源于stack exchange,提问作者0szi
相关产品推荐
相关产品推荐

