我不明白毁灭的方式。。。在
我有一个类子窗口,它是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()
为什么子窗口有一个内部小部件却没有被销毁?在
由于Tkinter的实现方式,像顶层这样的小部件实际上是两个对象。它是python类的一个实例,它也是一个对象,从某种意义上说,它是底层Tk库可以理解的对象。在
我没有仔细研究过,但是我怀疑窗口的默认绑定是销毁小部件,而不是销毁python类实例。因此,顶层小部件被销毁,但是
Subwindow
的实例没有立即被销毁。或者更准确地说,它已经被摧毁,但还没有被垃圾收集。在当一个小部件被销毁时,它的所有子部件也将被销毁。我不太清楚为什么你认为标签没有被销毁,因为我没有看到任何代码实际上在检查标签小部件。为什么你认为标签没有被销毁?在
你所看到的只是垃圾收集器没有运行的证据。小部件已被销毁,但Tkinter包装仍然存在。在
修改
list_windows
以强制垃圾回收,您将看到该对象实际上已被销毁:相关问题 更多 >
编程相关推荐