Skip to main content
 首页 » 编程设计

python之为什么 Tkinter Toplevel 对象被销毁

2025年05月04日11lyhabc

在下面的代码中,tk 不是由函数 launch() 创建的 Toplevel 对象的父对象。但是,当我使用 tk.destroy() 销毁 tk 时,Toplevel 窗口消失了。

Toplevel 寡妇是否被摧毁?如果是这样,如何调用 Toplevel.destroy()?

from tkinter import * 
 
 
def launch(): 
    Toplevel() 
 
tk = Tk() 
 
frame = Frame(tk, relief="ridge", borderwidth=2) 
frame.pack(fill="both", expand=1) 
label = Label(frame, text="Hello, World") 
label.pack(fill=X, expand=1) 
 
button1 = Button(frame, text="Exit", command=tk.destroy) 
button2 = Button(frame, text="Launch", command=launch) 
 
button1.pack(side="bottom") 
button2.pack(side="bottom") 
 
tk.mainloop() 

请您参考如下方法:

让您的应用程序保持运行的是 Tk 实例的主循环,它是所有小部件的父级。当你销毁它时,所有的小部件也会被销毁。


请记住,对于每个 Tk 实例,都有一个关联的 Tcl 解释器,我将尝试根据tkinter 模块的 Tk 和相关类和方法。

Tk 派生自 2 个类:Misc 和 Wm。在 Misc 类中,您可以找到quit 方法的接口(interface)和文档:

def quit(self): 
    """Quit the Tcl interpreter. All widgets will be destroyed.""" 
    self.tk.quit() 

在Tk类的destroy方法下可以找到:

def destroy(self): 
    """Destroy this and all descendants widgets. This will 
    end the application of this Tcl interpreter.""" 

Tk 类中的destroy 方法在某些时候还会调用Misc 的destroy 方法> 类,在那里你还可以找到另一个文档:

def destroy(self): 
    """Internal function. 
    Delete all Tcl commands created for 
    this widget in the Tcl interpreter.""" 

这并不是说 Tcl 解释器也停止了(就像上面描述的 quit 方法)。

构造Tk实例时,会调用一个名为_loadtk的方法。在这个方法中,设置了Tk窗口关闭时的protocol:

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

如您所见,destroy(而不是quit)与窗口的关闭事件相关联。


这一切意味着当您关闭窗口时,Tk 实例及其所有子实例都会被销毁,但 Tcl 解释器不会停止。