Insertar icono en script Python

Resuelto maupertius asked hace 12 años • 6 respuestas

¿Alguien sabe una manera de incrustar un ícono en un script de Python de modo que cuando cree mi ejecutable independiente (usando pyinstaller) no necesite incluir el archivo .ico? Sé que esto es posible con py2exe, pero en mi caso tengo que usar Pyinstaller, ya que no pude usar el primero. Estoy usando Tkinter.

Lo sé iconbitmap(iconName.ico), pero eso no funciona si quiero crear un archivo ejecutable.

maupertius avatar Mar 29 '12 23:03 maupertius
Aceptado

En realidad, la función iconbitmap solo puede recibir un nombre de archivo como argumento, por lo que es necesario que haya un archivo allí. Puede crear una versión Base64 del ícono (una versión de cadena) siguiendo el enlace, cargando el archivo y copiando el resultado en su archivo fuente como una cadena variable. Extráigalo a un archivo temporal, finalmente pase ese archivo a iconbitmap y elimínelo. Es bastante simple:

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)

¡Espero eso ayude!

Saúl Pilatowsky-Cameo avatar Apr 15 '2012 19:04 Saúl Pilatowsky-Cameo

Probablemente no necesites esto, pero alguien más podría encontrarlo útil. Descubrí que puedes hacerlo sin crear un archivo:

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)
freakrho avatar May 12 '2014 18:05 freakrho

Solución por ALI3N

Sigue estos pasos:

  1. Edite su archivo .spec de esta manera:
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. Añade esto a tu script:
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. Úselo de esta manera:
root = tk.Tk()
root.iconbitmap(default=datafile)

Porque esto no funcionará después de compilar su script con Pyinstaller:

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

Mi información : python3.4, pyinstaller3.1.1

D4LI3N avatar Jan 18 '2017 15:01 D4LI3N

Esto funcionó para mí:

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)
D V avatar Nov 26 '2018 13:11 D V