Главная


15. Виджет Menu

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

О том, как создать Menubutton и подключить его к виджету меню, читайте в Раздел 16, "Виджет Menubutton". Сначала рассмотрим виджет Menu, который отображает список пунктов меню.

Пункты, отображаемые в меню, могут быть любыми из следующих:

Чтобы создать виджет меню, необходимо сначала создать 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-го пункта меню возвращает вертикальное смещение в пикселях относительно верхней части меню. Цель этого метода - позволить вам разместить всплывающее меню точно относительно текущей позиции мыши.


>> Опции создания пункта меню (coption)