毁灭不毁灭

2024-06-08 01:26:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我不明白毁灭的方式。。。在

我有一个类子窗口,它是Tk.顶层 如果此子窗口有内部小部件

self.label = Tk.Label(master=self, text='This is Sub Window: %s!!!!'%self)

当我摧毁子窗口时,它不会死,它仍然活着(我知道这是从子窗口阵列中看到的)

销毁子窗口的唯一方法是调用

del self.label

在销毁方法中。在

import Tkinter as Tk
import weakref

root = Tk.Tk()
subwindows = []


def subwindow():
    subwindows.append(weakref.ref(SubWindow(root)))

def list_subwindows():
    print 'Subwindows: ',
    for subwindow in subwindows:
        sw = subwindow()
        if sw:
            print sw,
    print ''


class SubWindow(Tk.Toplevel):
    def __init__(self, window):
        Tk.Toplevel.__init__(self, master = window)
        self.label = Tk.Label(master=self, text='This is Sub Window: %s!!!!'%self)
        self.label.pack()
#        self.bind('<Destroy>', self._destroy)


    def _destroy(self, event):
        try:
            del self.label 
        except:
            pass


bStartWindow = Tk.Button(master=root, text='Start Sub Window', 
                         command=subwindow)
bStartWindow.pack()

bListSubwindows = Tk.Button(master=root, text='List Active subwindows',
                            command = list_subwindows)
bListSubwindows.pack()

root.mainloop()

为什么子窗口有一个内部小部件却没有被销毁?在


Tags: textselfmaster部件defrootswwindow
1条回答
网友
1楼 · 发布于 2024-06-08 01:26:50

由于Tkinter的实现方式,像顶层这样的小部件实际上是两个对象。它是python类的一个实例,它也是一个对象,从某种意义上说,它是底层Tk库可以理解的对象。在

我没有仔细研究过,但是我怀疑窗口的默认绑定是销毁小部件,而不是销毁python类实例。因此,顶层小部件被销毁,但是Subwindow的实例没有立即被销毁。或者更准确地说,它已经被摧毁,但还没有被垃圾收集。在

当一个小部件被销毁时,它的所有子部件也将被销毁。我不太清楚为什么你认为标签没有被销毁,因为我没有看到任何代码实际上在检查标签小部件。为什么你认为标签没有被销毁?在

你所看到的只是垃圾收集器没有运行的证据。小部件已被销毁,但Tkinter包装仍然存在。在

修改list_windows以强制垃圾回收,您将看到该对象实际上已被销毁:

def list_subwindows():
    import gc
    gc.collect()
    print 'Subwindows: ',
    for subwindow in subwindows:
        sw = subwindow()
        if sw:
            print sw,
    print ''

相关问题 更多 >

    热门问题