如何使用OOP枕头在tkinter中显示图像

问题描述 投票:0回答:1

我正在制作一个程序,我需要在某个时刻按下一个按钮将图像显示在一个框架上。我使用面向对象的方法,但它不会显示图像。如果我这样做:

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()

当我按下按钮时,它会扩展窗口,就像它试图显示图像一样,但没有任何显示它只是变成一个更宽的窗口。那么我做错了什么?

先感谢您!

python tkinter python-imaging-library
1个回答
0
投票

由于图片是在函数中创建的,因此当函数退出时,参考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()
© www.soinside.com 2019 - 2024. All rights reserved.