【问题标题】:python3.5, tkinter and PIL - ImportError: cannot import name '_imagingtk'python3.5、tkinter 和 PIL - ImportError: cannot import name '_imagingtk'
【发布时间】:2016-10-03 02:06:08
【问题描述】:

问题:如何让 dpkg PIL/Pillow 版本与 python3.5 和 python3-tk 一起使用?

问题:更新后重启系统后,调用 PIL 方法的 python3.5 tkinter 代码不再有效。错误信息是:

Traceback (most recent call last):
  File "/home/user1/.local/lib/python3.5/site-packages/PIL/ImageTk.py", line 176, in paste
    tk.call("PyImagingPhoto", self.__photo, block.id)
_tkinter.TclError: invalid command name "PyImagingPhoto"

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/user1/Code/tkTreeview_test.py", line 37, in <module>
    app = App(root, path=path_to_my_project)
  File "/home/user1/Code/tkTreeview_test.py", line 22, in __init__
    self.root_pic2 = ImageTk.PhotoImage(root_pic1)      
  File "/home/user1/.local/lib/python3.5/site-packages/PIL/ImageTk.py", line 115, in __init__
    self.paste(image)
  File "/home/user1/.local/lib/python3.5/site-packages/PIL/ImageTk.py", line 180, in paste
    from PIL import _imagingtk
ImportError: cannot import name '_imagingtk'

在阅读了类似的问题(例如123)并查看错误消息后,我认为上述错误消息与我的.local中的PIL.ImageTk和Tcl之间的通信问题有关/lib/python3.5/site-packages/PIL 文件夹。

我使用 Synaptic 包管理器清除了 python3-pil、python3-pil.imagetk 和 python3-tk 并再次重新安装它们。另外,我尝试重新安装 tk8.6 和 tcl8.6。但是,每次通过 PIL.ImageTk 模块运行打开图像的代码时,相同的错误消息仍然存在。

另外,我检查了我可以使用 python3-tk 中的 tkinter.PhotoImage(file=i) 打开图像文件。图像显示没有任何错误消息。但是,我使用 PIL.ImageTk.PhotoImage(i) 打开相同的图像文件 i,我的代码失败并出现上述错误消息。

已安装的 dpkg 包:

ii  libtcl8.6:amd64             8.6.5+dfsg-2    amd64   Tcl (the Tool Command Language) v8.6 - run-time library files
ii  tcl                         8.6.0+9         amd64   Tool Command Language (default version) - shell
ii  tcl8.6                      8.6.5+dfsg-2    amd64   Tcl (the Tool Command Language) v8.6 - shell
ii  libtk8.6:amd64              8.6.5-1         amd64   Tk toolkit for Tcl and X11 v8.6 - run-time files
ii  tk8.6                       8.6.5-1         amd64   Tk toolkit for Tcl and X11 v8.6 - windowing shell
ii  tk8.6-blt2.5                2.5.3+dfsg-3    amd64   graphics extension library for Tcl/Tk - library
ii  python3-tk                  3.5.1-1         amd64   Tkinter - Writing Tk applications with Python 3.x
ii  python3-pil:amd64           3.1.2-0ubuntu1  amd64   Python Imaging Library (Python3)
ii  python3-pil.imagetk:amd64   3.1.2-0ubuntu1  amd64   Python Imaging Library - ImageTk Module (Python3)
ii  python3-pilkit              1.1.13+dfsg-1   all     Utilities and processors built for, and on top of PIL (Python3 version)

已安装的 pip 包: 使用 pip listpip3 list,我找到了 pilkit (1.1.13) 和 Pillow (3.2.0)安装。这意味着我通过 pip 在我的系统中安装了 Pillow (3.2.0),并通过 dpkg 安装了 python3-pil:amd64 版本 3.1.2-0ubuntu1。它们的共存是否会导致冲突,从而导致我的问题?

我被这个问题所困扰,并感谢有关克服上述错误消息的建议。谢谢

【问题讨论】:

  • 试试这个sudo apt-get install python-imaging-tk
  • 我正在使用 python3.5 我应该使用 sudo apt-get install python3-imaging-tk 吗?在我的系统上,python 默认为 python2.7。
  • @shivsn 注意,选择 'python-pil.imagetk' 而不是 'python-imaging-tk' python-pil.imagetk 已经是最新版本(3.1.2-0ubuntu1)。 0 升级,0 新安装,0 删除,0 不升级。我的问题没有改善。

标签: tkinter pip tcl python-imaging-library python-3.5


【解决方案1】:

回答: 发现上面报的错误msg是python3.5和tcl/tk 8.6使用Pillow(3.2.0)(即此时PIL的最新版本)特有的.对于 PIL.ImageTk.PhotoImage() 方法,它以某种方式无法与 tcl 正确通信。查看我与@Akash 的通信,了解我是如何发现这一点的。

为了克服上述错误消息,以便 dpkg PIL/Pillow 版本(3.1.2)可以再次与 python3.5 和 python3-tk 一起使用,我做了以下操作:

  • 通过 pip 卸载主系统中安装的 Pillow (3.2.0) 命令行。

    对于python3,卸载Pillow(3.2.0)的命令是:

    sudo pip3 uninstall Pillow==3.2.0 为 sudo,或

    pip3 uninstall Pillow==3.2.0 作为所有者。

    要在 python2.7 中卸载 Pillow(3.2.0),我只需运行相同的命令 但将 pip3 替换为 pip

  • 为了检查 Pillow(3.2.0) 是否已卸载,我使用了 cmd pip3 list | grep Pillow 并出现了 Pillow (3.1.2)。我重新运行了使用 PIL.ImageTk.PhotoImage() 方法的代码,它们工作了。

【讨论】:

  • 应该已经完成​​了,但感谢您的回答。我在寻找解决方案超过 2 小时,您先生拯救了我的一天:P
【解决方案2】:

我一般使用python虚拟环境,当使用安装在包管理器(synaptic/anaconda)等外部的新包时。

很简单,参考这个文档:
http://docs.python-guide.org/en/latest/dev/virtualenvs/

假设你的项目文件夹是 myProject

>> cd myProject
>> virtualenv venv
>> source venv/bin/activate
>> pip install package_name

【讨论】:

  • 你的意思是我应该先通过我的终端 pip3 卸载 pilkit (1.1.13) 和 Pillow (3.2.0),然后再将其安装到 virtualenvs 中?
  • 不,您不需要卸载。只需阅读文档网络,您就会清楚虚拟环境的概念。
  • 为你的项目创建一个虚拟环境。在虚拟环境中使用 pip 安装所有需要的包。
  • 谢谢。我确实了解 virtualenv 的使用。但是,它并不能解决我在主系统设置中使用 PIL、python3.5 和 tkininter 时遇到的故障。我仍然需要让它工作。知道怎么做吗?顺便说一句,我确实尝试使用 pip 卸载 Pillow,但我不能。
  • 我尝试在我创建的 virtualenv 文件夹中运行相同的代码,但不幸遇到了相同的错误。
猜你喜欢
  • 2015-02-27
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
  • 2019-07-20
  • 2016-05-16
  • 2018-10-27
  • 2020-07-16
相关资源
最近更新 更多