Tutorial de Tkinter - Menubar
Uno de los elementos más comunes en la interfaz gráfica de usuario es la barra de menú. Normalmente una barra de menú se encuentra debajo de la barra de título para mostrar la serie de menús. Después de hacer clic en uno de los menús de nivel superior, se ampliará un submenú para mostrar más elementos de menú relevantes. Un submenú normalmente está ligado a un comando específico como open
, close
, save
o quit
.
Menús básicos de Tkinter
Crearemos nuestro primer ejemplo de menú que tiene el menú File
como en la mayoría de los editores. Sólo incluimos los submenús Open
, Save
y Quit
para simplificar.
import tkinter as tk
app = tk.Tk()
app.geometry("300x200")
app.title("Basic Menu Bar")
menubar = tk.Menu(app)
filemenu = tk.Menu(menubar)
filemenu.add_command(label="Open")
filemenu.add_command(label="Save")
filemenu.add_command(label="Exit")
menubar.add_cascade(label="File", menu=filemenu)
app.config(menu=menubar)
app.mainloop()
menubar = tk.Menu(app)
El parámetro dado del Menu
es el widget padre del menú creado. La línea de código de arriba significa que el widget de menú menubar
será el nivel superior del marco app
.
filemenu = tk.Menu(menubar)
De forma similar, filemenu
es el menú del widget menubar
, o sub-menú del marco app
.
filemenu.add_command(label="Open")
add_command
añade los comandos al menú filemenu
. label
es el texto que se muestra en el sub-menú.
menubar.add_cascade(label="File", menu=filemenu)
El filemenu
se añade al menubar
con el comando add_cascade
. File
es la etiqueta del menú que se muestra en el nivel superior del cuadro app
.
app.config(menu=menubar)
Aunque menubar
se crea para ser un widget hijo de app
, como explicamos anteriormente, todavía tienes que configurarlo para que sea el menu
de app
. De lo contrario, no se mostrará ninguna barra de menú en el GUI.
No responde en absoluto si pulsa las opciones como Open
o Save
en el submenú de File
porque no hay ningún comando adjunto a ellas todavía. Haremos que el comando sea funcional en la próxima sesión.
Comando Menubar de Tkinter
import tkinter as tk
from tkinter import filedialog
def onOpen():
print(
filedialog.askopenfilename(
initialdir="/",
title="Open file",
filetypes=(("Python files", "*.py;*.pyw"), ("All files", "*.*")),
)
)
def onSave():
print(
filedialog.asksaveasfilename(
initialdir="/",
title="Save as",
filetypes=(("Python files", "*.py;*.pyw"), ("All files", "*.*")),
)
)
app = tk.Tk()
app.geometry("300x200")
app.title("Menu Bar Command")
menubar = tk.Menu(app)
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="Open", command=onOpen)
filemenu.add_command(label="Save", command=onSave)
filemenu.add_command(label="Exit", command=app.quit)
menubar.add_cascade(label="File", menu=filemenu)
app.config(menu=menubar)
app.mainloop()
filemenu = tk.Menu(menubar, tearoff=0)
La opción tearoff
está establecida en 1
por defecto y separaría los menús de la ventana principal para crear un menú flotante si se hace clic en las líneas punteadas de la parte superior. Aquí se establece en 0
para desactivar esta característica flotante.
filemenu.add_command(label="Open", command=onOpen)
La función onOpen
está ligada al menú Open
, y será llamada cuando se haga clic en Open
.
def onOpen():
print(
filedialog.askopenfilename(
initialdir="/",
title="Open file",
filetypes=(("Python files", "*.py;*.pyw"), ("All files", "*.*")),
)
)
Esta función muestra el diálogo abierto y devuelve el nombre de fichero seleccionado. En nuestro ejemplo no abrimos realmente el fichero sino que imprimimos su nombre de fichero.
tkfiledialog
tiene tres funciones,
Función | Parámetros | Descripción |
---|---|---|
.askopenfilename |
Directorio, Título, Extensión | Para abrir el archivo: Diálogo que solicita la selección de un archivo existente. |
.asksaveasfilename |
Directorio, Título, Extensión | Para guardar el archivo: Diálogo que solicita la creación o el reemplazo de un archivo. |
.askdirectory |
Ninguno | Para abrir el directorio |
filemenu.add_command(label="Exit", command=app.quit)
Tkinter tiene una función interna quit
que cierra la GUI raíz. Podríamos simplemente vincular esta función existente a Exit
en lugar de crear nuestra propia función de Exit
.
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook