2017-05-04 156 views
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

不同之處在於,在第二個示例中,圖片僅由局部變量引用,該局部變量在函數結束時消失。垃圾收集在Tkinter中有點奇怪,因爲所有與GUI相關的對象都存在於Python控制之外的嵌入式Tcl解釋器中。

簡單的解決方案是添加一個像panel.image = pic這樣的行,以便只要控件本身就存在對圖像的引用。