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