Icono incrustado en script python

¿Alguien sabe cómo incrustar un ícono en un script de Python, de modo que cuando creo mi ejecutable independiente (usando pyinstaller) no necesito incluir el archivo .ico? Sé que esto es posible con py2exe, pero en mi caso tengo que usar Pyinstaller, ya que no tuve éxito usando el primero. Estoy usando Tkinter.

Sé sobre iconbitmap(iconName.ico) pero eso no funciona si quiero crear un archivo ejecutable de un archivo.

En realidad, la función iconbitmap solo puede recibir un nombre de archivo como argumento, por lo que debe haber un archivo allí. Puede hacer una versión Base64 del icono (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!

Probablemente no necesite esto, pero alguien más podría encontrarlo útil. Descubrí que puede 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) 

Solución de 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. Agrega 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. Úsalo de esta manera:
 root = tk.Tk() root.iconbitmap(default=datafile) 

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

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

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

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)