毁灭不会毁灭

时间:2012-11-22 16:26:17

标签: python tkinter

我不明白毁灭的方式......

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

  

self.label = Tk.Label(master = self,text ='这是子窗口:   %S !!!!'%自我)

当我破坏子窗口时,它不会死,它会活着(我知道这看着子窗口的数组)

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

  

del self.label

在destroy方法中。

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()

为什么子窗口有内部窗口小部件时不会被销毁?

1 个答案:

答案 0 :(得分:1)

由于Tkinter的实现方式,诸如顶层之类的小部件实际上是两个对象。它是python类的一个实例,它也是一个对象,因为它是底层Tk库理解的东西。

我没有密切关注,但我怀疑窗口的默认绑定是销毁小部件而不是销毁python类实例。因此,toplevel小部件被销毁,但Subwindow的实例不会立即销毁。或者更确切地说,它已被破坏但尚未收集垃圾。

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

您所看到的仅仅是垃圾收集器未运行的证据。小部件已被破坏,但Tkinter包装器仍然存在。

修改list_windows以强制进行垃圾收集,你会发现该对象确实被破坏了:

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