如何使用def语句在tkinter中更换图片

0 投票
1 回答
558 浏览
提问于 2025-04-18 05:08

我好像在下面的代码上遇到了问题

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 个回答

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-conditioncontent-large-white.gif 就会成为默认图像;否则,如果到达这种情况,Python 会抛出一个 UnboundLocalError 错误。

撰写回答