_tkinter.TclError: 图像"..."不存在。

18

我知道这个问题已经被问了好几次,但是我仍然无法解决我的问题。我一直收到相同的错误,不知道如何解决。

这是我的代码:

from Tkinter import *
from PIL import Image, ImageTk
import os

window = Tk()
i = Image.open(pathToImage) 
if os.path.isfile(pathToImage):

     print 'image exists'
else:   
     print 'image does not exits'

label=Label(window, image=i)
label.pack()
window.mainloop()

它说图像存在于指定路径,但我一直收到这个错误信息:
Traceback (most recent call last):
  File "ImageTest.py", line 31, in <module>
    label=Label(window, image=i)
  File "C:\Users\username\Anaconda2\lib\lib-tk\Tkinter.py", line 2597, in __init__
Widget.__init__(self, master, 'label', cnf, kw)
  File "C:\Users\username\Anaconda2\lib\lib-tk\Tkinter.py", line 2096, in __init__
(widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: image "<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=640x480 at 0x36DF278>" doesn't exist

我无法解决这个问题。希望能得到帮助!

3个回答

25

您应该使用 PhotoImage 实例作为 image 值。此外,您需要保留图像的引用。

im = Image.open(pathToImage)
ph = ImageTk.PhotoImage(im)

label = Label(window, image=ph)
label.image=ph  #need to keep the reference of your image to avoid garbage collection

为什么需要保留引用?它像“show(),configure()”等一样在使用后被“消耗”吗?我不理解这个机制。 - Semo
3
这个effbot的链接比我更能解释Tkinter图片不显示的问题,请参考该链接。 - Lafexlos
1
看起来 effbot 的链接已经死了一段时间。你可以查看 furas这篇博客文章,其中还包含了 effbot 链接的 wayback machine。 - Lafexlos

15
一个快速而粗糙的解决方案是提供正确的“主控程序”给 .PhotoImage
i = ImageTk.PhotoImage(pathToImage, master=window)

1

这似乎是一个Anaconda - Spyder - Iphyton的问题。 解决方案在这里

为了给未来的读者提供参考:

我也曾遇到同样的问题,但只有在使用Spyder时才会出现(在Eclipse的pydev中没有问题)。我找到了两个解决方案,对我很有效。

解决方案1:转到工具 => 首选项,并选择左侧的IPython控制台。在IPython控制台菜单中选择图形选项卡,在顶部禁用“Active support”复选框(支持图形)。在运行代码之前保存并重新启动内核

解决方案2:转到运行 => 配置并选择“在外部系统终端中执行”,保存并运行代码

如上所述,这两个解决方案都对我的问题起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接