[英]how to destroy an object completely?
請幫助摧毀整個區域
import tkinter
import tkinter.messagebox
import sys
class TP(tkinter.Frame):
def __init__(self, parent):
tkinter.Frame.__init__(self, parent)
self.pack(side = 'top', fill = 'x', expand = 'yes')
self.parent = parent
self.make_menu_bar()
def make_menu_bar(self):
self.menubar = tkinter.Menu(self)
self.parent.config(menu = self.menubar)
self.file = tkinter.Menu(self.menubar)
self.file.add_command(label = 'New', command = lambda: self.toggle_area(True))
self.file.add_command(label = 'Close...', command = lambda: self.toggle_area(False))
self.menubar.add_cascade(label = 'File', menu = self.file)
def toggle_area(self, action):
if action:
self.area = tkinter.Text(self)
self.area.pack(expand = 'yes', fill = 'both')
print(sys.getrefcount(self.area))
else:
print(sys.getrefcount(self.area))
self.area.destroy()
print(sys.getrefcount(self.area))
if __name__ == '__main__':
root = tkinter.Tk()
TP(root)
root.mainloop()
問題是在選擇菜單項“關閉”后,屏幕上將顯示對對象self.area的引用數量。 對對象self.area的引用數仍不為0和2。即,該對象在內存中並且未進行垃圾回收
根據定義,如果您可以執行sys.getrefcount(someReferenceToAnObject)
則您仍然對某個對象有一些引用 ,因此引用計數不能為零。
話雖如此,垃圾回收永遠不會立即進行,因此該對象的實際回收可能會在以后進行。 您確實不應該為此擔心。 當您重新創建tkinter.Text
時,舊的可能已完全消失,可以進行垃圾收集。
話雖這么說,如果您想減少引用數量,您可能也想在銷毀它后再進行del self.area
。
首先,你不只是調用self.area.destroy()
而是從分離self.area
做del self.area
的self.area = None
。 這將刪除TP
實例中的引用。 但是, TP
可能很快就會被銷毀,因此這不是問題。 盡管這還不夠,但顯然, root
對象擁有對您的Text
對象的引用(可能不是直接引用)。
無論如何,沒有什么可擔心的。 在CPython(這是最廣泛使用的Python實現)中,垃圾回收的完成方式是立即刪除具有零引用計數器的對象。 但是,不能保證這種行為在任何地方都會發生。 即使沒有引用對象,對象也可能被刪除很多,而且要晚得多。 而且沒有強制立即銷毀的便攜式方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.