Ir al contenido

IDEAS PRÁCTICAS · ASIMOV INGENIERÍA

Modernizando tu interfaz: ttk y estilos en Tkinter

Aprende a transformar tus aplicaciones Tkinter con el módulo ttk, descubre sus ventajas visuales y cómo personalizar temas y estilos con ttk.Style().

Imagen ilustrativa · Compagnons / Unsplash.

Table of contents

No titles in the blog post

Modernizando tu interfaz: ttk y estilos en Tkinter

1. ¿Por qué ttk?

Desde su introducción en Python 2.7/3.1, ttk (Themed Tk) brinda widgets nativos del sistema operativo, lo que permite que tu GUI se vea moderna sin esfuerzo. En contraste, los widgets clásicos de tk usan el antiguo motor de dibujo de Tk, resultando en una apariencia plana y a menudo desfasada.

Lápiz rosa junto a bocetos de una interfaz en papel
Imagen ilustrativa · Vitalii Abakumov / Unsplash.
  • Aspecto nativo: botones, entradas y menús adoptan el tema de Windows, macOS o GNOME.
  • Temas reutilizables: ttk.Style() permite cambiar colores, fuentes y espaciado en todo el árbol de widgets.
  • Mejor accesibilidad: los widgets ttk exponen estados como focus, disabled y pressed que pueden ser estilizados de forma granular.

2. Creando widgets ttk básicos

La API es casi idéntica a la de tk, la única diferencia es el prefijo ttk. en la importación.

import tkinter as tk
from tkinter import ttk

root = tk.Tk()

# Botón ttk
btn = ttk.Button(root, text="Aceptar")
btn.pack(pady=5)

# Etiqueta ttk (Label)
lbl = ttk.Label(root, text="Nombre:")
lbl.pack(pady=5)

# Entrada ttk (Entry)
ent = ttk.Entry(root)
ent.pack(pady=5)

root.mainloop()

Los mismos widgets con tk se crean de la siguiente forma:

import tkinter as tk

root = tk.Tk()

btn = tk.Button(root, text="Aceptar")
btn.pack(pady=5)

lbl = tk.Label(root, text="Nombre:")
lbl.pack(pady=5)

ent = tk.Entry(root)
ent.pack(pady=5)

root.mainloop()

3. Personalizando con ttk.Style()

El objeto Style controla los themes y los estilos específicos de cada widget. A continuación, una guía rápida:

  1. Obtener el theme actual: style.theme_use()
  2. Cambiar de tema: style.theme_use('clam') (temas comunes: default, classic, vista, xpnative, clam)
  3. Definir un nuevo estilo: style.configure('My.TButton', foreground='white', background='#0066CC', font=('Helvetica', 11, 'bold'))
  4. Aplicar el estilo al crear el widget: ttk.Button(..., style='My.TButton')

Ejemplo completo:

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
style = ttk.Style(root)

# 1️⃣ Cambiar a un theme ligero que funciona bien en Linux/macOS
style.theme_use('clam')

# 2️⃣ Definir estilos personalizados
style.configure('Primary.TButton',
                foreground='white',
                background='#007BFF',
                font=('Segoe UI', 10, 'bold'))
style.map('Primary.TButton',
          background=[('active', '#0056b3'), ('disabled', '#c0c0c0')])

style.configure('Header.TLabel',
                foreground='#333',
                font=('Helvetica', 14, 'bold'))

# 3️⃣ Usar los estilos
lbl = ttk.Label(root, text='Usuario:', style='Header.TLabel')
lbl.grid(row=0, column=0, padx=10, pady=10, sticky='e')

entry = ttk.Entry(root, width=30)
entry.grid(row=0, column=1, padx=10, pady=10)

btn = ttk.Button(root, text='Iniciar sesión', style='Primary.TButton')
btn.grid(row=1, column=0, columnspan=2, pady=15)

root.mainloop()

Con style.map() puedes definir la respuesta visual a estados (active, pressed, disabled).

4. Comparativa visual: tk vs ttk

Widgets clásicos (tk)

import tkinter as tk

root = tk.Tk()

tk.Label(root, text='Nombre:').grid(row=0, column=0, padx=5, pady=5)
entry = tk.Entry(root)
entry.grid(row=0, column=1, padx=5, pady=5)

tk.Button(root, text='Enviar').grid(row=1, column=0, columnspan=2, pady=10)

root.mainloop()

Los widgets se renderizan con el estilo "retro" de Tk 8.5, sin soporte de temas del SO.

Widgets temáticos (ttk)

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
style = ttk.Style(root)
style.theme_use('clam')

ttk.Label(root, text='Nombre:').grid(row=0, column=0, padx=5, pady=5)
ttk.Entry(root).grid(row=0, column=1, padx=5, pady=5)
ttk.Button(root, text='Enviar').grid(row=1, column=0, columnspan=2, pady=10)

root.mainloop()

Los mismos controles adoptan el aspecto nativo del sistema operativo, con bordes suaves y tipografía acorde.

5. Buenas prácticas y trucos avanzados

  • Evita mezclar tk y ttk en la misma jerarquía visual. Si necesitas un widget clásico, colócalo en un contenedor separado y considera crear un estilo ttk.Frame que lo envuelva.
  • Reutiliza estilos. Declara estilos al inicio de la aplicación y reutilízalos en todos los widgets para mantener consistencia.
  • Modo oscuro. Usa el tema alt o crea un tema propio con style.theme_create() y colores oscuros (#2E2E2E, #CCCCCC).
  • Performance. ttk tiene una sobrecarga mínima; la diferencia con tk es
  • Depuración de estilos. Ejecuta print(style.theme_names()) y print(style.layout('TButton')) para inspeccionar la estructura interna.

6. Solución de problemas frecuente

ProblemaCausa típicaSolución
Los colores no cambianSe está usando el theme vista que ignora algunos atributosCambia a clam o alt antes de aplicar style.configure()
El widget no respeta la fuenteEl tema define la fuente en la opción font del layoutUsa style.configure('My.TLabel', font=('Arial',12)) y verifica con style.lookup('My.TLabel','font')
Los botones aparecen muy pequeños en HiDPIEscalado de DPI no habilitadoEjecuta root.tk.call('tk', 'scaling', 2.0) o usa tkinter.Tk().tk.call('tk', 'scaling', scaling_factor)

7. Compatibilidad y futuro

Los módulos tkinter y ttk están incluidos en la biblioteca estándar de Python desde la versión 2.7/3.1 y funcionan en Windows, macOS y la mayoría de distribuciones Linux con Tk 8.6+. La comunidad de CPython está trabajando en tkinter 8.7, que introducirá soporte nativo para temas oscuros y mejoras en ttk.

© 2025 TuBlogTech – Todos los derechos reservados.