You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:15:03