如何使用def语句在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 个回答
在 login
函数里,photo
是一个局部变量。当 login
函数结束时,这个局部变量 photo
可能会被垃圾回收机制清理掉。Fredrik Lundh 是这样解释这个问题的:
当 Python 的垃圾回收器丢弃 Tkinter 对象时,Tkinter 会通知 Tk 去释放这个图像。但因为这个图像正在被一个组件使用,所以 Tk 不会完全销毁它。它只是把图像变成透明的……
解决这个问题的方法是保持对 PhotoImage 的引用。由于你没有使用类,保持引用最简单的方法就是把 photo
设为全局变量:
def login():
global photo
...
lblpicture.configure(image=photo)
这样,如果既不满足 if-condition
也不满足 elif-condition
,content-large-white.gif
就会成为默认图像;否则,如果到达这种情况,Python 会抛出一个 UnboundLocalError
错误。