Ricardo Pérez López
IES Doñana, curso 2025/2026
Tkinter es la biblioteca estándar de Python para crear interfaces gráficas de usuario (GUI).
Proporciona una forma sencilla de construir aplicaciones con ventanas, botones, etiquetas, campos de texto y otros elementos visuales.
Es multiplataforma, lo que significa que las aplicaciones creadas con Tkinter pueden ejecutarse en diferentes sistemas operativos como GNU/Linux, Windows y macOS sin modificaciones importantes.
Es relativamente fácil de aprender y usar, lo que la hace adecuada para principiantes en el desarrollo de interfaces gráficas.
Tkinter forma parte de la biblioteca estándar de Python, por lo que debería encontrarse en cualquier instalación normal de Python.
Esa es una de las principales ventajas que tiene respecto a otras bibliotecas de GUI como PyQt.
Al ejecutar el siguiente comando:
desde la línea de comandos del sistema operativo, se debería abrir una ventana que muestre una interfaz Tk simple para saber si Tkinter está instalado correctamente en su sistema.
También muestra qué versión de Tcl/Tk está instalada para que sepamos qué versión específica de la documentación tenemos que consultar.
Para saber más sobre Tkinter o resolver dudas técnicas puntuales, se pueden consultar los siguientes enlaces:
Página de
documentación oficial de Tkinter en python.org
Información técnica y oficial de Tkinter.
Es un extenso tutorial sobre como crear interfaces de usuario con Tkinter. Explica conceptos clave y muestra enfoques recomendados para usar la API moderna.
Tkinter 8.5 reference: a GUI for Python
Documentación de referencia sobre Tkinter 8.5 donde se detallan clases disponibles, métodos y opciones.
Un Hola, mundo muy elemental en Tkinter podría ser el siguiente:
Este programa simplemente abre una ventana en la que se muestra
un botón con el texto «Hola, mundo».
El botón tiene el ancho justo para visualizar el texto que contiene, y la ventana tiene prácticamente el tamaño justo para contener el botón.
Al pulsar ese botón no ocurre nada, y para salir del programa hay que finalizarlo cerrando la ventana o directamente terminando el proceso del intérprete.
Tk)La clase Tk representa la ventana principal de la
aplicación, y esta es importante por varios motivos:
Toda aplicación Tkinter debe tener una ventana principal que sea
instancia de Tk (y lo normal es que sólo sea exactamente
una).
Las instancias de Tk son contenedores de elementos
gráficos (también llamados widgets). Salvo casos excepcionales
(como las ventanas de diálogo), los widgets se deben visualizar
siempre dentro de un contenedor y la instancia de Tk que
creamos para nuestro programa nos sirve como contenedor principal de
nuestra aplicación.
Sin un contenedor, no podríamos visualizar widgets, así que la ventana principal es imprescindible en cualquier aplicación Tkinter.
El funcionamiento de la interfaz gráfica realmente comienza
cuando activamos el bucle principal de la ventana principal invocando su
método mainloop.
En interfaces gráficas, la ejecución del programa está dirigida por eventos (por ejemplo, pulsar un botón o elegir una opción en un menú) y no por un flujo lineal de instrucciones como en los programas de consola.
El bucle principal (mainloop) de Tkinter es la función que pone en marcha la aplicación gráfica y la mantiene funcionando hasta que el usuario la cierra.
El bucle principal se activa invocando el método
mainloop sobre la instancia de Tk que
representa la ventana principal de la aplicación.
A partir de ese momento, el programa irá atendiendo los eventos que se vayan produciendo ejecutando el código encargado de manejar o gestionar dicho evento.
Sus funciones principales son:
Inicia la gestión de eventos:
Tkinter entra en un bucle infinito en el que espera la aparición de eventos (pulsaciones de los botones del ratón, pulsaciones de teclas, redimensionado de ventanas, etc.) y los gestiona según los manejadores de eventos que se hayan definido en el código.
Mantiene visible la ventana:
Mientras mainloop está activo, la ventana de la
aplicación se sigue mostrando y respondiendo a interacciones. Si no se
llama a mainloop, la ventana puede crearse y cerrarse
instantáneamente, porque el programa termina sin esperar
eventos.
Es un bucle de eventos:
Internamente, comprueba si hay nuevos eventos en la cola de eventos del sistema operativo y los procesa uno a uno, actualizando la interfaz cuando sea necesario.
El bucle principal termina:
Cuando el usuario cierra la ventana principal, o
Si el programa llama explícitamente al método quit
de la ventana principal para finalizarlo.
Aspectos importantes a tener en cuenta:
El bucle principal es bloqueante:
Cuando se llama a mainloop, no se ejecuta nada después
de esa línea hasta que el bucle termina.
No se debe llamar varias veces:
Normalmente, se llama una sola vez. Si se necesita reiniciar la
ventana, se debe crear un nuevo Tk o usar
mainloop tras finalizar la ejecución anterior, pero no se
debe intentar mantener dos ejecuciones simultáneas de
mainloop.
Los widgets son los componentes visuales de la interfaz.
Los más comunes son:
Label: muestra texto o imágenes
Button: botón pulsable
Entry: campo de texto de una sola línea
Text: área de texto multilínea
Checkbutton: casilla de verificación
Radiobutton: botón de opción (selección
exclusiva)
LabelEl widget Label se utiliza para mostrar
texto o imágenes.
No permite interacción directa por parte del usuario.
Usos comunes:
Títulos y subtítulos.
Etiquetas descriptivas de otros widgets.
Mensajes informativos.
Ejemplo:
Con estilos:
ButtonEl widget Button representa un botón
pulsable que ejecuta una función cuando se pulsa.
Usos comunes:
Confirmar acciones.
Lanzar cálculos.
Cerrar ventanas.
Ejemplo:
Cambiar el texto dinámicamente:
EntryEntry es un campo de texto de una sola
línea, pensado para introducir datos cortos.
Usos comunes:
Campos de formulario.
Búsquedas.
Ejemplo:
Obtener y modificar su contenido:
TextEl widget Text permite introducir y mostrar
texto multilínea.
Usos comunes:
Editores de texto simples.
Cuadros de comentarios.
Visualización de logs.
Ejemplo:
Insertar y borrar contenido:
CheckbuttonCheckbutton representa una casilla de
verificación que puede estar activada o desactivada.
Usos comunes:
Opciones independientes.
Preferencias del usuario.
Suele utilizarse junto con BooleanVar o
IntVar.
Ejemplo:
Consultar el estado:
RadiobuttonRadiobutton permite seleccionar una opción
entre varias, siendo excluyentes entre sí.
Usos comunes:
Selección de una sola alternativa.
Formularios.
Todos los botones del grupo comparten la misma variable de control.
Ejemplo:
Obtener la opción seleccionada:
Muchos widgets de Tkinter comparten un conjunto de atributos (u opciones) que controlan su apariencia y comportamiento.
Estos atributos pueden indicarse al crear el widget o modificarse
posteriormente mediante el método config().
text)El atributo text define el contenido
textual que muestra el widget.
Widgets habituales:
Label
Button
Checkbutton
Radiobutton
Ejemplo:
Modificar el texto en tiempo de ejecución:
fg y
bg)Los colores se controlan principalmente con:
fg o foreground: color del
texto.
bg o background: color de
fondo.
Ejemplo:
Los colores pueden indicarse por nombre ("red",
"blue") o en formato hexadecimal
("#ff0000").
font)El atributo font controla el tipo de letra,
tamaño y estilo.
Formato habitual:
Ejemplo:
Estilos comunes:
"bold"
"italic"
"underline"
width
y height)Los atributos width y height definen el
tamaño del widget, aunque su significado depende del
tipo de widget:
En Label, Button y Entry:
número de caracteres.
En Text: caracteres (ancho) y líneas
(alto).
Ejemplos:
getObtiene el contenido actual del widget.
insertInserta texto en una posición determinada, con la siguiente sintaxis:
deleteElimina contenido entre dos posiciones, con la siguiente sintaxis:
| Widget | get |
insert |
delete |
|---|---|---|---|
Entry |
Sí | Sí | Sí |
Text |
Sí | Sí | Sí |
Tkinter no posiciona los widgets automáticamente. Para ello se usan gestores de geometría (geometry managers).
Los gestores de geometría en Tkinter son pack,
grid y place.
Su función es decidir dónde y cómo se colocan los widgets dentro
de un contenedor (una ventana Tk o un
Frame).
Un widget no aparece en pantalla hasta que se le aplica alguno de estos métodos.
Los gestores de geometría son el mecanismo que usa Tkinter para:
Asignar posición.
Asignar tamaño.
Reorganizar los widgets cuando la ventana cambia de tamaño.
Cada contenedor (Tk, Frame, etc.) puede
usar sólo un gestor de geometría a la vez.
pack, grid y
placeLos tres gestores de geometría en Tkinter son:
pack: organiza los widgets en bloques (arriba,
abajo, izquierda, derecha).
grid: organiza los widgets en filas y
columnas.
place: posicionamiento absoluto
(coordenadas).
Ejemplo con pack:
Ejemplo con grid:
No se deben mezclar distintos gestores de geometría en el mismo contenedor.
Valores posibles del parámetro side en el método
pack:
| Valor | Significado |
|---|---|
tk.TOP (por defecto) |
Coloca el widget en la parte superior del contenedor |
tk.BOTTOM |
Coloca el widget en la parte inferior |
tk.LEFT |
Coloca el widget a la izquierda |
tk.RIGHT |
Coloca el widget a la derecha |
Valores posibles del parámetro fill en el método
pack:
| Valor | Significado |
|---|---|
tk.NONE (por defecto) |
No se expande; el widget mantiene su tamaño natural |
tk.X |
Se expande horizontalmente, ocupando todo el ancho disponible |
tk.Y |
Se expande verticalmente, ocupando todo el alto disponible |
tk.BOTH |
Se expande en ambas direcciones (ancho y alto) |
Frame para dividir la ventanaFrame es un contenedor que permite agrupar widgets y
estructurar la interfaz.
Usar Frame facilita:
Interfaces más claras.
Reutilización de componentes.
Uso combinado de distintos gestores de geometría.
Para que la interfaz se adapte al tamaño de la ventana:
Usar fill y expand con
pack.
Configurar pesos con grid_rowconfigure y
grid_columnconfigure.
Ejemplo:
packCuando usas pack para colocar un widget:
Por defecto:
El widget se coloca en la dirección indicada
(side=tk.TOP por defecto).
Su tamaño se ajusta al contenido.
No crece si la ventana se redimensiona.
fillEl argumento fill indica en qué dirección debe
crecer el widget cuando la ventana cambia de tamaño.
Puede ser:
fill=tk.X: se expande horizontalmente.
fill=tk.Y: se expande verticalmente.
fill=tk.BOTH: se expande en ambas
direcciones.
Por ejemplo:
Si cambias el tamaño de la ventana, el frame solo se hace más ancho, no más alto.
expandexpand indica si el espacio extra disponible debe
ser asignado al widget:
expand=False: no toma espacio extra.
expand=True: toma espacio extra disponible.
Por ejemplo:
Resultado:
El frame se expande en ambas direcciones
(fill=tk.BOTH).
Además, ocupa todo el espacio extra
(expand=True).
Esto permite que un widget se adapte al redimensionado de la ventana, logrando un diseño responsive.
Por ejemplo:
import tkinter as tk
root = tk.Tk()
root.geometry("400x300")
top_frame = tk.Frame(root, bg="red", height=50)
top_frame.pack(side=tk.TOP, fill=tk.X) # Barra horizontal
left_frame = tk.Frame(root, bg="green", width=100)
left_frame.pack(side=tk.LEFT, fill=tk.Y) # Barra lateral vertical
main_frame = tk.Frame(root, bg="blue")
main_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) # Área principal
root.mainloop()Resultado:
top_frame: se ajusta horizontalmente.
left_frame: se ajusta verticalmente.
main_frame: ocupa todo el espacio restante y se
adapta al redimensionado.
Un callback es una función que se pasa como argumento y se ejecuta cuando ocurre un evento.
command=Muchos widgets (como Button) aceptan el parámetro
command:
Se pasa la función sin paréntesis.
bindbind permite asociar funciones a eventos más
generales:
Algunos eventos comunes:
<Button-1>: pulsación del botón izquierdo del
ratón.
<Key>: pulsación de cualquier tecla.
<Return>: pulsación de la tecla
Enter.
Las variables de control enlazan el estado de un widget con una variable Python.
Tipos habituales:
StringVar
IntVar
DoubleVar
BooleanVar
Ejemplo:
Son especialmente útiles con Entry,
Checkbutton y Radiobutton.