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()
このプログラムの目標は簡単です。ボタン付きフレームを含む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
は、私がself.destroy()
に電話すると__del__
メソッドを正しく呼び出すようですが、Frame1
は呼び出されません。どうしてこれなの?
Pythonは '__del __()'が呼び出されるかどうか(またはそれがC++ではない)を保証しません。これを行うためにそれを使用しようとすることを忘れて最高です。代わりに、派生クラスで 'destroy()'のオーバーロードについて考えてみてください。 – martineau
FWIW:これは何もしません: 'self.pack_forget'。あなたが正しく呼び出されたとしても( 'self.pack_forget()')、直後にウィジェットを削除するので意味がありません。 –
あなたはそれが私が混乱していることを知っています。なぜなら、私はPythonの新しさですが、C++を知っているからです。より良いオプションは、オブジェクトが手動で使用しているすべてのものを削除し、削除する手動のdestroyMeメソッドを作成することでしょうか? – Skitzafreak