одиночный EXE-файл pyinstaller - изображение ico в заголовке главного окна tkinter

Я нашел некоторую информацию об этом здесь, в Stack Overflow, и пробовал это сделать, но у меня это не работает. Мне нужна помощь сообщества :)

Как следует из названия, я хочу добавить * .ico в свои окна tkinter. Проблема в том, что при создании одного 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