Вопрос:

Python Pyinstaller связать образ в графическом интерфейсе в один файл EXE?

python tkinter exe photo

2243 просмотра

2 ответа

71 Репутация автора

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

lblLogo=Label(main)
lblLogo.grid(row=3,column=11,rowspan=4)

try:
    filelocation="C:/Documents/Python/ScreenPartNumberProgram/"
    KasonLogo=PhotoImage(file=filelocation+"KasonLogo.png")
    KasonLogo=KasonLogo.zoom(25,20)
    KasonLogo=KasonLogo.subsample(50,50)
    lblLogo.config(image=KasonLogo)
    icon=PhotoImage(file=filelocation+"KasonLogo.png")
    main.tk.call('wm','iconphoto',main._w,icon)
except:
    print("warning: could not load photos")
    lblLogo.config(text="[KasonLogo.png]")

EXE-файл открывается и отлично работает на моем компьютере. Я использовал эту команду, чтобы получить .exe:

pyinstaller --onefile --noconsole myscript.py

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

заранее спасибо

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

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

Автор: jaredmt Источник Размещён: 07.01.2018 04:19

Ответы (2)


1 плюс

71 Репутация автора

Решение

СВЯТАЯ КОРОВА ! После нескольких дней головных болей я НАЧИНАЛ найти подход, который работает ... вот что я сделал, чтобы заставить программу работать без внешнего файла изображения:

Шаг 1: закодируйте файл изображения (обратите внимание, что это должен быть GIF. Вы можете конвертировать его с помощью краски):

import base64
with open("MyPicture.gif", "rb") as image_file:
    encoded_string = base64.b64encode(image_file.read())
print(encoded_string)#print string to copy it (see step 2)

Шаг 2: следующий шаг - скопировать и вставить строку в отдельный файл myimages.py и сохранить его как переменную. например:

imageString = b'R0lGODlhyADIAPcAAAA .....blah blah really long string.......'

шаг 3: затем импортируйте myimages.py в основную программу и вызовите переменную

from myimages import *
pic=imageString#GIF decoded to string. imageString from myimages.py
render = PhotoImage(data=pic)
myLabel.config(image=render)

Шаг 4: в спецификации файла: включите myimages.py в качестве данных

# -*- mode: python -*-

block_cipher = None

#instructions: pyinstaller --onefile --noconsole myProgram.spec

file_name = 'myProgram'
add_files=[('myimages.py','module')]

a = Analysis([file_name+'.py'],
             pathex=['C:\\Program Files (x86)\\Python36-32\\Scripts'],
             binaries=[],
             datas=add_files,
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=exclude_list,
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name=file_name,
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=False )

Шаг 5: наконец, вы можете скомпилировать в EXE:

pyinstaller --onefile --noconsole myProgram.spec

SIGH Если у кого-то есть лучшее решение, пожалуйста, опубликуйте его здесь. до тех пор я рад, что что-то работает ...

Автор: jaredmt Размещён: 11.01.2018 03:51

0 плюса

1 Репутация автора

Я столкнулся с той же проблемой, когда хотел включить файл .ico для использования в качестве значка для моего приложения tkinter. Вот как я заставил это работать:

  1. При сборке файла .exe с помощью PyInstaller я указал опцию --add-data с полным путем к моему .ico.

  2. Когда приложение запускается, оно должно распаковать все из .exe во временный каталог, поэтому я получаю путь к этому временному каталогу и использую его для указания временного расположения моего .ico-файла.

До того, как mainloop будет запущен, и с помощью 'tempfile', чтобы получить каталог временных файлов, и 'glob', чтобы проверить совпадение шаблонов файлов:

tempdir = tempfile.gettempdir()
icon_path = tempdir + '\\' + 'next_subdirectory_pattern' + '\\' + '*.ico'
icon_matches = glob.glob(icon_path)
if len(icon_matches) > 0:
    logo = icon_matches[0]
else:
    logo = ''
tk.Tk.iconbitmap(self, default=logo)

Вероятно, не самый красноречивый способ сделать это, но это работает.

Автор: rla Размещён: 09.05.2019 01:59
Вопросы из категории :
32x32