質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

ウィジェット

ウィジェットとはユーザインタフェイスの要素(GUI widget)であるか、もしくは、独立した比較的サイズの小さいソフトウェアアプリケーション(desktop widget)のことを指します。

Q&A

解決済

1回答

4840閲覧

tkinterウィジェットを.destory()で削除してもオブジェクトが残っている

yamatan

総合スコア8

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

ウィジェット

ウィジェットとはユーザインタフェイスの要素(GUI widget)であるか、もしくは、独立した比較的サイズの小さいソフトウェアアプリケーション(desktop widget)のことを指します。

0グッド

0クリップ

投稿2021/10/09 06:39

わからないこと

 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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

tkinterはPythonからTcl/Tk処理系を使うためのインタフェースモジュール(ラッパー)です。

公式ドキュメント Tk を用いたグラフィカルユーザインターフェイス

Pythonがtkinterをimportすると、Tcl/TkがPythonの動作しているプロセス空間にロードされます。Tcl/Tkは必要に応じOSにメモリを要求し、そのメモリ上で描画を行います。

また、PythonはTcl/Tkへのインタフェースとなるオブジェクトを生成し、それらはメモリを消費します。

destoryメソッドは、Tcl/Tkに対してそれに関連する処理を停止し、データが不必要であることを通知するものです。つまり、Tcl/Tkの使用しているメモリは解放されますが、Pythonが使用しているインタフェースオブジェクトのメモリは解放されません。

  • リストや変数による参照を無くせば、pythonのガベージコレクションによるメモリ開放の対象になり、自動的にメモリを解放してくれるのでしょうか。

はいそうなります。

ただし、destoryメソッドを使わない状態で、リストや変数による参照を無くした場合には、Tcl/Tkの使用しているメモリは解放されずに残ることに注意してください。

投稿2021/10/09 07:23

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yamatan

2021/10/09 09:55

ありがとうございます。 Tcl/Tkのメモリに関しては良く知らなかったので参考になりました。 メモリを解放したい変数はdestroy()実行後に参照を無くすようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問