2017-05-04 158 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这样的行,以便只要控件本身就存在对图像的引用。