我正在制作一个程序,我需要在某个时候按下按钮将图像显示到框架上。我正在使用面向对象的方法,但它不会显示图像。如果我做这样的事情:
from tkinter import *
from PIL import Image, ImageTk
root = Tk()
pic = Image.open("image.jpg")
tkpic = ImageTk.PhotoImage(pic)
label = Label(root, image=tkpic)
label.pack()
root.mainloop()
这工作正常。但是,如果我创建一个框架并尝试像这样显示图片:
from tkinter import *
from PIL import Image, ImageTk
class picframe(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
button = Button(self, text="show", command=self.showpic)
button.pack()
def showpic(self):
pic = Image.open("image.jpg")
tkpic = ImageTk.PhotoImage(pic)
label = Label(self, image=tkpic)
label.pack()
root = Tk()
frame = picframe(root)
frame.pack()
root.mainloop()
当我按下按钮时,它会扩展窗口,就好像它试图显示图像一样,但没有任何显示,它只是变成了一个更宽的窗口。那么我做错了什么?
先感谢您!
由于图片是在函数中创建的,tkpic
当函数退出时,引用将被垃圾收集。您需要保存对图像的引用:
def showpic(self):
pic = Image.open("image.jpg")
tkpic = ImageTk.PhotoImage(pic)
label = Label(self, image=tkpic)
label.image = tkpic # Save reference to image
label.pack()
或者,您可以通过将其设置为实例变量来确保图像引用的持久性:
def showpic(self):
pic = Image.open("images/beer.png")
self.tkpic = ImageTk.PhotoImage(pic)
label = Label(self, image=self.tkpic)
label.pack()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句