如何更新Tkinter标签小部件的图像?
我想在Tkinter的标签上更换一张图片,但我不太确定怎么做,除了直接替换整个控件。
现在,我可以这样显示一张图片:
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()
不过,当用户按下,比如说ENTER
键时,我想要更换这张图片。
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()
这样做可以吗?
3 个回答
2
还有一种可能对你有帮助的解决方案。
在我的情况下,我有两个 tk.Tk()
窗口。当我使用 ImageTk.PhotoImage()
时,这个对象默认会把它的 tk 窗口设置为第一个创建的窗口。解决这个问题的方法很简单,就是在调用时指定你想要的窗口,比如这样 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()
8
还有另一种方法可以做到这一点。
可以使用面向对象编程,并通过一个互动界面来更新图片。
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()
把 'cualitativa.jpg' 替换成你想用的默认图片。
123
这个方法 label.configure
在 panel.configure(image=img)
中确实是有效的。
我忘了做的一件事是加上 panel.image=img
,这样可以防止垃圾回收机制把图片删除掉。
下面是更新后的版本:
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()
原来的代码之所以能工作,是因为图片保存在全局变量 img
中。