pyinstaller единичен EXE файл - ico изображение в заглавието на главния прозорец на tkinter

Намерих малко информация тук в Stack Overflow за това и го изпробвах, но не работи за мен. Имам нужда от помощ от общността :)

Както подсказва заглавието, искам да добавя *.ico към моя tkinter windows. Проблемът е, че когато създавате един EXE файл с помощта на pyinstaller, това не е много ясно. Така че по-долу е точно това, което внедрих от информацията, събрана в Stack Overflow. Използване на Python 3.5 на 64-битова машина.

Името на моя скрипт е calculator.py Името на ico е calculator.ico

1. Добавих следните редове код към моя скрипт на Python:

import os
import sys

datafile = "calculator.ico"
if not hasattr(sys, "frozen"):
    datafile = os.path.join(os.path.dirname(__file__), datafile)
else:
    datafile = os.path.join(sys.prefix, datafile)


window = tkinter.Tk()
window.iconbitmap(default=datafile)

2а. След това създадох моя единствен EXE файл с pyinstaller, използвайки следните команди:

pyinstaller -w -F -i "C:\PythonProjects\Calc\calculator.ico" calculator.py

2б. Опитах също така да създам моя единствен EXE файл със следните команди, за да видя дали ще помогне:

pyinstaller --onefile --windowed --icon=calculator.ico calculator.py

3. След като pyinstaller създаде единичния EXE файл, добавих малко съдържание към *.spec файла - по-долу е пълният *.spec файл с добавено съдържание:

# -*- mode: python -*-

block_cipher = None


a = Analysis(['calculator.py'],
             pathex=['C:\\PythonProjects\\calc'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             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 + [('caclulator.ico', 'C:\\PythonProjects\\calc\\calculator.ico', 'DATA')],
          a.zipfiles,
          a.datas,
          name='calculator',
          debug=False,
          strip=False,
          upx=True,
          console=False , icon='calculator.ico')

Добавих следното към exe = EXE:

+ [('caclulator.ico', 'C:\\PythonProjects\\calc\\calculator.ico', 'DATA')]

След като добавих горното съдържание към спецификационния файл, изпълних следната команда.

pyinstaller calculator.spec

След като EXE е възстановен, стартирам EXE файла и получавам следното съобщение за грешка:

  • Неуспешно изпълнение на калкулатора на скрипта

Благодаря предварително!


person probat    schedule 26.02.2017    source източник
comment
Компилира ли се и работи ли правилно, ако не посочите .ico файла?   -  person highBandWidth    schedule 27.02.2017
comment
Да, ако не включа файла .ico и този допълнителен код в моя скрипт, той работи перфектно. Ето защо съм озадачен, защото изглежда, че други са имали успех, опитвайки горните битове.   -  person probat    schedule 27.02.2017
comment
Бъмп, не харесвам иконата на пера по подразбиране.   -  person probat    schedule 03.03.2017
comment
ами, предполагам, че ще бъда принуден да използвам иконата на перо по подразбиране...   -  person probat    schedule 15.03.2017
comment
Имам същия проблем и изпробвах всички предложения тук. Със сигурност има начин да направите това! По-неприятното е, че иконата е успешно пакетирана за .exe в прозореца на изследователя, но не може да се използва след това в заглавния прозорец на приложението.   -  person 10SecTom    schedule 25.04.2018


Отговори (3)


Направихте всичко както трябва. Но току-що пропуснахте една последна стъпка. Добавете следните редове в кода си и трябва да работи.

def resource_path(relative_path):    
try:       
    base_path = sys._MEIPASS
except Exception:
    base_path = os.path.abspath(".")

return os.path.join(base_path, relative_path)

И тогава се обадете на това.

window.iconbitmap(default=resource_path(datafile))
person Satyendra Sahani    schedule 28.03.2017

всичко, което трябва да направите, е да поставите .ico изображението в главната папка на вашия .py файл и след това, когато създавате .exe от вашия .py файл с помощта на pyinstaller, въвеждате следното „pyinstaller --onefile --icon=my. ico my.py", като посочите името на иконата, тя трябва да е .ico файл, ако не е, няма да работи.

person Oden Ikpi David    schedule 23.07.2019

За да премахнете иконата на перце по подразбиране във вашия прозорец, преместете иконата в главната папка на вашия .py файл и използвайте метода iconbitmap и задайте името на иконата, например... root = tk.Tk() root.iconbitmap( "myIcon.ico")

person Oden Ikpi David    schedule 23.07.2019
comment
Не мисля, че сте прочели въпроса, отговорът, който предоставихте, е за извикване на програма или скрипт на Python директно чрез *.py файла... това не е това, което задава въпросът. - person probat; 30.11.2019