【问题标题】:AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'AttributeError:“PhotoImage”对象没有属性“_PhotoImage__photo”
【发布时间】:2018-06-03 02:24:40
【问题描述】:

我正在开发 Yolo3-4-PY 以使用 tkinter 实现它。

我到处查找,但无法解决问题。

当我运行程序时,画布会显示,但是当我点击开始视频(btton)时,我收到以下错误:

从 weights/yolov3.weights 加载权重...完成! /usr/local/lib/python3.5/dist-packages/PIL/ImageTk.py:119:FutureWarning:元素比较失败;而是返回标量,但将来将执行元素比较 如果模式不在 ["1", "L", "RGB", "RGBA"]:

Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.5/tkinter/__init__.py", line 1553, in __call__
return self.func(*args)
File "webcam_demo.py", line 13, in start_video
show_frame()
File "webcam_demo.py", line 39, in show_frame
imgtk = ImageTk.PhotoImage(image=cv2image)
File "/usr/local/lib/python3.5/dist-packages/PIL/ImageTk.py", line 120, in 
__init__
mode = Image.getmodebase(mode)
File "/usr/local/lib/python3.5/dist-packages/PIL/Image.py", line 313, in 
getmodebase
return ImageMode.getmode(mode).basemode
File "/usr/local/lib/python3.5/dist-packages/PIL/ImageMode.py", line 55, in 
getmode
return _modes[mode]
TypeError: unhashable type: 'numpy.ndarray'
Exception ignored in: <bound method PhotoImage.__del__ of 
<PIL.ImageTk.PhotoImage object at 0x7f4b73f455c0>>
Traceback (most recent call last):
File "/usr/local/lib/python3.5/dist-packages/PIL/ImageTk.py", line 130, in 
__del__    name = self.__photo.name
AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'

【问题讨论】:

  • 在我的例子中,当 Python 在我放置的路径中找不到图像文件时,我收到了这个错误。我更正了路径,它开始工作了。

标签: python python-3.x tkinter python-imaging-library yolo


【解决方案1】:

问题

imgtk = ImageTk.PhotoImage(image=cv2image) 行中,您将一个numpy 数组(cv2image) 作为输入传递给ImageTk.PhotoImage。但是 PIL.ImageTk 的源代码中提到它需要一个 PIL 图像。

这是PIL.ImageTk 的源代码提到的 PhotoImage 的 init()。

class PhotoImage(object):
    .....
    :param image: Either a PIL image, or a mode string.  If a mode string is
              used, a size must also be given.

解决方案

所以基本上,您必须将 numpy 数组转换为 PIL 图像,然后将其传递给 ImageTk.PhotoImage()。

那么,您可以将imgtk = ImageTk.PhotoImage(image=cv2image) 行替换为imgtk = ImageTk.PhotoImage(image=PIL.Image.fromarray(cv2image)) 吗?

这会将 numpy 数组转换为 PIL 图像,并将其传递给方法。

参考文献

我从this source提取了将numpy数组转换为PIL Image的代码。

【讨论】:

    【解决方案2】:

    在我的情况下,只需添加此行即可正确

    root = tkinter.Tk()
    

    完整代码:

    root = tkinter.Tk()
    image = PIL.Image.open(r"C:\Users\Hamid\Desktop\asdasd\2.jpeg")
    img = ImageTk.PhotoImage(image)
    l = Label(image=img)
    l.pack()
    

    【讨论】:

    • 这对我也有用。对我来说具体发生的事情是,因为找不到根 Tk() 实例,所以引发了这个异常:RuntimeError(f"Too early to {what}: no default root window"),每当尝试初始化 PhotoImage 对象而没有Tk() 实例。
    【解决方案3】:

    当你将图片变量放入标签时,你必须将图片变量初始化为“image”。

    例如:(正确的方法)

    photo = PhotoImage(file = "C://Users//Carl//Downloads//download.png")
    label1 = Label(image = photo)
    label1.pack()
    

    例如:(错误的方法)

    photo = PhotoImage(file = "C://Users//Carl//Downloads//download.png")
    label1 = Label(photo)
    label1.pack()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-05
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 2012-12-01
      • 2021-04-19
      相关资源
      最近更新 更多