如何根据sg.Combo选中项切换PySimpleGUI窗口并修复重复选择报错
问题修复方案
崩溃原因
- 你的
change_interfase函数没有显式返回创建的窗口对象,函数默认返回None,赋值给interface后,下一次循环调用interface.read()就会触发空对象报错。 - 该函数仅处理了2种模式的判断,剩余8种在
list_commands里的命令没有对应处理分支,选中这些选项时连窗口变量都不会创建,必然返回None。 - 开启
enable_events的Combo控件,选中和当前值相同的选项时也会触发事件,这时候你直接销毁了当前窗口,又没有生成有效新窗口,就会触发崩溃。
修复步骤
1. 补全界面切换函数的返回逻辑和分支处理
首先给change_interfase补全return语句,同时补充所有命令对应的布局分支(你需要自行补全剩余命令对应的布局定义,示例里只补充了返回逻辑):
def change_interfase(self, mode): if mode == COMMANDS.ADDITIONAL_ENGLISH: window = sg.Window('LTA (localization translator assistant)', INTERFACE.ADD_FILE_ENG) elif mode == COMMANDS.ADDITIONAL_RUSSIAN: window = sg.Window('LTA (localization translator assistant)', INTERFACE.ADD_FILE_RU) # 此处自行补充剩余8种COMMAND对应的窗口创建逻辑 # elif mode == COMMANDS.TRANSFER_FILE: # window = sg.Window(...) # ... 其他分支 else: # 兜底逻辑,避免未匹配到模式时返回None window = self.get_default_interface() # 必须返回创建的窗口对象 return window
2. 增加相同模式判断,避免无意义切换
在触发MODE事件时,先判断选中的新模式是否和当前模式一致,一致就跳过切换逻辑:
interface = work_with_interface.get_default_interface() # 新增变量记录当前生效的模式,和初始界面的Combo默认值保持一致即可 current_mode = COMMANDS.ADDITIONAL_ENGLISH while True: try: event, values = interface.read() if event in (None, 'Exit', 'Cancel'): break elif event =='MODE': new_mode = values['MODE'] # 新模式和当前模式一致就不处理 if new_mode == current_mode: continue interface.Close() interface = work_with_interface.change_interfase(new_mode) # 更新当前模式记录 current_mode = new_mode except Exception as e: # 可选增加异常捕获,避免直接崩溃,方便排查问题 print(f"运行错误: {e}")
3. 补全INTERFACE类的所有布局定义
你需要给剩下的8种命令分别定义对应的布局,添加到INTERFACE类中,和ADD_FILE_ENG、ADD_FILE_RU的格式保持一致即可,同时注意初始界面INTERFACE.DEFAULT里的Combo默认值要和current_mode的初始值对应。
内容的提问来源于stack exchange,提问作者Dima
相关产品推荐
相关产品推荐

