Come aggiornare l'immagine di un widget Tkinter Label?
-
28-09-2019 - |
Domanda
Mi piacerebbe essere in grado di scambiare l'immagine su un'etichetta Tkinter, ma non sono sicuro di come farlo, tranne che per la sostituzione del widget stesso.
Al momento, posso visualizzare un'immagine in questo modo:
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()
Tuttavia, quando l'utente preme, dicono che la chiave ENTER
, mi piacerebbe cambiare l'immagine.
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()
È possibile?
Soluzione
Il metodo label.configure
funziona in panel.configure(image=img)
.
Quello che ho dimenticato di fare era includere la panel.image=img
, per evitare che la raccolta dei rifiuti da eliminare l'immagine.
Di seguito è la nuova versione:
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()
Il codice originale funziona perché l'immagine viene memorizzata nella img
variabile globale.
Altri suggerimenti
Un'altra opzione per farlo.
Uso programmazione orientata agli oggetti e con un'interfaccia interattiva per aggiornare l'immagine.
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()
Sostituire 'cualitativa.jpg' per l'immagine predefinita che si desidera utilizzare.