Виджет Menu (меню) в Tkinter

Работаем с виджетом Menu (меню) в Tkinter

Виджет Menu в Tkinter предоставляет возможность создавать различные типы меню в графическом пользовательском интерфейсе (GUI), включая выпадающие меню, контекстные меню и панель меню.

Создание виджета Menu

Создание виджета Menu включает в себя несколько этапов. Во-первых, необходимо создать объект Menu, затем можно добавить в него различные элементы. Ниже приведен базовый пример создания меню:

import tkinter as tk

root = tk.Tk()

menubar = tk.Menu(root)
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="Open", command=None)
filemenu.add_command(label="Save", command=None)
filemenu.add_command(label="Exit", command=root.quit)

menubar.add_cascade(label="File", menu=filemenu)

root.config(menu=menubar)

root.mainloop()

В этом примере мы создали главное меню menubar, добавили в него подменю filemenu с командами «Open», «Save» и «Exit». Важно отметить, что мы использовали метод add_cascade() для добавления подменю в главное меню и метод add_command() для добавления элементов в подменю. Кроме того, мы использовали tearoff=0 чтобы убрать пункт, позволяющий «оторвать» меню в отдельное окно, который есть по умолчанию.

Свойства виджета Menu

Виджет Menu поддерживает различные свойства (опции), которые можно использовать для настройки его внешнего вида и поведения. Ниже перечислены некоторые из них:

  • activebackground: Цвет фона для пункта меню, когда он активирован.
  • activeforeground: Цвет текста для пункта меню, когда он активирован.
  • bg или background: Цвет фона меню.
  • cursor: Курсор, который появляется, когда мышь наводится на элемент меню.
  • font: Шрифт текста элементов меню.
  • fg или foreground: Цвет текста элементов меню.
  • relief: Тип рельефа, который применяется к элементу меню при наведении на него.
  • tearoff: Если этот параметр установлен в 1, меню будет иметь первый элемент, который, если выбрать, позволяет оторвать меню в отдельное окно. По умолчанию этот параметр установлен в 1.

Методы виджета Menu

Виджет Menu поддерживает различные методы для работы с меню. Ниже перечислены некоторые из них:

  • add_command(options): Добавляет пункт меню, который может вызывать функцию или метод при выборе.
  • add_cascade(options): Добавляет подменю в меню.
  • add_checkbutton(options): Добавляет в меню пункт с флажком.
  • add_radiobutton(options): Добавляет в меню пункт с радио-кнопкой.
  • add_separator(): Добавляет горизонтальную линию-разделитель в меню.
  • delete(start, end): Удаляет элементы меню в указанном диапазоне.
  • entryconfig(index, options): Изменяет опции для указанного элемента меню.

Примеры использования

В Tkinter с помощью виджета Menu можно создавать различные типы меню, включая панель меню, и контекстные меню.

Панель меню: Это меню, которое обычно находится в верхней части окна и содержит команды, группированные по категориям. Пример создания панели меню уже был показан выше.

Контекстное меню: Контекстное меню появляется при нажатии правой кнопки мыши на определенном элементе интерфейса. Ниже приведен пример создания выпадающего меню:

import tkinter as tk

def callback():
    print("You clicked the menu")

root = tk.Tk()

# create a context menu
context_menu = tk.Menu(root, tearoff=0)
context_menu.add_command(label="Refresh", command=callback)
context_menu.add_command(label="Edit", command=callback)
context_menu.add_separator()
context_menu.add_command(label="Quit", command=root.quit)

def show_context_menu(event):
    # try to post the menu at the event x,y coordinates
    try:
        context_menu.tk_popup(event.x_root, event.y_root)
    finally:
        # make sure to release the grab (Tk command to capture mouse events)
        context_menu.grab_release()

# bind the context menu to the right mouse button
root.bind("<Button-3>", show_context_menu)

root.mainloop()

Особенности

Важно знать, что некоторые элементы и опции меню могут отображаться и работать по-разному на разных операционных системах из-за различий в нативных стилях и нормах интерфейса.

Помимо этого, в Tkinter есть специальные типы меню: Menubutton, который позволяет создавать меню, активируемые нажатием на кнопку, и OptionMenu, который позволяет создавать выпадающие списки.

Создание вложенных меню

Можно создавать меню с несколькими уровнями вложенности. Это можно сделать путем добавления меню в качестве подменю другого меню с помощью метода add_cascade(). Каждое подменю, в свою очередь, может содержать свои собственные элементы и подменю.

import tkinter as tk

root = tk.Tk()

menubar = tk.Menu(root)

filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="New File", command=None)
filemenu.add_command(label="Open File", command=None)

submenu = tk.Menu(filemenu, tearoff=0)
submenu.add_command(label="Recent File", command=None)
submenu.add_command(label="Recent Project", command=None)

filemenu.add_cascade(label="Open Recent", menu=submenu)

filemenu.add_separator()

filemenu.add_command(label="Exit", command=root.quit)

menubar.add_cascade(label="File", menu=filemenu)

root.config(menu=menubar)

root.mainloop()

В этом примере в меню «File» добавлено подменю «Open Recent», которое содержит свои собственные пункты меню.

События в меню

Можно привязывать обработчики событий к пунктам меню для выполнения определенных действий при их выборе. Это обычно делается с помощью параметра command при добавлении пункта меню с помощью метода add_command().

def open_file():
    print("File opened")

filemenu.add_command(label="Open", command=open_file)

В этом примере при выборе пункта «Open» будет вызываться функция open_file(), которая выводит сообщение «File opened».

Использование переменных в меню

Можно использовать переменные Tkinter (StringVar, IntVar и т.д.) для связывания состояния пунктов меню с переменными. Это особенно полезно для пунктов меню с флажками и радио-кнопками.

var = tk.IntVar()
filemenu.add_checkbutton(label="Check", variable=var)

В этом примере состояние пункта меню с флажком связано с целочисленной переменной. Когда пользователь выбирает или снимает выбор с этого пункта меню, значение переменной изменяется соответственно.

Заключение

Использование виджета Menu позволяет делать пользовательский интерфейс более функциональным и удобным для пользователя, предоставляя ему удобный доступ к командам и настройкам.

Содержание: