Как обновить изображение виджета Tkinter Label? - PullRequest
27 голосов
/ 14 августа 2010

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

В настоящее время я могу отображать изображениевот так:

import Tkinter as tk
import ImageTk

root = tk.Tk()
img = ImageTk.PhotoImage(Image.open(path))
panel = tk.Label(root, image = img)
panel.pack(side = "bottom", fill = "both", expand = "yes")
root.mainloop()

Однако, когда пользователь нажимает, скажем, клавишу ENTER, я бы хотел изменить изображение.

import Tkinter as tk
import ImageTk

root = tk.Tk()

img = ImageTk.PhotoImage(Image.open(path))
panel = tk.Label(root, image = img)
panel.pack(side = "bottom", fill = "both", expand = "yes")

def callback(e):
    # change image

root.bind("<Return>", callback)
root.mainloop()

Возможно ли это?

Ответы [ 2 ]

43 голосов
/ 14 августа 2010

Метод label.configure работает в panel.configure(image=img).

Что я забыл сделать, так это включить panel.image=img, чтобы запретить сборку мусора удалить изображение.

Следующееэто новая версия:

import Tkinter as tk
import ImageTk


root = tk.Tk()

img = ImageTk.PhotoImage(Image.open(path))
panel = tk.Label(root, image=img)
panel.pack(side="bottom", fill="both", expand="yes")

def callback(e):
    img2 = ImageTk.PhotoImage(Image.open(path2))
    panel.configure(image=img2)
    panel.image = img2

root.bind("<Return>", callback)
root.mainloop()

Исходный код работает, потому что изображение хранится в глобальной переменной img.

0 голосов
/ 12 февраля 2018

Еще один вариант сделать это.

Использование объектно-ориентированного программирования и интерактивного интерфейса для обновления изображения.

from Tkinter import *
import tkFileDialog
from tkFileDialog import askdirectory
from PIL import  Image

class GUI(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master)
        w,h = 650, 650
        master.minsize(width=w, height=h)
        master.maxsize(width=w, height=h)
        self.pack()

        self.file = Button(self, text='Browse', command=self.choose)
        self.choose = Label(self, text="Choose file").pack()
        self.image = PhotoImage(file='cualitativa.gif')
        self.label = Label(image=self.image)


        self.file.pack()
        self.label.pack()

    def choose(self):
        ifile = tkFileDialog.askopenfile(parent=self,mode='rb',title='Choose a file')
        path = ifile.name
        self.image2 = PhotoImage(file=path)
        self.label.configure(image=self.image2)
        self.label.image=self.image2


root = Tk()
app = GUI(master=root)
app.mainloop()
root.destroy()

Замените «cualitativa.jpg» на изображение по умолчанию, которое вы хотите использовать.

...