我似乎遇到以下代码的问题
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
答案 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.gif
或if-condition
都不是True,这也会允许elif-condition
成为默认图片;就目前而言,如果达到这种情况,Python会引发UnboundLocalError
。