AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'
AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'
我正在研究 Yolo3-4-PY 以使用 tkinter 实现它。
我到处查找,但无法解决问题。
当我 运行 程序显示 canvas 但是当我点击 Start Video(btton) 我得到以下错误:
正在从 weights/yolov3.weights 加载权重...完成!
/usr/local/lib/python3.5/dist-packages/PIL/ImageTk.py:119: FutureWarning: elementwise 比较失败;返回标量,但将来会执行元素比较
如果模式不在 ["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'
问题
在行 imgtk = ImageTk.PhotoImage(image=cv2image)
中,您将一个 numpy 数组 (cv2image) 作为输入传递给 ImageTk.PhotoImage。但是PIL.ImageTk的源码中提到需要PIL镜像。
这是 PIL.ImageTk 的源代码提到的 init() of PhotoImage.
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 图像的代码
就我而言,只需添加此行即可更正
root = tkinter.Tk()
完整代码:
root = tkinter.Tk()
image = PIL.Image.open(r"C:\Users\Hamid\Desktop\asdasd.jpeg")
img = ImageTk.PhotoImage(image)
l = Label(image=img)
l.pack()
在标签中放置图片变量时,必须将图片变量初始化为"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()
我正在研究 Yolo3-4-PY 以使用 tkinter 实现它。
我到处查找,但无法解决问题。
当我 运行 程序显示 canvas 但是当我点击 Start Video(btton) 我得到以下错误:
正在从 weights/yolov3.weights 加载权重...完成! /usr/local/lib/python3.5/dist-packages/PIL/ImageTk.py:119: FutureWarning: elementwise 比较失败;返回标量,但将来会执行元素比较 如果模式不在 ["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'
问题
在行 imgtk = ImageTk.PhotoImage(image=cv2image)
中,您将一个 numpy 数组 (cv2image) 作为输入传递给 ImageTk.PhotoImage。但是PIL.ImageTk的源码中提到需要PIL镜像。
这是 PIL.ImageTk 的源代码提到的 init() of PhotoImage.
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 图像的代码就我而言,只需添加此行即可更正
root = tkinter.Tk()
完整代码:
root = tkinter.Tk()
image = PIL.Image.open(r"C:\Users\Hamid\Desktop\asdasd.jpeg")
img = ImageTk.PhotoImage(image)
l = Label(image=img)
l.pack()
在标签中放置图片变量时,必须将图片变量初始化为"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()