Establecer el icono de la ventana

Cuando intenté cambiar el ícono de la ventana en la esquina superior izquierda del feo “TK” rojo a mi propio favicon usando el código de abajo, Python lanzó un error:

from tkinter import * root = Tk() #some buttons, widgets, a lot of stuff root.iconbitmap('favicon.ico') 

Esto debería establecer el ícono como ‘favicon.ico’ (de acuerdo con la cantidad de publicaciones de los foros en toda la web). Pero desafortunadamente, todo lo que hace esta línea es lanzar el siguiente error:

 Traceback (most recent call last): File "d:\ladvclient\mainapp.py", line 85, in  root.iconbitmap(bitmap='favicon.ico') File "C:\Python33\lib\tkinter\__init__.py", line 1637, in wm_iconbitmap return self.tk.call('wm', 'iconbitmap', self._w, bitmap) _tkinter.TclError: bitmap "favicon.ico" not defined 

Lo que ya hice:

  • Revisé el camino – todo es 100% correcto
  • Probé otros formatos de archivo como .png o .bmp – ninguno funcionó
  • Busqué este problema en muchos sitios web

Y para el tercer punto, effbot.org, mi sitio favorito sobre Tkinter, me dijo que Windows ignora la función iconbitmap . ¡Pero esto no explica por qué arroja un error!

Hay algunas formas “piratas” para evitar ese problema, pero ninguna de ellas está escrita para Python 3.x.

Entonces, mi última pregunta es: ¿hay alguna forma de obtener un icono personalizado utilizando Python 3.xy Tkinter?

Además, no me digas que debo usar otra biblioteca GUI. Quiero que mi progtwig funcione en todas las plataformas. También quiero una versión codificada, no una solución py2exe o sth .

No debe tener favicon.ico en la misma carpeta que su script o, en concreto, en su ruta. Poner el nombre completo de la ruta. Por ejemplo, esto funciona:

 from tkinter import * root = Tk() root.iconbitmap(r'c:\Python32\DLLs\py.ico') root.mainloop() 

Pero esto explota con tu mismo error:

 from tkinter import * root = Tk() root.iconbitmap('py.ico') root.mainloop() 

De ninguna manera lo que se sugiere aquí funciona: el error “bitmap xxx no definido” está siempre presente. Y sí, le puse el camino correcto.

Lo que funcionó es esto:

 imgicon = PhotoImage(file=os.path.join(sp,'myicon.gif')) root.tk.call('wm', 'iconphoto', root._w, imgicon) 

donde sp es la ruta del script, y rootea la ventana raíz de Tk.

Es difícil entender cómo funciona (lo copié descaradamente de fedoraforums ) pero funciona

Esto me funciona con Python3 en Linux:

 import tkinter as tk # Create Tk window root = tk.Tk() # Add icon from GIF file where my GIF is called 'icon.gif' and # is in the same directory as this .py file root.tk.call('wm', 'iconphoto', root._w, tk.PhotoImage(file='icon.gif')) 
 #!/usr/bin/env python import tkinter as tk class AppName(tk.Frame): def __init__(self, master=None): tk.Frame.__init__(self, master) self.grid() self.createWidgets() def createWidgets(self): self.quitButton = tk.Button(self, text='Quit', command=self.quit) self.quitButton.grid() app = AppName() app.master.title('Title here ...!') app.master.iconbitmap('icon.ico') app.mainloop() 

¡Debería funcionar así!

Ambos códigos funcionan bien conmigo en Python 3.7 … espero que también te funcione a ti

 import tkinter as tk m=tk.Tk() m.iconbitmap("myfavicon.ico") m.title("SALAH Tutorials") m.mainloop() 

y no olvide mantener “myfavicon.ico” en la misma carpeta donde está presente el archivo de script del proyecto

Otro método

 from tkinter import * m=Tk() m.iconbitmap("myfavicon.ico") m.title("SALAH Tutorials") m.mainloop() 

[* NOTA: – la versión 3 de python funciona con tkinter y debajo de la versión 3, es decir, la versión 2 funciona con Tkinter]

Asegúrate de que el archivo .ico no esté dañado también. Recibí el mismo error que desapareció cuando probé un archivo .ico diferente.

Así que parece que root.iconbitmap() solo admite un directorio fijo.
sys.argv[0] devuelve el directorio desde el que se leyó el archivo, de modo que un código simple funcionaría para crear un directorio fijo.

 import sys def get_dir(src): dir = sys.argv[0] dir = dir.split('/') dir.pop(-1) dir = '/'.join(dir) dir = dir+'/'+src return dir 

Esta es la salida

 >>> get_dir('test.txt') 'C:/Users/Josua/Desktop/test.txt' 

EDITAR:
El único problema es que este método no funciona en Linux

 josua@raspberrypi:~ $ python Python 2.7.9 (default, Sep 17 2016, 20:26:04) [GCC 4.9.2] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.argv[0] '' >>> 

Me quedé atascado en eso también …

Finalmente logré establecer el ícono que quería usando el siguiente código:

 from tkinter import * root.tk.call('wm', 'iconphoto', root._w, PhotoImage(file='resources/icon.png')) 
 from tkinter import * from PIL import ImageTk, Image Tk.call('wm', 'iconphoto', Tk._w, ImageTk.PhotoImage(Image.open('./resources/favicon.ico'))) 

Lo anterior funcionó para mí.