【问题标题】:_tkinter.TclError: image "pyimage1" doesn't exist_tkinter.TclError:图像“pyimage1”不存在
【发布时间】:2017-11-19 15:31:01
【问题描述】:

为什么我的 Tkinter 图像不起作用?它在同一个目录中,所有命令都是正确的,但我得到了错误:

_tkinter.TclError:图像“pyimage1”不存在。

怎么了?

fertig=tkinter.Tk()
fertig.title("Window")
text=tkinter.Label(fertig,text="Success")
text.pack()
w = tkinter.PhotoImage(file="/Users/Hannes/Desktop/Spambot/successful.gif ")
w = tkinter.label(fertig,image=w)
w.pack()
knapp=tkinter.Button(fertig,text="Ok",command=lambda:close())
knapp.pack()
knapp.mainloop()

【问题讨论】:

  • 好像找不到你的图片文件。我刚刚注意到"/Users/Hannes/Desktop/Spambot/successful.gif " 的末尾有一个空格字符——也许这就是问题所在(假设文件确实存在)。另外,尝试删除 file= 部分,只需将路径字符串作为常规位置参数传递。
  • 但是 tkinter 不需要 file= 吗?
  • 我不清楚。看在上帝的份上,试试吧……
  • 如果你的脚本和图片在同一目录下,你可以使用tkinter.PhotoImage(file="successful.gif ")。使用相对路径而不是绝对路径可能是可取的,因为您可以在没有完全相同目录结构的不同机器上运行代码(或作为除 Hannes 之外的用户)。
  • 您发布的代码不可能给出您所说的错误,因为第六行有语法错误。您还有一个问题,即您的文件名以空格结尾,虽然在 linux 上可能,但极不可能是实际名称。当我解决这两个问题时,您的代码对我来说很好。

标签: python python-3.x tkinter


【解决方案1】:

以下内容适用于我的 Windows 系统。我必须修复并添加一些(不相关的)东西才能让您问题中的代码正常工作,但在这样做之后,我发现了图像无法显示的真正原因。

因此,与该问题最直接相关的错误是因为您正在覆盖变量 w:在您为其分配 tkinter.PhotoImage() 值后,您立即分配另一个值(tkinter.Label)使用其当前值 (image=w)。第二个赋值导致其中的tkinter.PhotoImage() 对象丢失。由于没有更多的引用,它会在某个时候被垃圾收集。

要解决这个问题,我只需将 PhotoImage 对象分配给单独的变量 img

还要注意,(显然)在文件名中包含尾随空格字符不是问题(至少在 Windows 上不是)。

这里有一些“官方”documentation 专门关于 PhotoImage 类,它讨论了保留对原始引用的必要性 - 请参阅末尾的 注意: - 当使用它时其他 tkinter 小部件(如 Label)。

import tkinter

def close():  # just a placeholder implementation.
    print('close() called')

fertig=tkinter.Tk()
fertig.title("Window")
text=tkinter.Label(fertig, text="Success")
text.pack()
#w = tkinter.PhotoImage(file="/Users/Hannes/Desktop/Spambot/successful.gif ")
img = tkinter.PhotoImage(file=r"C:\vols\Files\PythonLib\Stack Overflow\successful.gif ")
w = tkinter.Label(fertig, image=img)
w.pack()
knapp=tkinter.Button(fertig, text="Ok", command=lambda: close())
knapp.pack()
knapp.mainloop()

这是它的样子(使用我自己的图像)。

【讨论】:

  • 是的......程序本身正在运行,但如果我把它放在它应该在的程序中,我会得到同样的错误......
  • @Next TV:我只能修复你问题中的代码——我不仅已经完成了,而且还解释了主要问题。在我看来,期待更多是不合理和不公平的。
  • 我不怪你回答了我没有问过的问题,你帮我做了很多事情!再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-05
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 2023-03-14
  • 2022-12-03
  • 1970-01-01
相关资源
最近更新 更多