我有一个关于Python中的内存管理的问题,具体涉及到使用Tkinter的程序。首先我将以一个例子来展示我测试一些简单的内存管理:内存管理和Tkinter
import tkinter as tk
from tkinter import ttk
class Frame1(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
self.pack()
print("Frame1 created")
btn = ttk.Button(self, text = "PRESS", command = self.openFrame2)
btn.pack()
def __del__(self):
print("Frame1 destroyed")
def openFrame2(self):
self.pack_forget()
self.destroy()
frame2 = Frame2(self.parent)
class Frame2(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
self.pack()
print("Frame2 created")
btn = ttk.Button(self, text = "CLICK", command = self.openFrame1)
btn.pack()
def __del__(self):
print("Frame2 destroyed")
def openFrame1(self):
self.pack_forget
self.destroy()
frame1 = Frame1(self.parent)
root = tk.Tk()
program = Frame1(root)
root.mainloop()
这个程序的目标很简单。用一个按钮创建一个包含Frame的Tkinter窗口。按下该按钮时,删除该帧,释放由该帧使用的内存,并创建一个不同的帧。
如果我按在PRESS -> CLICK -> PRESS
我的预期结果的顺序按一下按钮是:
Frame1 created
PRESS:
Frame1 destroyed
Frame2 created
CLICK:
Frame2 destroyed
Frame1 created
PRESS:
Frame1 destroyed
Frame2 created
而不是我的实际结果是:
Frame1 created
PRESS:
Frame2 created
CLICK:
Frame1 created
Frame2 destroyed
PRESS:
Frame2 created
Frame1 destroyed
我有点困惑在这里。 Frame2
似乎正确呼叫__del__
方法时,我呼吁self.destroy()
但Frame1
不。为什么是这样?
Python不保证何时(或甚至)是否调用'__del __()',它不是C++。最好忘记尝试使用它来做到这一点。而是考虑在派生类中重载'destroy()'。 – martineau
FWIW:这什么都不做:'self.pack_forget'。即使你正确地调用了它('self.pack_forget()'),你之后立即删除这个小部件也是没有意义的。 –
你看,这就是我的困惑,因为我是Python的新手,但知道C++。一个更好的选择是创建一个手动的'destroyMe'方法,该方法可以彻底删除对象正在使用的所有东西? – Skitzafreak