Skip to content

Tkinter


Tkinter es la biblioteca nativa de Python para interfaces gráficas (GUI).

Permite crear ventanas, botones, menús, formularios, cuadros de texto, y mucho más. Viene preinstalada con Python (no requiere pip install).


import tkinter as tk
ventana = tk.Tk() # Crea la ventana principal
ventana.title("Mi primera GUI") # Título
ventana.geometry("400x300") # Tamaño (ancho x alto)
ventana.mainloop() # Inicia el bucle principal
  • Tk() → crea la aplicación.
  • mainloop() → mantiene la ventana abierta escuchando eventos (clics, teclas, etc.).

Los widgets son los componentes visuales de Tkinter.

WidgetQué haceEjemplo
LabelTexto o imagen estáticatk.Label(ventana, text="Hola")
ButtonBotón con accióntk.Button(ventana, text="OK", command=f)
EntryCampo de texto de una líneatk.Entry(ventana)
TextÁrea de texto multilíneatk.Text(ventana, height=5)
FrameContenedor para agrupar widgetstk.Frame(ventana)
CheckbuttonCasilla on/offtk.Checkbutton(ventana, text="OK", variable=var)
RadiobuttonOpción excluyentetk.Radiobutton(ventana, value="A")
ListboxLista seleccionabletk.Listbox(ventana)
CanvasDibujo / gráficostk.Canvas(ventana, width=200)
MenuBarra o menú desplegabletk.Menu(ventana)

import tkinter as tk
def saludar():
etiqueta.config(text=f"Hola, {entrada.get()}!")
ventana = tk.Tk()
ventana.title("Ejemplo Widgets")
etiqueta = tk.Label(ventana, text="Escribe tu nombre:")
etiqueta.pack()
entrada = tk.Entry(ventana)
entrada.pack()
boton = tk.Button(ventana, text="Saludar", command=saludar)
boton.pack()
ventana.mainloop()

Tkinter tiene tres formas principales de organizar widgets:

GestorQué haceCuándo usarlo
pack()Apila widgets (arriba/abajo/lados)Layouts simples y rápidos
grid()Tabla filas/columnasFormularios alineados
place()Coordenadas absolutas (x, y)Posición pixel a pixel (poco flexible)
etiqueta1.grid(row=0, column=0)
entrada1.grid(row=0, column=1)
boton.grid(row=1, column=0, columnspan=2)

Puedes ejecutar funciones al hacer clic o escribir algo.

def al_hacer_click():
print("¡Botón presionado!")
boton = tk.Button(ventana, text="Haz clic", command=al_hacer_click)

También puedes manejar eventos con .bind():

def tecla_presionada(evento):
print("Tecla:", evento.char)
ventana.bind("<Key>", tecla_presionada)

Los Frames permiten dividir la interfaz en secciones.

frame_superior = tk.Frame(ventana)
frame_superior.pack()
tk.Label(frame_superior, text="Arriba").pack()
tk.Label(ventana, text="Abajo").pack()

var = tk.BooleanVar()
tk.Checkbutton(ventana, text="Acepto términos", variable=var).pack()
opcion = tk.StringVar(value="A")
tk.Radiobutton(ventana, text="Opción A", variable=opcion, value="A").pack()
tk.Radiobutton(ventana, text="Opción B", variable=opcion, value="B").pack()
lista = tk.Listbox(ventana)
for i in ["Python", "C++", "Java"]:
lista.insert(tk.END, i)
lista.pack()

tk.Label(ventana, text="Texto colorido", fg="white", bg="blue", font=("Arial", 14, "bold")).pack()

Tkinter soporta imágenes con PhotoImage (formato .png, .gif).

img = tk.PhotoImage(file="imagen.png")
tk.Label(ventana, image=img).pack()
ventana.mainloop()

menu = tk.Menu(ventana)
ventana.config(menu=menu)
submenu = tk.Menu(menu, tearoff=0)
menu.add_cascade(label="Archivo", menu=submenu)
submenu.add_command(label="Nuevo")
submenu.add_command(label="Salir", command=ventana.quit)

from tkinter import messagebox
messagebox.showinfo("Título", "Hola desde una ventana emergente")

import tkinter as tk
from tkinter import messagebox
def saludar():
nombre = entrada.get()
if nombre:
messagebox.showinfo("Saludo", f"Hola, {nombre}!")
else:
messagebox.showwarning("Advertencia", "Debes ingresar un nombre")
ventana = tk.Tk()
ventana.title("App Completa")
ventana.geometry("300x200")
tk.Label(ventana, text="Tu nombre:").pack(pady=5)
entrada = tk.Entry(ventana)
entrada.pack(pady=5)
tk.Button(ventana, text="Saludar", command=saludar).pack(pady=10)
ventana.mainloop()

ConceptoUso
Tk() + mainloop()Crear y mantener la ventana
WidgetsComponentes visuales (Label, Button, Entry…)
pack / grid / placeOrganizar el layout
command= / .bind()Reaccionar a clics y teclas
FrameAgrupar secciones de la UI
messageboxDiálogos emergentes