使用PIL ImageTk.PhotoImage会导致错误“'PhotoImage'对象没有属性'_PhotoImage__photo'”

时间:2019-12-29 00:35:15

标签: python python-imaging-library

我正在使用PIL版本6.2.1在python 3.7.3中尝试以下代码:

render = ImageTk.PhotoImage(Image.open(pic))

但它会导致如下错误消息:

Traceback (most recent call last):
  File "F:/python/test/test10.py", line 12, in <module>
    render = ImageTk.PhotoImage(Image.open(pic))
  File "C:\Users\erica\AppData\Roaming\Python\Python37\site-packages\PIL\ImageTk.py", line 118, in __init__
    self.__photo = tkinter.PhotoImage(**kw)
  File "C:\Users\erica\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 3545, in __init__
    Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "C:\Users\erica\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 3489, in __init__
    raise RuntimeError('Too early to create image')
RuntimeError: Too early to create image
Exception ignored in: <function PhotoImage.__del__ at 0x0000027A91FEB0D0>
Traceback (most recent call last):
  File "C:\Users\erica\AppData\Roaming\Python\Python37\site-packages\PIL\ImageTk.py", line 124, in __del__
    name = self.__photo.name
AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'

我尝试了不同的枕头版本,尝试根据其他帖子的建议输入类实例,并尝试使用os.chdir(pic_dir)。但是它们都不起作用。

1 个答案:

答案 0 :(得分:1)

使用ImageTk module取决于Tkinter实例,因为ImageTk.PhotoImage被设计为“ 在Tkinter期望图像对象的任何地方使用”。

从Traceback中,PhotoImage基本上只是调用Tkinter的PhotoImage构造函数:

self.__photo = tkinter.PhotoImage(**kw)

然后base class for PhotoImage检查正在运行的Tkinter实例:

def __init__(self, imgtype, name=None, cnf={}, master=None, **kw):
    self.name = None
    if not master:
        master = _default_root
        if not master:
            raise RuntimeError('Too early to create image')

,由于找不到一个,因此引发了“ 创建图像太早”错误。然后在PIL中,它只会忽略该错误(“ Exception在...中被忽略... ”),因此其余PhotoImage的创建都会因您得到的错误而失败。

要解决此问题,必须正确初始化Tkinter部件。

尝试首先创建一个Tkinter实例:

from PIL import ImageTk, Image
from tkinter import Tk

root = Tk()
render = ImageTk.PhotoImage(image=Image.open("sample.jpg"))

或使用不依赖于Tkinter的通用Image模块。