在tKinter中更新标签图像有效,但是我不确定为什么吗?

时间:2019-03-11 17:13:04

标签: python python-3.x tkinter

好,所以我在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)不会以任何方式对项目产生负面影响,但是将其包含在其中会令人烦恼。我想知道是否有人可以解释为什么,该项目似乎只使用那部分代码(以及为什么只有在未定义的情况下它才能工作),以及是否有办法安全地摆脱它。

1 个答案:

答案 0 :(得分:0)

您发布的代码中有些混乱,标签小部件名称为portraitportrait1portrait_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()