La librería Tkinter de Python no ofrece un mecanismo directo de «cambio de marco» como los frameworks web. En su lugar, se gestiona la visibilidad de múltiples marcos dentro de una única ventana principal para crear la ilusión de cambiar entre diferentes pantallas o secciones. Este tutorial demuestra cómo construir una interfaz de usuario dinámica y organizada con esta técnica.
Tabla de contenido
- Creando Marcos y un Contenedor
- Cambiando Marcos con una Función
- Ejemplo: Una Aplicación de Navegación Simple
- Mejorando tu IU
Creando Marcos y un Contenedor
La idea principal es crear varios marcos, cada uno representando una «página» o sección diferente de tu aplicación. Todos se colocan dentro de un único marco contenedor, que actúa como el área de visualización principal. Solo un marco es visible en un momento dado.
import tkinter as tk
root = tk.Tk()
root.title("Ejemplo de Cambio de Marco")
# Marco contenedor
container = tk.Frame(root)
container.pack(side="top", fill="both", expand=True)
# Crear marcos
frame1 = tk.Frame(container)
frame2 = tk.Frame(container)
# Colocar marcos (ocultar inicialmente frame2)
frame1.pack(fill="both", expand=True)
frame2.pack(fill="both", expand=True)
frame2.pack_forget()
# Añadir widgets a los marcos
label1 = tk.Label(frame1, text="Este es el Marco 1")
label1.pack(pady=20)
label2 = tk.Label(frame2, text="Este es el Marco 2")
label2.pack(pady=20)
Cambiando Marcos con una Función
Una función gestiona la visibilidad de los marcos. Oculta el marco actualmente visible y luego muestra el marco seleccionado.
def show_frame(frame):
for f in (frame1, frame2): # Extender esta lista para más marcos
if f == frame:
f.pack(fill="both", expand=True)
else:
f.pack_forget()
Ejemplo: Una Aplicación de Navegación Simple
Aquí hay un ejemplo completo con dos botones de navegación:
import tkinter as tk
root = tk.Tk()
root.title("Ejemplo de Cambio de Marco")
container = tk.Frame(root)
container.pack(side="top", fill="both", expand=True)
frame1 = tk.Frame(container)
frame2 = tk.Frame(container)
frame1.pack(fill="both", expand=True)
frame2.pack(fill="both", expand=True)
frame2.pack_forget()
label1 = tk.Label(frame1, text="Este es el Marco 1")
label1.pack(pady=20)
label2 = tk.Label(frame2, text="Este es el Marco 2")
label2.pack(pady=20)
def show_frame(frame):
for f in (frame1, frame2):
if f == frame:
f.pack(fill="both", expand=True)
else:
f.pack_forget()
button1 = tk.Button(root, text="Ir al Marco 1", command=lambda: show_frame(frame1))
button1.pack()
button2 = tk.Button(root, text="Ir al Marco 2", command=lambda: show_frame(frame2))
button2.pack()
root.mainloop()
Mejorando tu IU
Este es un framework básico. Considera estas mejoras:
- Más Marcos: Añade más marcos y actualiza la función
show_frame
según corresponda. - Gestores de Diseño: Explora
grid
oplace
para diseños más complejos. - Estilo: Usa temas, colores y widgets personalizados para mejorar el atractivo visual.
- Enlazado de Datos: Usa variables para actualizar dinámicamente el contenido del marco.
- Manejo de Errores: Implementa un manejo de errores robusto para una aplicación más estable.
Este método ofrece una forma limpia de gestionar múltiples vistas en tu aplicación Tkinter, simulando eficazmente el cambio de marco.