Comment mettre à jour l'image d'un widget Label Tkinter?
-
28-09-2019 - |
Question
Je voudrais pouvoir échanger sur une image sur une étiquette Tkinter, mais je ne suis pas sûr de savoir comment le faire, sauf pour remplacer le widget lui-même.
À l'heure actuelle, je peux afficher une image comme ceci:
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()
Toutefois, lorsque l'utilisateur clique, disent la touche ENTER
, je voudrais changer l'image.
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()
Est-ce possible?
La solution
La méthode label.configure
fonctionne en panel.configure(image=img)
.
Qu'est-ce que j'ai oublié de faire était inclure le panel.image=img
, pour empêcher la collecte des ordures de supprimer l'image.
Ce qui suit est la nouvelle version:
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()
Le code d'origine fonctionne parce que l'image est stockée dans la img
variable globale.
Autres conseils
Une autre option pour le faire.
En utilisant la programmation orientée objet et avec une interface interactive pour mettre à jour l'image.
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()
Remplacer « cualitativa.jpg » pour l'image par défaut que vous souhaitez utiliser.