Tkinter在按下按钮时不会改变图像

use*_*741 5 python user-interface tkinter

我已将图像加载到 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()
Run Code Online (Sandbox Code Playgroud)

Sha*_*ane 5

在 中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"
Run Code Online (Sandbox Code Playgroud)

PS看起来像labelname.photo = photo1labelname.image = photo1工作。

查看更多详细信息:http : //effbot.org/tkinterbook/label.htm

您可以使用标签来显示 PhotoImage 和 BitmapImage 对象。执行此操作时,请确保保留对图像对象的引用,以防止 Python 的内存分配器对其进行垃圾回收。您可以使用全局变量或实例属性,或者更简单,只需向小部件实例添加一个属性即可。


Sun*_*ear 4

进行了以下编辑:

  1. 我已经组织了您的代码布局并尽可能简化了其语法。这些都是为了让你的代码更容易阅读。
  2. 通常我们将 PIL 对象作为 tk 的子集/子对象。只要它是根的一部分(即它是根或其任何子部件的子部件),您的 PIL 对象就可以工作。

您的工作代码如下所示:

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()
Run Code Online (Sandbox Code Playgroud)