使用PySimpleGUI开发时Add按钮仅能正常工作一次是什么原因?
问题原因
add_window仅在程序启动时全局初始化了一次,第一次点击「Add」按钮完成提交后,你调用了add_window.close()将该窗口对象销毁,第二次点击「Add」时尝试对已销毁的窗口执行read()操作,自然无法正常响应。
修复方法
将add_window的创建逻辑移到-ADD-事件的处理分支中,每次点击「Add」都生成新的添加窗口,用完关闭即可,下次点击会重新创建新的窗口实例。
修正后代码如下:
# 你提前定义的添加窗口布局adicionar_layout保持原样即可,下方示例仅做参考 adicionar_layout = [ [sg.Text("请输入名称:")], [sg.Input(key='-INPUTADD-')], [sg.Button("提交", key='-SUBMIT-')] ] # 主窗口布局保持不变 layout = [ [sg.Text("Index")], [sg.Listbox(load_list(), size=(17,16), key='-LISTBOX-')], [sg.Button("Add", key='-ADD-'), sg.Button("Delete", key='-DELETE-')] ] window = sg.Window("Index", layout) # 事件循环 while True: event, values = window.read() if event is None: break if event == '-ADD-': # 每次点击Add都新建添加窗口,不要放到全局初始化 add_window = sg.Window('Add a name', adicionar_layout) add, input_val = add_window.read() if add == '-SUBMIT-': new_name = input_val.get('-INPUTADD-') with open('saved_names.txt', 'a') as f: f.write('\n' + new_name) window['-LISTBOX-'].update(load_list()) print(load_list()) # 不管是点提交还是直接关闭添加窗口,都销毁当前实例 add_window.close() window.close()
额外优化说明
- 原代码中
input是Python内置关键字,不要用作变量名避免冲突,上述代码已修改为input_val - PySimpleGUI更新元素的写法可以简化为
window['键名'].update(新值),和你原有Element写法效果完全一致
内容的提问来源于stack exchange,提问作者zezad
相关产品推荐
相关产品推荐

