Pyinstaller не очень хорошо работает с ImageTk и Tkinter - PullRequest
0 голосов
/ 06 октября 2018

Я пытаюсь использовать 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 голосов
/ 19 декабря 2018

Я опоздал на 2 месяца, но чтобы добавить более простое решение, мне удалось заставить его работать, добавив пару скрытых импортов:

hiddenimports=['PIL', 'PIL._imagingtk', 'PIL._tkinter_finder']
0 голосов
/ 25 ноября 2018

Я знаю, что этому больше месяца, но я столкнулся с этим, а также, похоже, не хотел работать каким-либо из предложенных способов.
Видя, как другие люди могут застрять в этомв будущем, вот как я использовал исправление для этого.
Как только вы впервые создаете исполняемый файл с помощью 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 )

Я просто скопировал PIL в файл, используя datas следующим образом:

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

Теперь все работает как надо, пока я не найду лучшее решениекогда у меня будет время.

Имейте в виду, что файл спецификации будет перезаписан, если PyInstaller будет использоваться на main_file.py (в данном случае).Вместо этого следует использовать pyinstaller main_file.spec.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...