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

Jinku Hu 30 Январь 2023 18 Апрель 2020
  1. Базовая панель меню Tkinter
  2. Команда Tkinter Menubar
Учебник 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()

Tkinter Menubar Basic

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.

Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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