如何使用def语句更改tkinter中的图像

时间:2014-05-02 14:11:09

标签: python tkinter

我似乎遇到以下代码的问题

import tkinter

window = tkinter.Tk()

window.geometry("1000x1000")

window.title(" Team Insanity login")

photo = tkinter.PhotoImage(file="content-large-white.gif")

def login():

    user = entuser.get()

    password = entpassword.get()

    if (user == "X-box") and (password == "d0ct0r"):
       photo = tkinter.PhotoImage(file="Trmn8atrmn8ter.gif")
       lblname.configure(text = "Welcome X-box!")

    elif (user == "Chloe") and (password == "l3ad3r"):
       photo = tkinter.PhotoImage(file="chloecat194.gif")
       lblname.configure(text = "Welcome Chloe!")

    lblpicture.configure(image=photo)

lblpicture = tkinter.Label(window, image=photo)

lblname = tkinter.Label(text="Please log in")

entuser = tkinter.Entry(window)

entpassword = tkinter.Entry(window)

btnlogin = tkinter.Button(text="Login", command=login)

lblname.pack()

lblpicture.pack(side=tkinter.LEFT)

entuser.pack()

entpassword.pack()

btnlogin.pack()



window.mainloop

你看,在尝试运行时,它运行正常。登录也可以,因为它会更改lblname的文本。但是,它似乎不记得已更改的图片,因为它返回的灰色与所请求的图片大小相同。

还要注意的是,在调试过程中,我发现如果错误拼写的.update命令使图片保持原状,但在校正后,使其在恢复之前闪烁图片。

我不确定这是否重要,但这是我正在使用的图片

Trmn8atrmn8ter.gif =转换http://chloecat194.deviantart.com/art/X-box-432590753?q=gallery%3AChloecat194%2F34413920&qo=16

Chloecat194.gif =转换http://chloecat194.deviantart.com/art/Chloecat194-432590268?q=gallery%3AChloecat194%2F34413920&qo=18

1 个答案:

答案 0 :(得分:1)

login中,photo是一个局部变量。当login函数结束时, local 变量photo可能会被垃圾回收。 Fredrik Lundh explains问题就是这样:

  

当Python的垃圾收集器丢弃Tkinter对象时,Tkinter   告诉Tk释放图像。但由于图像正在使用中   小部件,Tk不会破坏它。不完全的。它只是空白了   图像,使其完全透明......

解决方案是保留对PhotoImage的引用。由于您没有使用类,因此保留引用的最简单方法是使photo成为全局变量:

def login():
    global photo
    ...
    lblpicture.configure(image=photo)

如果content-large-white.gifif-condition都不是True,这也会允许elif-condition成为默认图片;就目前而言,如果达到这种情况,Python会引发UnboundLocalError