Вставить значок в скрипт Python - PullRequest
9 голосов
/ 29 марта 2012

Кто-нибудь знает способ встроить иконку в скрипт Python, чтобы при создании автономного исполняемого файла (с использованием pyinstaller) мне не нужно было включать файл .ico? Я знаю, что это возможно с py2exe, но в моем случае я должен использовать Pyinstaller, так как мне не удалось использовать первый. Я использую Tkinter.

Я знаю о iconbitmap(iconName.ico), но это не сработает, если я захочу создать исполняемый файл с одним файлом.

Ответы [ 4 ]

14 голосов
/ 15 апреля 2012

На самом деле функция iconbitmap может принимать только имя файла в качестве аргумента, поэтому там должен быть файл. Вы можете создать Base64 версию значка (строковую версию), перейдя по ссылке, загрузив файл и скопировав результат в исходный файл в виде переменной строки. Извлеките его во временный файл, наконец, передав этот файл в iconbitmap и удалив его. Все довольно просто:

import base64
import os
from Tkinter import *
##The Base64 icon version as a string
icon = \
""" REPLACE THIS WITH YOUR BASE64 VERSION OF THE ICON
"""
icondata= base64.b64decode(icon)
## The temp file is icon.ico
tempFile= "icon.ico"
iconfile= open(tempFile,"wb")
## Extract the icon
iconfile.write(icondata)
iconfile.close()
root = Tk()
root.wm_iconbitmap(tempFile)
## Delete the tempfile
os.remove(tempFile)

Надеюсь, это поможет!

8 голосов
/ 12 мая 2014

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

import Tkinter as tk

icon = """
    REPLACE THIS WITH YOUR BASE64 VERSION OF THE ICON
    """

root = tk.Tk()
img = tk.PhotoImage(data=icon)
root.tk.call('wm', 'iconphoto', root._w, img)
1 голос
/ 18 января 2017

Решение по ALI3N

Выполните следующие действия:

  1. Отредактируйте файл .spec следующим образом:
a = Analysis(....)
pyz = PYZ(a.pure)
exe = EXE(pyz,
          a.scripts,
          a.binaries + [('your.ico', 'path_to_your.ico', 'DATA')], 
          a.zipfiles,
          a.datas, 
          name=....
       )
  1. Добавьте это к вашему сценарию:
datafile = "your.ico" 
if not hasattr(sys, "frozen"):
    datafile = os.path.join(os.path.dirname(__file__), datafile) 
else:  
    datafile = os.path.join(sys.prefix, datafile)
  1. Используйте это так:
root = tk.Tk()
root.iconbitmap(default=datafile)

Потому что это не сработает после того, как вы скомпилируете скрипт с помощью Pyinstaller:

root = tk.Tk()
root.iconbitmap(default="path/to/your.ico")

Моя информация : python3.4, pyinstaller3.1.1

0 голосов
/ 26 ноября 2018

Это сработало для меня:

from tkinter import  PhotoImage
import base64
img = """
REPLACE THIS WITH YOUR BASE64 VERSION OF THE ICON
"""
img= base64.b64decode(img)

root = Tk()
img=PhotoImage(data=img) 
root.wm_iconphoto(True, img)
...