2017-05-04 65 views
2

イメージをウィンドウに表示しようとしています。私はクラスと単一スニペットを使って2つの方法を試しました。 これが正しい出力表示される理由を、私は混乱しています:Tkinterウィンドウにイメージが表示されない

from Tkinter import * 
from PIL import ImageTk, Image 

root = Tk() 
picture="path/image.jpg" 
image = Image.open(picture).resize((350, 350), Image.ANTIALIAS) 
print(image) 
pic = ImageTk.PhotoImage(image) 
panel = Label(root, image = pic) 
panel.grid(sticky="news") 
root.mainloop() 

ではなく、以下のものを?

from Tkinter import * 
from PIL import ImageTk, Image 

class DisplayImage(): 

    def __init__(self, root): 
     self.root = root 

    def stoneImg(self, picture="path/default_image.png"): 
     image = Image.open(picture).resize((350, 350), Image.ANTIALIAS) 
     pic = ImageTk.PhotoImage(image) 

     panel = Label(self.root, image=pic) 
     panel.grid(sticky="news") 

if __name__ == '__main__': 
    root = Tk() 
    DisplayImage(root).stoneImg() 
    root.mainloop() 

答えて

3

違いは、2番目の例では、ピクチャがローカル変数によってのみ参照されていて、関数の最後に移動してしまったことです。ガーベジコレクションはTkinterではちょっと変わって動作します。GUI関連のオブジェクトはすべて、Pythonのコントロールの外にある埋め込みTclインタプリタに存在するからです。

単純な解決策は、panel.image = picのような行を追加することです。そのため、イメージへの参照は、ウィジェット自体が行う限り存在します。

関連する問題