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

Tkinter调用.destroy()后TopLevel实例仍未关闭的问题

Tkinter TopLevel窗口关闭后实例未销毁的解决方案

问题:点击按钮创建TopLevel子窗口,关闭该窗口后,isinstance(secondWindow, SecondWindow)仍返回True,实例未被正确"清理",无法恢复初始的False状态。

问题根源

调用destroy()仅销毁了窗口的可视化组件,但全局变量secondWindow依然持有对原实例的引用,导致类型检查始终判定为SecondWindow实例。

修复方案

在onclosing方法中,销毁窗口后将全局变量secondWindow重置为None,切断对原实例的引用,这样后续的类型检查就会返回False。

修改后的代码:

import tkinter as tk

global secondWindow

class SecondWindow(tk.Toplevel):

    def __init__(self):
        super().__init__()

        self.geometry("250x250")
        self.title('second window')

        lab = tk.Label(self, text="exemple")
        lab.pack()

        self.protocol("WM_DELETE_WINDOW", self.onclosing)

    def onclosing(self) :
        global secondWindow
        # 销毁窗口UI
        self.destroy()
        # 重置全局变量,切断实例引用
        secondWindow = None



class MainWindow(tk.Tk) :

    def __init__(self):
        super().__init__()
        global secondWindow

        self.title('exemple')
        self.geometry('250x250')

        secondWindow = None

        self.button = tk.Button(self, text="create a new instance of Toplevel", command=self.button_clicked)

        self.button.pack()

        self.isIns()


    def button_clicked(self, *args) :
        global secondWindow
        secondWindow = SecondWindow()

    def isIns(self, *args) :
        global secondWindow

        print(isinstance(secondWindow, SecondWindow))

        self.after(500, self.isIns)


if __name__ == "__main__":
    app = MainWindow()
    app.mainloop()

说明

  • 关闭子窗口时,onclosing先调用self.destroy()销毁窗口的可视化元素,再将secondWindow设为None,此时原实例失去引用,会被Python垃圾回收机制处理。
  • 后续isIns方法中的isinstance(secondWindow, SecondWindow)会返回False,符合预期。

内容的提问来源于stack exchange,提问作者David01

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 04:56:10