Учебник Tkinter - Менюбар

Одним из наиболее распространенных элементов в графическом интерфейсе является панель меню. Обычно под строкой заголовка находится строка меню для отображения серии меню. После нажатия на одно из меню верхнего уровня подменю будет расширено для отображения более релевантных пунктов меню. Подменю обычно привязывается к конкретной команде, такой как open
, close
, save
или quit
.
Базовая панель меню Tkinter
Мы создадим наш первый пример menubar, который имеет меню File
, как и в большинстве редакторов. Для простоты мы включаем только подменю Open
, Save
и Quit
.
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)
Данный параметр Меню
является родительским виджетами созданного меню. Вышеуказанная строка кода означает, что виджет меню menubar
будет верхним уровнем кадра app
.
filemenu = tk.Menu(menubar)
Аналогично, filemenu
- это меню виджета menubar
, или подменю кадра app
.
filemenu.add_command(label="Open")
add_command
добавляет команды в меню filemenu
. label
- это текст, отображаемый в подменю.
menubar.add_cascade(label="File", menu=filemenu)
filemenu
добавляется в menubar
командой add_cascade
. File
- это метка меню, отображаемая в верхней части кадра app
.
app.config(menu=menubar)
Хотя menubar
создан как дочерний виджет app
, как мы объясняли выше, вам всё же нужно настроить его как menu
app
. В противном случае, в графическом интерфейсе не будет показана ни одна строка меню.
Он вообще не будет отвечать, если вы нажмете на такие опции, как Open
или Save
в подменю File
, потому что к ним пока нет прикрепленной команды. Мы сделаем эту команду функциональной в следующей сессии.
Команда 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)
По умолчанию tearoff
установлен как 1
и при нажатии на пунктирные строки в верхней части он отделяет меню от главного окна для создания плавающего меню. Здесь установлено 0
, чтобы отключить эту плавающую функцию.
filemenu.add_command(label="Open", command=onOpen)
Функция onOpen
привязана к меню Open
и будет вызываться при нажатии кнопки Open
.
def onOpen():
print(filedialog.askopenfilename(initialdir = "/",title = "Open file",filetypes = (("Python files","*.py;*.pyw"),("All files","*.*"))))
Эта функция отображает открытый диалог и возвращает выбранное имя файла. В нашем примере мы на самом деле не открываем файл, а распечатываем его имя.
tkfileddialog
имеет три функции,
Функция | Параметры | Описание |
---|---|---|
.askopenfilename |
Справочник, Название, Расширение | Чтобы открыть файл: Диалог, запрашивающий выбор существующего файла. |
.asksaveasfilename |
Справочник, Название, Расширение | За **сохранение файла: Диалог, запрашивающий создание или замену файла. |
.askdirectory |
Нет | Чтобы открыть каталог |
filemenu.add_command(label="Exit", command=app.quit)
Tkinter имеет внутреннюю функцию quit
, которая выходит из корневого GUI. Мы можем просто привязать эту существующую функцию к Exit
, вместо того, чтобы создавать свою собственную функцию 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