【问题标题】:tkinter and library PhotoImagetkinter 和库 PhotoImage
【发布时间】:2018-12-13 17:38:08
【问题描述】:

此代码有效:

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

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

这个方法怎么行不通?

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

难道不能把所有东西都放在一条线上吗?

【问题讨论】:

  • 还要与其他库绑定引用吗?

标签: python python-3.x tkinter photoimage


【解决方案1】:

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

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()

但是您可以看到,我们已经远离单线!

【讨论】:

  • 感谢 cdlane 的回答。打个比方:如果我说 Photoimage 库使用字典,然后是 key 和 value,对吗?
  • @Kaa,你所说的充其量似乎是不合理的——最坏的情况是不正确的。
【解决方案2】:

在第一个版本中,img 保留对图像的引用。

在第二个版本中,没有对该图像的引用,pack() 返回None

【讨论】:

  • 感谢 Billal Begueradj 的回答,这不是改进的原因我只是想知道为什么必须提供参考,并了解您是否可以提供帮助
猜你喜欢
  • 2013-07-19
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多