Sou*_*ini 3 python tkinter python-2.7
我正在尝试在窗口中显示图像。我尝试了两种方法,使用类和单个片段。我很困惑为什么这会显示正确的输出:
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()
Run Code Online (Sandbox Code Playgroud)
但不是下面的?
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()
Run Code Online (Sandbox Code Playgroud)
不同之处在于,在您的第二个示例中,图片仅由局部变量引用,该变量在函数结束时消失。垃圾收集在 Tkinter 中的工作有点奇怪,因为所有与 GUI 相关的对象都存在于嵌入式 Tcl 解释器中,不受 Python 控制。
简单的解决方案是添加类似 的行panel.image = pic,这样只要小部件本身存在,就存在对图像的引用。