WhatsApp

  

5 Cómo acomodar tus widgets: pack, grid y place en Tkinter

Guía completa para dominar los geometry managers de Tkinter (pack, grid y place). Aprende cuándo usar cada uno, ejemplos prácticos y buenas prácticas.

Cómo acomodar tus widgets: pack, grid y place en Tkinter

Tkinter ofrece tres gestores de geometría diferentes. Cada uno tiene su propio modelo de disposición y casos de uso óptimos. En este artículo compararemos pack(), grid() y place(), explicaremos cuándo elegir pack o grid, y mostraremos ejemplos de código listos para copiar.


Visión general de los gestores de geometría

1️⃣ pack()

  • Organiza los widgets en una única dirección: top, bottom, left o right.
  • Ideal para interfaces simples o para rellenar áreas completas (p. ej., una barra de menú o un Frame que ocupe todo el ancho).
  • Usa opciones como fill, expand y side para afinar el comportamiento.
  • No permite posicionar widgets en una cuadrícula explícita.

2️⃣ grid()

  • Distribuye los widgets en una tabla de filas y columnas.
  • Permite alineación fina mediante los parámetros row, column y sticky.
  • Ideal para formularios, paneles de control y cualquier UI que requiera alineación estructurada.
  • Se combina bien con weight en grid_rowconfigure y grid_columnconfigure para crear diseños responsivos.

3️⃣ place()

  • Posiciona los widgets mediante coordenadas absolutas (x, y) o relativas (relx, rely).
  • Brinda máximo control visual, pero es frágil frente a cambios de tamaño de ventana o de DPI.
  • Se recomienda sólo para casos muy específicos como pop‑ups personalizados o animaciones.
  • En la práctica, la mayoría de los desarrolladores evitan place() en favor de pack y grid.
Tkinter logo

¿Cuándo usar pack()?

Use pack cuando la disposición sea lineal y no necesite alineación de cuadrícula. Escenarios típicos:

  • Barra de herramientas o menús que se extienden horizontalmente.
  • Ventanas con un único widget principal (por ejemplo, un Canvas que ocupa todo el espacio).
  • Diseños de tipo «master‑detail» donde el detalle ocupa el resto del espacio disponible.

Ejemplo práctico con pack:

import tkinter as tk
root = tk.Tk()
root.title("Ejemplo pack")
# Frame superior (barra de botones)
top_frame = tk.Frame(root, bg="#e0e0e0")
for txt in ["Nuevo", "Abrir", "Guardar"]:
    btn = tk.Button(top_frame, text=txt)
    btn.pack(side="left", padx=5, pady=5)
top_frame.pack(fill="x")  # ocupa todo el ancho
# Área principal (Canvas) que se expande
canvas = tk.Canvas(root, bg="white")
canvas.pack(fill="both", expand=True)
root.mainloop()

¿Cuándo usar grid()?

El gestor grid es la mejor opción para interfaces estructuradas en forma de tabla, como formularios, paneles de configuración o dashboards.

  • Necesitas alinear etiquetas y campos de texto en columnas.
  • Quieres que la UI se adapte al redimensionamiento de la ventana.
  • Requieres que ciertos widgets “crezcan” junto con la ventana (usando weight).

Ejemplo avanzado con grid (fila, columna y sticky):

import tkinter as tk
root = tk.Tk()
root.title("Formulario con grid")
root.geometry("400x200")
# Configuración de pesos para que la columna 1 (campo) se expanda
root.grid_columnconfigure(1, weight=1)
root.grid_rowconfigure(3, weight=1)  # la última fila (botones) se mantiene fija
# Etiquetas
labels = ["Nombre:", "Email:", "Teléfono:"]
for i, txt in enumerate(labels):
    tk.Label(root, text=txt).grid(row=i, column=0, sticky="e", padx=5, pady=5)
# Entradas (columna 1)
entry_name = tk.Entry(root)
entry_email = tk.Entry(root)
entry_phone = tk.Entry(root)
entry_name.grid(row=0, column=1, sticky="we", padx=5, pady=5)
entry_email.grid(row=1, column=1, sticky="we", padx=5, pady=5)
entry_phone.grid(row=2, column=1, sticky="we", padx=5, pady=5)
# Botones en la última fila, alineados a la derecha
btn_frame = tk.Frame(root)
btn_frame.grid(row=3, column=0, columnspan=2, sticky="e", padx=5, pady=10)
tk.Button(btn_frame, text="Cancelar").pack(side="right", padx=5)
tk.Button(btn_frame, text="Aceptar").pack(side="right")
root.mainloop()

En este ejemplo:

  • sticky="e" alinea las etiquetas a la derecha de su celda.
  • sticky="we" permite que los Entry se expandan horizontalmente.
  • Los grid_columnconfigure y grid_rowconfigure con weight hacen que la UI sea responsiva.

Uso muy limitado de place()

Aunque place brinda posicionamiento pixel‑perfecto, su uso se desaconseja en la mayoría de los proyectos porque rompe la adaptabilidad a diferentes resoluciones y a los ajustes de DPI.

Ejemplo sencillo (solo demostrativo):

import tkinter as tk
root = tk.Tk()
root.title("Ejemplo place")
root.geometry("300x150")
lbl = tk.Label(root, text="Posicionado con place", bg="#ffc")
lbl.place(x=80, y=40, width=140, height=30)
root.mainloop()

Este código coloca la etiqueta en una posición fija (80, 40). Si el usuario redimensiona la ventana, la etiqueta no se moverá, lo que a menudo genera una UI poco amigable.


Mejores prácticas y trucos de depuración

  • No mezcles pack y grid en el mismo contenedor. Tkinter lanzará _tkinter.TclError: cannot use geometry manager grid inside . which already has slaves managed by pack.
  • Utiliza grid_propagate(False) cuando necesites fijar el tamaño de un Frame y evitar que grid lo redimensione automáticamente.
  • Para depurar la disposición, llama a root.update_idletasks() y luego imprime widget.winfo_geometry() para ver la posición y tamaño real.
  • Si trabajas con monitores de alta densidad (Retina, 4K), usa tk scaling para ajustar la escala de los widgets y evitar que place se vea pixelado.

Compatibilidad, rendimiento y escalabilidad

Los tres gestores están disponibles desde la primera versión de Tkinter (Python 2.0) y siguen siendo compatibles con Python 3.x. En términos de rendimiento, la diferencia es insignificante para la mayoría de las aplicaciones de escritorio; sin embargo, grid tiende a ser ligeramente más rápido que pack en interfaces complejas porque realiza menos cálculos de relleno.

Para aplicaciones que requieran responsive design (redimensionamiento dinámico, soporte multi‑monitor), grid es la elección natural. Si la UI es estática y lineal, pack simplifica el código y reduce la probabilidad de errores.


Conclusión

Dominar pack(), grid() y place() es esencial para crear interfaces profesionales con Tkinter. Recuerda:

  • Usa pack para disposiciones lineales y simples.
  • Prefiere grid para formularios y diseños estructurados; aprovecha sticky y weight para responsividad.
  • Reserva place para casos muy específicos donde el control absoluto sea imprescindible.

Con estas guías y los ejemplos listos para copiar, estarás preparado para diseñar GUIs limpias, mantenibles y adaptables a cualquier pantalla.

 

5 Cómo acomodar tus widgets: pack, grid y place en Tkinter
ASIMOV Ingeniería S. de R.L. de C.V., Emiliano Nava 10 diciembre, 2025
Compartir
Iniciar sesión dejar un comentario

  
4 Organizando tu GUI con Tkinter: Frame, Checkbutton y Radiobutton
Aprende a estructurar interfaces Tkinter usando Frame como contenedor y a gestionar Checkbutton y Radiobutton con variables de control (IntVar, BooleanVar, StringVar). Incluye un ejemplo completo y buenas prácticas.