Pyinstaller与ImageTk和Tkinter的配合不好

时间:2018-10-06 02:18:36

标签: python tkinter python-imaging-library pyinstaller

我正在尝试使用pyinstaller构建我一直在开发的程序,但是此后我遇到了二进制文件的问题。这是我的程序。

首先我运行了pyinstall test.py,然后我使用./dist/main/test运行了二进制文件,但是遇到了正常运行脚本(例如python3 test.py)时不会出现的错误。

Traceback (most recent call last):
  File "PIL/ImageTk.py", line 181, in paste
_tkinter.TclError: invalid command name "PyImagingPhoto"

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "magic-collection-tracker/test.py", line 22, in <module>
  File "magic-collection-tracker/test.py", line 11, in main
  File "PIL/ImageTk.py", line 120, in __init__
  File "PIL/ImageTk.py", line 185, in paste
ModuleNotFoundError: No module named 'PIL._tkinter_finder'

这是一个重现此问题的最小示例。

from PIL import ImageTk
import PIL.Image
from tkinter import *



window = Tk()
pil_img = PIL.Image.open('./scr_images/blank_card.png')
tkimage = ImageTk.PhotoImage(pil_img)
canvas = Canvas(window)
canvas.create_image(0,0,image=tkimage, anchor=NW)
canvas.pack()

window.mainloop()

我不正确地使用pyinstaller还是存在其他问题?

2 个答案:

答案 0 :(得分:0)

我知道这已经超过一个月了,但是我发现自己为此感到挣扎,而且似乎也不想以任何建议的方式工作。
看到其他人将来可能会陷入困境,这就是我使用此修补程序的方式。
首次使用PyInstaller创建可执行文件后,就会创建一个规范文件。
该文件如下所示(对于--onefile):

a = Analysis(['main_file.py'],
             pathex=['/root/folder'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='app_name',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=True )

我所做的只是使用datas以此方式将PIL复制到文件中:

datas=[('/usr/local/lib/python3.7/dist-packages/PIL/','PIL'),],

现在一切正常,直到有时间找到更好的解决方案为止。

请记住,如果在main_file.py上使用PyInstaller,则规范文件将被覆盖(在这种情况下)。相反,应该使用pyinstaller main_file.spec

答案 1 :(得分:0)

我现在晚了2个月,但是为了添加一个更简单的解决方案,我设法通过添加几个隐藏的导入使其工作:

hiddenimports=['PIL', 'PIL._imagingtk', 'PIL._tkinter_finder']