Guía completa paso a paso
🧩 1. Entender el problema: por qué Tkinter no cambia el icono de la barra de tareas
Tkinter permite cambiar:
- El icono de la ventana → ✔
root.iconbitmap() - El icono interno de la aplicación → ✔
root.iconphoto()
Pero NO controla el icono de la barra de tareas.
En Windows, ese icono depende del ejecutable que está corriendo:
| Qué ejecutas | Icono que aparece |
|---|---|
python.exe | Icono de Python |
pythonw.exe | Icono de Python |
Doble clic a un .py | Icono asociado a Python |
Un .exe creado por ti | Tu icono personalizado |
Por eso, aunque cambies el icono dentro de Tkinter, la barra de tareas sigue mostrando el de Python.
🚀 2. Solución real: convertir tu script en un .exe con PyInstaller
Esta es la forma profesional y definitiva.
🛠 2.1 Instalar PyInstaller
En la terminal:
pip install pyinstaller
📦 2.2 Crear el ejecutable con tu icono
Coloca tu archivo icono.ico en la misma carpeta que tu script.
Luego ejecuta:
pyinstaller --noconsole --icon=icono.ico tu_script.py
Explicación:
--noconsole→ evita que se abra la consola negra--icon=icono.ico→ icono del ejecutabletu_script.py→ tu programa
📁 2.3 Dónde aparece tu .exe
PyInstaller crea dos carpetas:
dist/
build/
Tu ejecutable está en:
dist/tu_script/tu_script.exe
Ese .exe ya mostrará tu icono en la barra de tareas.
🎯 3. Código Tkinter correcto para iconos
Este es el código limpio y funcional:
import tkinter as tk
from PIL import Image, ImageTk
root = tk.Tk()
# Icono .ico (para Windows)
root.iconbitmap("icono.ico")
# Icono PNG (para Tkinter)
img = Image.open("icono.png")
icon = ImageTk.PhotoImage(img)
root.iconphoto(True, icon)
root.mainloop()
🧠 4. Consejos importantes para evitar errores
✔ mainloop() solo se llama una vez
Nunca lo pongas dos veces.
✔ Carga las imágenes después de crear root
Tkinter necesita un contexto activo.
✔ Usa .ico para el ejecutable
Windows no acepta PNG como icono del programa.
🎁 5. Bonus: estructura recomendada para proyectos Tkinter
mi_app/
│
├── icono.ico
├── icono.png
├── main.py
└── recursos/
└── imágenes, sonidos, etc.
Y el comando:
pyinstaller --noconsole --icon=icono.ico main.py
