Как показать изображение в ткинтере с помощью подушки с ООП - PullRequest
0 голосов
/ 11 апреля 2019

Я делаю программу, в которой мне нужно в какой-то момент отобразить изображение в кадре одним нажатием кнопки.Я использую объектно-ориентированный подход, но он не будет отображать изображение.Если я сделаю что-то вроде:

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

Когда я нажимаю кнопку, она расширяет окно, как будто оно пытается отобразить изображение, но ничего не появляется, оно просто становитсяболее широкое окно.Так что я делаю не так?

Заранее спасибо!

1 Ответ

0 голосов
/ 11 апреля 2019

Когда изображение создается в функции, ссылка 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()
...