我有一個關於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