繁体   English   中英

为什么这个简单的 Tkinter 代码会创建两个顶级 windows?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM