Tkinter开发Flag Quiz:打开新窗口后销毁旧窗口及程序完全退出问题咨询
解决方法
问题核心原因
你的TitleScreen是tkinter的根窗口(继承自tk.Tk),使用self.withdraw()只是隐藏了窗口,根窗口的主循环仍然在后台运行,所以关闭子窗口后程序不会终止。
你之前尝试将
self.withdraw()替换为self.destroy()会出现空白窗口,是因为EasyApp和HardApp继承自tk.Toplevel,Toplevel必须依附根窗口运行,根窗口被销毁后Toplevel会自动创建一个新的空白根窗口,所以会出现你遇到的问题。
具体修改步骤
步骤1:修改EasyApp和HardApp的初始化逻辑
给EasyApp的__init__方法新增master参数接收主窗口引用,同时绑定窗口关闭事件的回调函数,HardApp做完全相同的修改即可:
class EasyApp(tk.Toplevel): # 新增master参数 def __init__(self, master): super().__init__(master=master) # 保存主窗口引用 self.master = master # 绑定窗口关闭事件的自定义回调 self.protocol("WM_DELETE_WINDOW", self.on_close) # 原有初始化代码保持不变 self.title('Flag Quiz') self.geometry('') self.resizable(0,0) self.score = 0 self.create_widgets() # 新增关闭回调方法 def on_close(self): # 销毁当前子窗口 self.destroy() # 销毁根主窗口,直接终止整个程序 self.master.destroy()
步骤2:修改mainmenu中打开子窗口的逻辑
打开EasyApp和HardApp的时候把当前主窗口实例传入即可:
def play_easy(self): self.withdraw() # 传入当前主窗口实例作为master self.app = EasyApp(self) def play_hard(self): self.withdraw() # 传入当前主窗口实例作为master self.app = HardApp(self)
拓展说明
如果后续你需要实现「关闭子窗口后回到主菜单」的逻辑,只需要把on_close方法里的self.master.destroy()改成self.master.deiconify()就可以恢复显示主菜单窗口。
内容的提问来源于stack exchange,提问作者adama
相关产品推荐
相关产品推荐

