web-dev-qa-db-fra.com

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

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

Actuellement, 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 sur la touche ENTER, je souhaite modifier 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?

22
skeggse

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 récupération de place 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 d'origine fonctionne car l'image est stockée dans la variable globale img.

36
skeggse

Une autre option pour le faire.

Utilisation de la programmation orientée objet et d’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' pour l'image par défaut que vous souhaitez utiliser. 

0
Daniel Santos