こんにちは!学生講師の小木曽です。

今回はPythonの標準モジュールであるtkinterで起こった現象について書きます。
ちなみにPython3.6.1です。

まずはこのコードを実行してみましょう。
画像を1枚表示するだけのコードです。簡単ですね。

どうです…?まっさらなウィンドウが表示されましたよね!

え?画像はどこ行ったって?
GCに回収されて消えました。ばいばい。

GC。ガーベジコレクション。使用されていない(であろう)オブジェクトのメモリを解放します。
Pythonではオブジェクトの __del__ メソッド(デストラクタ)を呼びます。

今回は作ったはずの tk.PhotoImage のインスタンスへの参照がなくなった(っぽい)から回収されたみたいです。

検証します。
とりあえずこのコードを追加しましょう。(+が先頭に書いてあるものが追加したコードです)

高階関数を使ってるのは元の関数の機能を残したかったからで、それ以外に意図はありません。
これで tk.PhotoImage.__del__ が呼ばれると「GCこのやろう」と表示されるはずです。
検証終了。

グダグダ書きましたが。こう書けば問題はなかったのです。

tkinterを使う時は、下手に関数を書くと関数スコープ内でしか存在できなかったりするので、ちょっと複雑なことをしたい時はクラスを作った方が無難な気がします。(globalしてもいいけど。)

ちなみに

こんな感じで書くとうまく動かない。つらい。

クラスを使う場合はこんな感じで書きましょう。

みなさんもコーディング楽しみましょう!