[英]Why does this simple Tkinter code create two top-level windows?
考虑这个非常简单的代码片段:
import tkinter as tk
class GUI:
def __init__(self):
self.top_level_window = tk.Tk()
GUI()
GUI().top_level_window.mainloop()
它在我的屏幕上创建了两个顶级 windows。 为什么?
我以为第一个实例会立即被垃圾收集,这样我只会得到一个 window。我也尝试过稍微修改过的版本,我确信它会创建两个单独的对象,因此只有一个 window:
a=GUI()
b=GUI()
b.top_level_window.mainloop()
但是我错了。 我想不出一个理由。
有什么帮助吗?
你是说
GUI()
GUI().top_level_window.mainloop()
这是两个 windows 因为你像Frost Dream所说的那样调用了 class 两次所以你需要做的就是删除GUI()
import tkinter as tk
class GUI:
def __init__(self):
self.top_level_window = tk.Tk()
GUI().top_level_window.mainloop()
我认为对于tkinter
,框架本身会保留您创建的 GUI 对象的实例。 这会破坏您可能认为会发生的任何垃圾回收。
您需要对任何您希望 tkinter 忘记的元素调用.destroy()
。
我以为第一个实例会立即被垃圾收集
作为GUI
实例的 python object 被垃圾收集。 但是,tkinter 在嵌入式 tcl 解释器内部创建对象,而 tcl 解释器对 python 对象一无所知。 因此,虽然 object 从 python 中删除,但小部件仍然存在于 tcl 解释器中。
换句话说,python object 的垃圾收集并不能保证底层的 tcl object 被删除。 如果要销毁第一个 window,则必须对该实例调用destroy()
。
因为你打了两次class。
GUI()
GUI().top_level_window.mainloop()
>>>
GUI().top_level_window.mainloop()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.