Tkinter PhotoImageの参照の寿命について
PhotoImageでボタンの画像を作成しているコードにて、べた書きからクラス形式に変更したところ、画像が表示されなくなった。
どうもこういうことらしい。
Python 2.7 - [tkinter]canvasの写真を更新したい|teratail
import tkinter as tk class MyWidget(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) frame1 = tk.Frame(self) imageicon = tk.PhotoImage(file='button.png') button = tk.Button(frame1, image=imageicon) button.pack() frame1.pack() root = MyWidget() root.mainloop()
→画像が表示されず、ボタンも反応しない
import tkinter as tk class MyWidget(tk.Tk): def __init__(self, *args, **kwargs): tk.Tk.__init__(self, *args, **kwargs) frame1 = tk.Frame(self) self.imageicon = tk.PhotoImage(file='button.png') button = tk.Button(frame1, image=self.imageicon) button.pack() frame1.pack() root = MyWidget() root.mainloop()
imageiconの参照をselfで持つことによって、rootが死なない限り破棄されなくなった模様
純粋なオブジェクト指向じゃない?ようなので、こういう仕様は恐ろしい・・・構文エラーでも実行時エラーでもなく、単に期待した動作をしない。
将来的にはリリース前にテストを通すかもしれないけど、これはスルーするかもしれない・・・。