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
相关产品推荐
相关产品推荐

