好,所以我在tKinter中有一个项目,其中包括带有图像的标签和输入框。我需要做的是,图像会根据输入框中的文本发生变化。以下是相关代码:
from tkinter import *
def go():
art = PhotoImage(file=str(entry.get() + ".png"))
portrait = Label(root, image=art)
portrait_1.grid(row=0, column=0)
print(z1)
root = Tk()
root.title("Window Title")
art = PhotoImage(file="image1_.png")
portrait = Label(root, image=art)
portrait1.grid(row=0, column=0)
entry = Entry(root)
entry.grid(row=1, column=0)
goButt = Button(root, text="Go", command=go)
goButt.grid(row=1, column=1)
root.mainloop()
我已经尝试了多种方法来使此功能(具有标签图像更新)起作用,但这是唯一成功的方法。
您可能会注意到print(z1)
函数中的go()
命令。 z1
不是定义的变量,并且在代码中的其他任何地方都没有使用,但是如果没有它,则按下Go
按钮将删除旧图像,但将标签留为空白(即新图像不会吨)。删除该段代码,或以任何方式定义z1
(例如z1 = 1
),都是一样的事情。
到目前为止,拥有print(z1)
不会以任何方式对项目产生负面影响,但是将其包含在其中会令人烦恼。我想知道是否有人可以解释为什么,该项目似乎只使用那部分代码(以及为什么只有在未定义的情况下它才能工作),以及是否有办法安全地摆脱它。
答案 0 :(得分:0)
您发布的代码中有些混乱,标签小部件名称为portrait
,portrait1
和portrait_1
。修复后,它看起来像这样:
函数go()
创建一个新的Label(人像)。该标签与您之前创建的标签不同,而是一个新标签,仅存在于函数go()
中。然后,将图像放在标签中,并将其放置在根窗口中。图像的名称仅存在于函数go()
中,这意味着当函数结束时它将被垃圾回收。
第print(z1)
行在函数结束之前停止了程序,因此保留了对图像的引用。如果没有print(z1)
行,该函数将退出,对图像的引用将被垃圾收集,并且标签不再能够找到该图像。
通常的方法是使用.config()
更新标签,然后在标签小部件中保存对图像的引用:
from tkinter import *
def go():
new = PhotoImage(file=str(entry.get() + ".png")) # Create new image
portrait.config(image=new) # Update label with new image
portrait.image = new # Save reference to the image
root = Tk()
root.title("Window Title")
art = PhotoImage(file="image1_.png")
portrait = Label(root, image=art)
portrait.grid(row=0, column=0)
entry = Entry(root)
entry.grid(row=1, column=0)
goButt = Button(root, text="Go", command=go)
goButt.grid(row=1, column=1)
root.mainloop()