73 votes

Comment mettre à jour l'image d'un widget Tkinter Label ?

J'aimerais pouvoir remplacer une image sur une étiquette Tkinter, mais je ne sais pas trop comment faire, sauf en remplaçant le widget lui-même.

Actuellement, je peux afficher une image comme suit :

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

Cependant, lorsque l'utilisateur frappe, disons, le ENTER clé, 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 ?

121voto

distilledchaos Points 1141

La méthode label.configure fonctionne dans panel.configure(image=img) .

Ce que j'ai oublié de faire, c'est d'inclure le panel.image=img pour empêcher la collecte des déchets de supprimer l'image.

Voici 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 original fonctionne car l'image est stockée dans la variable globale img .

8voto

Daniel Santos Points 41

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

Remplacez 'cualitativa.jpg' par l'image par défaut que vous souhaitez utiliser.

2voto

Mateo Conde Points 1

Une autre solution qui pourrait vous être utile.

Dans mon cas, j'avais deux tk.Tk() Windows. Lorsque vous utilisez ImageTk.PhotoImage() l'objet définit par défaut sa fenêtre tk comme étant la première créée. Une solution simple à ce problème est de passer la fenêtre tk que vous souhaitez comme suit ImageTk.PhotoImage(img, master=your_window)

import tkinter as tk 
from PIL import ImageTk, Image
if __name__ == '__main__':
     main_window = tk.Tk()
     second_window = tk.Tk()

     main_canvas = Canvas(second_window)
     main_canvas.pack()

     filename = 'test.png'

     img = Image.open(filename)
     img = img.resize((300, 100), Image.ANTIALIAS)
     logo = ImageTk.PhotoImage(img, master=second_window)
     logo_label = Label(master=main_canvas, image=logo)
     logo_label.image = logo
     logo_label.pack()

     main_window.mainloop()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X