わからないこと
tkinterのあるウィジェットを.destory()で削除した時、ウィンドウ上の該当ウィジェットは消えますが、リストや変数の中には参照が残っている場合、メモリは解放されないのでしょうか。下のソースコードにあるように、「remove」ボタンを押して1つのフレームを削除すると、その子ウィジェットであるラベルも一緒の表示されなくなります。しかし、リストには参照が残っているため、表示されなくなったオブジェクトはメモリ上に残り続けているようです。リストや変数による参照を無くせば、pythonのガベージコレクションによるメモリ開放の対象になり、自動的にメモリを解放してくれるのでしょうか。
かなり初歩的な質問かもしれませんが、アドバイスをお願いします。
該当のソースコード
Python
1import tkinter as tk 2 3def clickbt(): 4 global fs 5 global lbs 6 print('before destory-----') 7 print('fs') 8 show(fs) 9 print('lbs') 10 show(lbs) 11 f = fs[len(fs) - 1] 12 f.destroy() 13 print('after destory-----') 14 print('fs') 15 show(fs) 16 print('lbs') 17 show(lbs) 18 print(f'destroied f:{f}') 19 20def show(objs): 21 for i, obj in enumerate(objs): 22 print(f'i:{i}, obj:{obj}') 23 24root = tk.Tk() 25root.geometry('400x400') 26 27fs = [] 28lbs = [] 29fN = 3 30 31for i in range(fN): 32 f = tk.Frame(root) 33 f.pack(side=tk.TOP, fill=tk.BOTH, expand=True) 34 fs.append(f) 35 lb = tk.Label(f, text=f'label{i}') 36 lb.pack(side=tk.TOP, fill=tk.BOTH, expand=True) 37 lbs.append(lb) 38 39bt = tk.Button(root, text='remove', relief=tk.SUNKEN, command=clickbt) 40bt.pack(side=tk.TOP, fill=tk.X) 41 42root.mainloop() 43
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/09 09:55