2010-08-14 7 views
18

Ich möchte ein Bild auf einem Tkinter Label austauschen können, aber ich bin mir nicht sicher, wie es geht, außer das Widget selbst zu ersetzen.Wie wird das Image eines Tkinter Label-Widgets aktualisiert?

Derzeit kann ich ein Bild wie so angezeigt werden:

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

Wenn jedoch der Benutzer trifft, sagen die ENTER Schlüssel, ich möchte das Bild ändern.

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

Ist das möglich?

Antwort

29

Die Methode label.configure funktioniert in panel.configure(image=img).

Was ich vergessen habe zu tun, war die panel.image=img, um zu verhindern, dass Garbage Collection das Bild löschen.

Im Folgenden ist die neue 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() 

Der ursprüngliche Code funktioniert, weil das Bild in den globalen Variablen img gespeichert wird.

+0

Sollte die Zeile im Callback 'panel.image = img2' lauten? – 101

+0

@figs scheint so, würde Sinn machen. Ich erinnere mich nicht daran, diese Verwendung speziell modifizieren zu müssen, aber das war auch vor vier Jahren. Könnten Sie es testen, um es zu überprüfen? – skeggse

+0

Ja, das war wahrscheinlich das Problem. Getestet mit etwas anderem Code, aber mit demselben Problem. –

0

Eine andere Möglichkeit, es zu tun.

Verwenden der objektorientierten Programmierung und mit einer interaktiven Schnittstelle, um das Bild zu aktualisieren.

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

Ersetzen Sie "cualitativa.jpg" für das Standardbild, das Sie verwenden möchten.

Verwandte Themen