"Выпадающие" меню - популярный способ представить пользователю несколько вариантов выбора, занимая при этом минимум места на экране приложения, когда пользователь не делает выбора.
Menubutton - это часть, которая всегда отображается в приложении.
Menu - это список вариантов, который появляется только после того, как пользователь нажимает на кнопку меню.
Чтобы выбрать вариант, пользователь может протянуть мышь от кнопки вниз к одному из вариантов. В качестве альтернативы можно нажать и отпустить Menubutton: варианты появятся и останутся, пока пользователь не нажмет на один из них.
Версия Tkinter для Unix (по крайней мере) поддерживает "отрывные меню". Если вы, как дизайнер, пожелаете этого, над пунктами меню появится пунктирная линия. Пользователь может щелкнуть на этой линии, чтобы "оторвать" меню: появится новое, отдельное, независимое окно с пунктами меню.
О том, как создать Menubutton и подключить его к виджету меню, читайте в Раздел 16, "Виджет Menubutton". Сначала рассмотрим виджет Menu, который отображает список пунктов меню.
Пункты, отображаемые в меню, могут быть любыми из следующих:
Простая команда: текстовая строка (или изображение), которую пользователь может выбрать для выполнения какой-либо операции.
Cascade: текстовая строка или изображение, которое пользователь может выбрать, чтобы отобразить еще одно меню с вариантами выбора.
Checkbutton (см. Раздел 9, "Виджет Checkbutton").
Группа радиобаттонов (см. Раздел 20, "Виджет Radiobutton").
Чтобы создать виджет меню, необходимо сначала создать Menubutton, который мы будем называть mb:
w = tk.Menu(mb, option, ...)
Этот конструктор возвращает новый виджет Menu. Опции включают:
Таблица 23. Опции виджета Menu
activebackground |
Цвет фона, который будет отображаться на пункте меню, когда он находится под мышью. См. Раздел 5.3, "Цвета". |
activeborderwidth |
Указывает ширину границы, рисуемой вокруг пункта меню, когда он находится под мышью. По умолчанию - 1 пиксель. Возможные значения см. в Раздел 5.1, "Размеры". |
activeforeground |
Цвет переднего плана, который будет отображаться на пункте меню, когда он находится под мышью. |
bg или background |
Цвет фона для элементов, не находящихся под мышью. |
bd или borderwidth |
Ширина границы вокруг всех пунктов меню; смотрите Раздел 5.1, "Размеры". По умолчанию - один пиксель. |
cursor |
Курсор, который появляется при наведении мыши на пункты меню, но только когда меню оторвано. См. раздел Раздел 5.8, "Курсоры". |
disabledforeground |
Цвет текста для элементов, чей state равен tk.DISABLED. |
font |
Шрифт по умолчанию для пунктов меню. См. Раздел 5.4, "Шрифты". |
fg или foreground |
Цвет переднего плана, используемый для пунктов меню, не находящихся под мышью. |
postcommand |
Вы можете установить эту опцию на процедуру, и она будет вызываться каждый раз, когда кто-то вызовет это меню. |
relief |
По умолчанию для меню используется 3-D эффект relief=tk.RAISED. Другие варианты см. в Раздел 5.6, "Стили рельефа". |
selectcolor |
Определяет цвет, отображаемый в checkbutton и radiobutton, когда они выбраны. |
tearoff |
Обычно меню может быть оторвано: первая позиция (позиция 0) в списке пунктов меню занимает оторванный пункт, а дополнительные пункты меню добавляются, начиная с позиции 1. Если задать tearoff=0, меню не будет иметь отрывного пункта, а пункты меню будут добавляться начиная с позиции 0. |
tearoffcommand |
Если вы хотите, чтобы ваша программа получала уведомление, когда пользователь нажимает на отрывной пункт в меню, установите этот параметр в вашей процедуре. Она будет вызываться с двумя аргументами: идентификатором родительского окна и идентификатором корневого окна нового отрывного меню. |
title |
Обычно заголовок окна отрывного меню совпадает с текстом menubutton или каскада, которые ведут к этому меню. Если вы хотите изменить заголовок этого окна, установите для параметра title такую строку. |
Эти методы доступны для объектов Menu.
Те из них, которые создают пункты в меню, имеют свои собственные опции (Смотрите раздел 15.1, "Опции создания пункта меню (coption)").
.add(kind, coption, ...)
Добавляет новый элемент
kindв качестве следующего доступного пункта в данном меню. Аргументkindможет быть любым из'cascade','checkbutton','command','radiobutton'или'separator'. В зависимости от аргументаkindэтот метод эквивалентен.add_cascade(),.add_checkbutton()и так далее; подробности см. в этих методах ниже.
.add_cascade(coption, ...)
Добавляет новый каскадный элемент в качестве следующего доступного пункта в данном меню. Используйте опцию menu в этом вызове, чтобы связать каскад с меню следующего уровня, объектом типа Menu.
.add_checkbutton(coption, ...)
Добавляет новую кнопку Checkbutton в качестве следующего доступного пункта меню. Опции позволяют настроить кнопку так же, как и объект Checkbutton; смотрите Раздел 15.1, "Опции создания пункта меню (coption)".
.add_command(coption, ...)
Добавляет новую команду в качестве следующего доступного пункта меню. Используйте опцию
label,bitmapилиimage, чтобы поместить текст или изображение в меню; используйте опциюcommand, чтобы связать этот пункт с процедурой, которая будет вызываться при выборе этого пункта меню.
.add_radiobutton(coption, ...)
Добавляет новую радиокнопку в качестве следующего доступного пункта меню. Опции позволяют настроить radiobutton примерно так же, как и объект Radiobutton.
.add_separator()
Добавляет разделитель после последней определенной в данный момент опции. Это просто горизонтальная линия, которую можно использовать для выделения групп пунктов меню. Разделители считаются как пункты меню, поэтому если у вас уже есть три варианта, и вы добавляете разделитель, он займет позицию 3 (считая от 0).
.delete(index1, index2=None)
Этот метод удаляет пункты меню, пронумерованные от
index1доindex2включительно. Чтобы удалить один пункт меню, опустите аргументindex2. Вы не можете использовать этот метод для удаления отрывного пункта меню, но вы можете сделать это, установив параметрtearoffобъекта меню в 0.
.entrycget(index, coption)
Чтобы получить текущее значение некоторого coption для пункта меню, вызовите этот метод с
index, установленным на индекс этого пункта, иcoption, установленным на имя желаемой опции.
.entryconfigure(index, coption, ...)
Чтобы изменить текущее значение некоторого coption для пункта меню, вызовите этот метод с
index, установленным на индекс этого пункта, и одним или несколькими аргументамиcoption=value.
.index(i)
Возвращает позицию пункта меню, указанного индексом
i. Например, вы можете использовать.index(tk.END), чтобы найти индекс последнего пункта меню (илиNone, если пунктов меню нет).
.insert_cascade(index, coption, ...)
Вставляет новый каскад в позицию, заданную
index, считая от 0. Любые пункты меню после этой позиции перемещаются на один вниз. Параметры те же, что и для.add_cascade(), описанного выше.
.insert_checkbutton(index, coption, ...)
Вставляет новый чекбокс в позицию, указанную индексом. Параметры те же, что и для
.add_checkbutton(), описанного выше.
.insert_command(index, coption, ...)
Вставляет новую команду в позицию
index. Параметры те же, что и для.add_command(), выше.
.insert_radiobutton(index, coption, ...)
Вставляет новую радиокнопку в позицию
index. Параметры те же, что и для.add_radiobutton(), выше.
.insert_separator(index)
Вставляет новый разделитель в позицию, указанную
index.
.invoke(index)
Вызывает обратный вызов
command, связанный с пунктом меню в позицииindex. Если это чекбокс, то его состояние переключается между установленным и очищенным; если радиокнопка, то этот пункт меню будет включен.
.post(x, y)
Отображает это меню в позиции
(x, y)относительно корневого окна.
.type(index)
Возвращает тип пункта меню, указанного
index: либоtk.CASCADE,tk.CHECKBUTTON,tk.COMMAND,tk.RADIOBUTTON,tk.SEPARATOR, либоtk.TEAROFF.
.yposition(n)
Для
n-гопункта меню возвращает вертикальное смещение в пикселях относительно верхней части меню. Цель этого метода - позволить вам разместить всплывающее меню точно относительно текущей позиции мыши.