我该如何修复“图像'pyimage10'不存在”的错误,并为什么会出现这种情况?

5

我正在开发一个tkinter应用程序,它会在用户查看实时比特币价格数据之前显示一张包含基本信息和图片的页面。然而,当我将图片添加到“启动”页面时,我的IDE出现了以下错误:

 BTC_img_label = tk.Label(self, image=BTC_img)
 File "C:\Python34\lib\tkinter\__init__.py", line 2609, in __init__
 Widget.__init__(self, master, 'label', cnf, kw)
 File "C:\Python34\lib\tkinter\__init__.py", line 2127, in __init__
 (widgetName, self._w) + extra + self._options(cnf))
 _tkinter.TclError: image "pyimage10" doesn't exist

我相信以下代码可能导致了我的错误(它们是将图片添加到“启动”页面的相同代码段):

BTC_img = tk.PhotoImage(file='bitcoin.png')
BTC_img_label = tk.Label(self, image=BTC_img)
BTC_img_label.image = BTC_img
BTC_img_label.grid(row=2, column=0)

我还注意到,当程序运行时,我设置的图标在GUI窗口中不显示,只显示默认的Tkinter羽毛图标。如果有人感兴趣,这是我的图标设置代码(尽管我很确定它不会导致我的错误):
tk.Tk.iconbitmap(self, default='main.ico')

是的,如果有人想知道,我确实将tkinter导入为tk,所以这不是我的错误。如果有人能告诉我为什么会出现这个错误,我会非常感兴趣:我没有看到很多其他类似的例子,而我看到的那些也没有提到我的图标问题。希望有人能解决这个问题!

5个回答

5

和@joost-broekhuizen一样,我在使用Tkinter和matplotlib.pyplot函数时遇到了同样的问题。将'master'添加到PhotoImage函数中可以解决我的问题。

错误代码(引发TclError: image "pyimage10"不存在):

import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
import Tkinter as tk
from PIL import Image, ImageTk

fig = plt.figure()

root = tk.Tk()
image = Image.open("background.png")
photo = ImageTk.PhotoImage(image)
label = tk.Label(root, image=photo)
label.image = image
label.pack()

root.mainloop()

将“master=root”添加到PhotoImage中解决了此错误!
photo = ImageTk.PhotoImage(image, master=root)

2

您不能使用tkinter加载.png格式的图片。您需要使用PIL库来实现:

import PIL

image = PIL.Image.open("bitcoin.png")
BTC_img = PIL.ImageTk.PhotoImage(image)
BTC_img_label = tk.Label(self, image=BTC_img)
BTC_img_label.image = BTC_img
BTC_img_label.grid(row=2, column=0)

编辑:

请创建一个test.py文件,并运行以下完全相同的代码:

import tkinter as tk
from PIL import Image, ImageTk

root = tk.Tk()    
image = Image.open("bitcoin.png")
photo = ImageTk.PhotoImage(image)
label = tk.Label(root, image=photo)
label.image = photo
label.grid(row=2, column=0)
#Start the program
root.mainloop()

告诉我你是否收到错误信息。

你有任何想法为什么我选择的图标没有显示出来吗? - user4544749
2
尽管我按照你的建议使用了PIL的Image和ImageTk模块,但我仍然遇到了相同的错误。 - user4544749
我仍然得到相同的错误,你确定吗?你提供了通往 bitcoin.png 的正确路径吗?请再次阅读错误消息,因为即使它是相同的,它也必须涉及其他代码行,而不是与 BTC_img_label 相关的代码行。 - Billal Begueradj
我在代码所在的同一目录中有bitcoin.png,因此我已经提供了正确的路径。是否可能其他模块正在干扰我的代码并导致此错误?我正在使用matplotlib进行工作,这是我最近才开始使用并且还不太熟悉的。 - user4544749
1
那次我没有收到错误信息,而且它正确地输出了图像。 - user4544749
显示剩余9条评论

1
我也遇到过相同的问题。问题出在在同一程序或从导入定义的另一个py文件中导入matplotlib.pyplot。改用Canvas来绘制图表。

对我来说,这解决了问题!在我的某些文件中,我使用了matplotlib,自从禁用它后就不再抛出错误。 - Laurens Meeus

0
这个问题可以通过在Photoimage构造函数中添加master=root来解决。
例如:
pic=Photoimage(master=self.root,file='mypic.png')
Label(self.root,image=pic).pack()

0
我遇到了同样的问题,但原因不同。在我的情况下,是因为我在子模块(一个新窗口)中再次添加了tk根,这样我就可以在设计窗口时独立运行它。
class NewWindow(tk.Toplevel):
    root = tk.Tk()

解决问题的方法是将其移除。

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