Tkinter Tutorial - Menubar
Um dos elementos mais comuns na GUI é a barra de menu. Uma barra de menu está normalmente sob a barra de título para exibir as séries de menus. Depois de clicar num dos menus de nível superior, um sub-menu será estendido para exibir itens de menu mais relevantes. Um sub-menu é normalmente vinculado ao comando específico como open, close, save ou quit.
Tkinter Menubar Básico
Vamos criar o nosso primeiro exemplo de menubar que tem o menu File como na maioria dos editores. Incluímos apenas sub-menus Abrir, Salvar e Sair 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)
O parâmetro dado do Menu é o widget pai do menu criado. A linha de código acima significa que o menu widget menubar será o nível superior do frame app.
filemenu = tk.Menu(menubar)
Da mesma forma, o filemenu é o menu do widget menubar, ou sub menu do frame app.
filemenu.add_command(label="Open")
O add_command adiciona os comandos ao menu filemenu. O label é o texto exibido no submenu.
menubar.add_cascade(label="File", menu=filemenu)
O filemenu é adicionado ao menubar com o comando add_cascade. File é a etiqueta do menu exibida no nível superior do frame app.
app.config(menu=menubar)
Embora o menubar seja criado para ser o widget filho do app como explicamos acima, você ainda precisa configurá-lo para ser o menu do app. Caso contrário, nenhuma barra de menu será mostrada na GUI.
Ela não responde em nada se você clicar nas opções como Open ou Save no submenu de File porque ainda não há nenhum comando anexado a elas. Nós vamos fazer o comando funcionar na próxima sessão.
Comando Tkinter Menubar
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)
O tearoff está definido para ser 1 por padrão e ele destacaria os menus da janela principal para criar um menu flutuante se as linhas pontilhadas no topo fossem clicadas. Aqui ele está definido para ser 0 para desativar essa função flutuante.
filemenu.add_command(label="Open", command=onOpen)
A função OnOpen está vinculada ao menu Open, e será chamada quando Open for clicada.
def onOpen():
print(
filedialog.askopenfilename(
initialdir="/",
title="Open file",
filetypes=(("Python files", "*.py;*.pyw"), ("All files", "*.*")),
)
)
Esta função exibe o diálogo aberto e retorna o nome do arquivo selecionado. Nós realmente não abrimos o arquivo no nosso exemplo, mas para imprimir seu nome de arquivo.
O tkfiledialog tem três funções,
| Função | Parâmetros | Descrição |
|---|---|---|
.askopenfilename |
Diretório, Título, Extensão | Para abrir arquivo: Diálogo que solicita a selecção de um ficheiro existente. |
.asksaveasfilename |
Diretório, Título, Extensão | Para guardar* arquivo: Diálogo que solicita a criação ou substituição de um ficheiro. |
.askdirectory |
Nenhum | Para abrir diretório* |
filemenu.add_command(label="Exit", command=app.quit)
Tkinter tem uma função interna quit que sai da GUI raiz. Nós poderíamos simplesmente ligar esta função existente à função Exit ao invés de criar a nossa própria função 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