gpt4 book ai didi

python - tkinter 和 PhotoImage 库

转载 作者:行者123 更新时间:2023-12-01 08:35:03 25 4
gpt4 key购买 nike

此代码有效:

img = PhotoImage(file="Image.gif")

Label(root, image=img).pack()

这个方法怎么行不通?

Label(root, image=PhotoImage(file="Image.gif")).pack()

不可能将所有内容都放在一行中吗?

最佳答案

问题不在于语法,而在于垃圾收集。以您的缩写形式:

Label(root, image=PhotoImage(file="Image.gif")).pack()

指向由 PhotoImage() 返回的图像的指针永远不会被保存,因此图像会被垃圾收集并且不会显示。以较长的形式:

img = PhotoImage(file="Image.gif")

Label(root, image=img).pack()

您按住了指向图像的指针,因此一切正常。您可以通过将工作代码包装在函数中并使 img 成为该函数的本地函数来说服自己:

from tkinter import *

root = Tk()

def dummy():
img = PhotoImage(file="Image.gif")

Label(root, image=img).pack()

dummy()

mainloop()

现在,它不会再显示,因为当函数返回并且您的图像被垃圾收集时,img 就会消失。现在,返回图像并将返回值保存在变量中:

def dummy():
img = PhotoImage(file="Image.gif")

Label(root, image=img).pack()

return img

saved_ref = dummy()

你的图像又恢复正常了!常见的修复方法如下:

def dummy():
img = PhotoImage(file="Image.gif")

label = Label(root, image=img)
label.image_ref = img # make a reference that persists as long as label

label.pack()

dummy()

但是你可以看到我们已经远离单行文字了!

关于python - tkinter 和 PhotoImage 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53767332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com