Ir al contenido

IDEAS PRÁCTICAS · ASIMOV INGENIERÍA

Crear menús profesionales en Tkinter (File, Edit, Help…)​

Guía completa para diseñar barras de menú profesionales en Tkinter: creación de menús y submenús, separadores, atajos de teclado y mejores prácticas con ejemplos listos para usar.

Imagen ilustrativa · Emile Perron / Unsplash.

Table of contents

No titles in the blog post

Crear menús profesionales en Tkinter (File, Edit, Help…)

Introducción

Tkinter es la biblioteca estándar de Python para crear interfaces gráficas. Una barra de menú bien estructurada es esencial para que el usuario perciba la aplicación como profesional y familiar. En este artículo aprenderás a:

Pantalla con un editor de código
Imagen ilustrativa · Chris Ried / Unsplash.
  • Crear la barra de menú principal con Menu.
  • Definir submenús típicos: Archivo, Edición y Ayuda.
  • Asociar funciones a cada ítem y agregar separadores.
  • Implementar atajos de teclado (p. ej. Ctrl+N, Ctrl+S).
  • Aplicar buenas prácticas de accesibilidad, compatibilidad y depuración.

Conceptos básicos de Menu

En Tkinter, el widget Menu actúa como contenedor jerárquico. Cada submenú es a su vez otro objeto Menu que se enlaza al menú padre mediante add_cascade.

Ventajas de Menu
  • Integración nativa con el gestor de ventanas del SO.
  • Soporte automático de accesibilidad (lectores de pantalla).
  • Gestión sencilla de atajos (accelerator).
Alternativas modernas
  • ttk.Menu: estilo temático, pero con limitaciones de personalización.
  • Frameworks externos (PyQt, wxPython): mayor potencia visual, mayor curva de aprendizaje.

1. Creación de la barra de menú principal

El primer paso es crear la instancia de Menu y asignarla a la ventana raíz mediante config(menu=menubar):

import tkinter as tk

root = tk.Tk()
root.title("Ejemplo de menú")

# Barra de menú principal
menubar = tk.Menu(root)
root.config(menu=menubar)

2. Submenús típicos: Archivo, Edición y Ayuda

A continuación se muestra cómo crear cada submenú y añadir ítems comunes.

# Submenú Archivo
archivo_menu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label="Archivo", menu=archivo_menu)

# Submenú Edición (opcional, aquí solo para ilustrar)
edicion_menu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label="Edición", menu=edicion_menu)

# Submenú Ayuda
ayuda_menu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label="Ayuda", menu=ayuda_menu)

3. Ítems, separadores y atajos de teclado

Para cada ítem usamos add_command. Los separadores se añaden con add_separator. Los atajos se indican con el argumento accelerator y se enlazan a la ventana mediante bind_all.

# Funciones de ejemplo
def nuevo():
    print("Nuevo documento")

def guardar():
    print("Guardar documento")

def salir():
    root.quit()

def mostrar_acerca():
    tk.messagebox.showinfo("Acerca de", "Demo de menús con Tkinter")

# Ítems del submenú Archivo
archivo_menu.add_command(label="Nuevo", accelerator="Ctrl+N", command=nuevo)
archivo_menu.add_command(label="Guardar", accelerator="Ctrl+S", command=guardar)
archivo_menu.add_separator()
archivo_menu.add_command(label="Salir", accelerator="Ctrl+Q", command=salir)

# Ítems del submenú Ayuda
ayuda_menu.add_command(label="Acerca de", command=mostrar_acerca)

# Atajos de teclado (globales)
root.bind_all("", lambda e: nuevo())
root.bind_all("", lambda e: guardar())
root.bind_all("", lambda e: salir())

4. Buenas prácticas y troubleshooting

  • Usar tearoff=0 para evitar que los menús se separen como ventanas flotantes, comportamiento no deseado en la mayoría de aplicaciones.
  • Separadores lógicos: agrupa ítems relacionados y evita menús demasiado extensos.
  • Gestión centralizada de atajos: declara los bind en un único bloque para facilitar el mantenimiento.
  • Internacionalización (i18n): usa gettext o diccionarios para traducir etiquetas y atajos.
  • Depuración: imprime el árbol de menús con menubar.winfo_children() si los ítems no aparecen.

5. Compatibilidad, rendimiento y escalabilidad

Los menús de Tkinter funcionan de forma idéntica en Windows, macOS y la mayoría de distribuciones Linux porque utilizan los widgets nativos del sistema. Sin embargo, ten en cuenta:

  • macOS: los menús aparecen en la barra de menús del sistema; accelerator se muestra automáticamente.
  • Linux (X11): algunos gestores de ventanas pueden no respetar los atajos de Ctrl si la aplicación no tiene foco; usa bind_all como se muestra.
  • Rendimiento: la creación de menús es prácticamente instantánea; el único cuello de botella proviene de la ejecución de los callbacks.

Ejemplo completo (Archivo + Ayuda)

El siguiente script puede copiarse y ejecutarse tal cual. Demuestra la barra de menú con atajos, separadores y manejo de eventos.

import tkinter as tk
from tkinter import messagebox

# ---------- Configuración inicial ----------
root = tk.Tk()
root.title("Demo: Menú profesional en Tkinter")
root.geometry("400x250")

# ---------- Funciones de los ítems ----------
def nuevo():
    messagebox.showinfo("Nuevo", "Crear un nuevo documento")

def guardar():
    messagebox.showinfo("Guardar", "Documento guardado con éxito")

def salir():
    if messagebox.askokcancel("Salir", "¿Quieres cerrar la aplicación?"):
        root.destroy()

def mostrar_acerca():
    messagebox.showinfo("Acerca de", "Aplicación de ejemplo\nTkinter 3.x")

# ---------- Creación del menú ----------
menubar = tk.Menu(root)
root.config(menu=menubar)

# Archivo
archivo_menu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label="Archivo", menu=archivo_menu)
archivo_menu.add_command(label="Nuevo", accelerator="Ctrl+N", command=nuevo)
archivo_menu.add_command(label="Guardar", accelerator="Ctrl+S", command=guardar)
archivo_menu.add_separator()
archivo_menu.add_command(label="Salir", accelerator="Ctrl+Q", command=salir)

# Ayuda
ayuda_menu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label="Ayuda", menu=ayuda_menu)
ayuda_menu.add_command(label="Acerca de", command=mostrar_acerca)

# ---------- Atajos de teclado globales ----------
root.bind_all("", lambda e: nuevo())
root.bind_all("", lambda e: guardar())
root.bind_all("", lambda e: salir())

# ---------- Bucle principal ----------
root.mainloop()

Conclusión

Con tan solo unas cuantas líneas de código puedes dotar a tu aplicación Tkinter de una barra de menú profesional, consistente y accesible. Aplica las buenas prácticas aquí descritas, adapta los atajos a tu dominio y mantén el código modular para facilitar su ampliación futura.