按钮按下时Tkinter不更改图像

时间:2017-01-15 03:15:56

标签: 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()

3 个答案:

答案 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 = photo1labelname.image = photo1都有效。

查看此内容以获取更多详细信息:http://effbot.org/tkinterbook/label.htm

  

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

答案 1 :(得分:0)

进行了以下编辑:

  1. 我已经组织了你的代码布局并简化了它 语法尽可能。这些是为了让您的代码更易于阅读。
  2. 通常我们将PIL对象作为tk的子集/子对象。 很久它就是root的一部分(即它是root的一个孩子 或者它的任何子窗口小部件),你的PIL对象都可以工作。
  3. 您的工作代码如下所示:

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

我相信代码会在本地更改图像,因此全局语句会在项目范围内对其进行更改。