我已将图像加载到tkinter标签,并且该图像显示在该标签中。当我按下按钮时,我需要更改该图像。按下该按钮时,旧图像消失但新图像不显示 我的代码是
import Tkinter as tk
from PIL import Image, ImageTk
root = tk.Tk()
def change_pic(labelname):
photo1 = ImageTk.PhotoImage(Image.open("demo.jpg"))
labelname.configure(image=photo1)
print "updated"
vlabel=tk.Label(root)
photo = ImageTk.PhotoImage(Image.open('cardframe.jpg'))
vlabel.configure(image=photo)
vlabel.pack()
b2=tk.Button(root,text="Capture",command=lambda:change_pic(vlabel))
b2.pack()
root.mainloop()
答案 0 :(得分:2)
在def change_pic(labelname)
中,您需要添加labelname.photo = photo1
以确保photo1
不被垃圾回收。
def change_pic(labelname):
photo1 = ImageTk.PhotoImage(Image.open("demo.jpg"))
labelname.configure(image=photo1)
labelname.photo = photo1
print "updated"
P.S。看起来labelname.photo = photo1
和labelname.image = photo1
都有效。
查看此内容以获取更多详细信息:http://effbot.org/tkinterbook/label.htm
您可以使用标签显示PhotoImage和BitmapImage对象。 执行此操作时,请确保保留对图像对象的引用, 防止它被Python的内存垃圾收集 分配器。您可以使用全局变量或实例属性,或 更简单,只需向窗口小部件实例添加属性即可。
答案 1 :(得分:0)
进行了以下编辑:
您的工作代码如下所示:
import Tkinter as tk
from PIL import Image, ImageTk
def change_pic():
vlabel.configure(image=root.photo1)
print "updated"
root = tk.Tk()
photo = 'cardframe.jpg'
photo1 = "demo.jpg"
root.photo = ImageTk.PhotoImage(Image.open(photo))
root.photo1 = ImageTk.PhotoImage(Image.open(photo1))
vlabel=tk.Label(root,image=root.photo)
vlabel.pack()
b2=tk.Button(root,text="Capture",command=change_pic)
b2.pack()
root.mainloop()
答案 2 :(得分:0)
我用多一行代码让它工作了:
import tkinter as tk # I am using python 3 on windows so the tkinter is lowercased
from PIL import Image, ImageTk
root = tk.Tk()
def change_pic(labelname):
global photo1 # This is the only new line you need, I believe
photo1 = ImageTk.PhotoImage(Image.open("demo.jpg"))
labelname.configure(image=photo1)
print("updated") # Again I'm using python 3 on windows so syntax may differ.
root.update() # You don't need this statement in this case, but it never hurts
vlabel=tk.Label(root)
photo = ImageTk.PhotoImage(Image.open('cardframe.jpg'))
vlabel.configure(image=photo)
vlabel.pack()
b2=tk.Button(root,text="Capture",command=lambda:change_pic(vlabel))
b2.pack()
root.mainloop()
我相信代码会在本地更改图像,因此全局语句会在项目范围内对其进行更改。