Python Приложение не может найти файл изображения (.png) во время выполнения - PullRequest
0 голосов
/ 27 февраля 2020

Итак, я создал это python приложение с ткинтером GUI. Я использовал pyinstaller, чтобы преобразовать файл .py в исполняемый файл (.exe), чтобы я мог отправить его неопытным людям для использования.

Когда я запускаю код с этими двумя закомментированными строками ...

root = tk.Tk()
root.title("DOJ Pricing Analyzer")
root.resizable(False,False)
#canvas1 = tk.Canvas(root, width = 350, height = 500, bg = 'white') <-----------This line commented out
#image = ImageTk.PhotoImage( file = "matrix.png" )<--------------This line commented out
canvas1.create_image(0, 0, image = image, anchor = NW)
canvas1.create_text(185,75,fill="white",font="Impact 15 ",

Приложение отлично работает при запуске (в формате .exe в Windows), кроме главного окна это чистый белый холст.

Проблема в том, что мне нужно приложение, чтобы использовать matrix.png, чтобы пользовательский интерфейс действительно выглядел круто и не скучно.

Поэтому после нескольких часов исследований я попытался поиграться с файлом .spe c разными способами. Я думал, что это поможет ... (я просто добавил файл matrix.png к данным), затем запустил pyinstaller DOJPriceAnalyzer.py --onefile из Powershell

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['DOJPriceAnalyzer.py'],
             pathex=['C:\\Users\\CV7617\\Desktop\\program'],
             binaries=[],
             datas=[('C:\\Users\\CV7617\\Desktop\\program\matrix.png','.')],
             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='DOJPriceAnalyzer',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True )

Но после запуска .exe это произвело, я остался с этой ошибкой:


Traceback (most recent call last):
  File "DOJPriceAnalyzer.py", line 16, in <module>
  File "site-packages\PIL\ImageTk.py", line 89, in __init__
  File "site-packages\PIL\ImageTk.py", line 58, in _get_image_from_kw
  File "site-packages\PIL\Image.py", line 2809, in open
FileNotFoundError: [Errno 2] No such file or directory: 'matrix.png'
[3080] Failed to execute script DOJPriceAnalyzer
Exception ignored in: <function PhotoImage.__del__ at 0x0F9F07C8>
Traceback (most recent call last):
  File "site-packages\PIL\ImageTk.py", line 118, in __del__
AttributeError: 'PhotoImage' object has no attribute '_PhotoImage__photo'

Я пробовал много комбинаций вещей (потерянный счет в этом пункте) включая это .. (изменяя .spe c файлы к этим, затем выполняя те же действия запуска pyinstaller DOJPriceAnalyzer.py --onefile, затем запуская файл .exe)

datas=[(matrix.png','.')],

и

datas=[('C:\\Users\\CV7617\\Desktop\\program','data')],

Но все они выдают одну и ту же ошибку. Какие-либо предложения?

1 Ответ

1 голос
/ 28 февраля 2020

Я думаю, проблема в том, что вы не сохраняете ссылку на изображение. Посмотрите на эту ссылку для объяснения .

Чтобы добавить постоянную ссылку, просто добавьте строку, такую ​​как

canvas1.im = image

canvas.create_image документы упоминают об этом

"Объект изображения. Это должен быть PhotoImage или BitmapImage или совместимый объект (такой как PIL PhotoImage). Приложение должно сохранять ссылку на изображение объект", но это легко не заметить!

Не думаю, что это специфическая c проблема Pyinstaller. Ваш подход добавления изображения в datas в файле spe c был правильным, и это должно работать нормально.

datas = [('matrix.png','.')]

Я попытался воспроизвести ваш случай, используя предоставленный вами фрагмент кода, и мне удалось воспроизвести ошибку и затем исправить ее с помощью этого метода, так что, надеюсь, это вам тоже поможет.

...