меню
-
ИМЯ
- меню, tk_menuSetFocus — Создание и управление виджетами «меню» и строками меню
- СИНТАКСИС
- СТАНДАРТНЫЕ ПАРАМЕТРЫ
-
-activebackground, activeBackground, Цвет фона
- -activeborderwidth, activeBorderWidth, Ширина рамки
- -activeforeground, activeForeground, Цвет текста
- -background or -bg, background, Цвет фона
- -borderwidth or -bd, borderWidth, Ширина рамки
- -cursor, cursor, Курсор
- -disabledforeground, disabledForeground, Цвет текста (неактивное состояние)
- -font, font, Шрифт
- -foreground or -fg, foreground, Цвет текста
- -relief, relief, Вид рамки
- -takefocus, takeFocus, Получить фокус
- -activeborderwidth, activeBorderWidth, Ширина рамки
-
-postcommand, postCommand, Команда
- -selectcolor, selectColor, Цвет выделения
- -tearoff, tearOff, Отрыв
- -tearoffcommand, tearOffCommand, Команда отрыва
- -title, title, Заголовок
- -type, type, Тип
- -selectcolor, selectColor, Цвет выделения
Имя
меню, tk_menuSetFocus — Создание и управление виджетами «меню» и строками менюСинтаксис
менюимяПути ?параметры?tk_menuSetFocusимяПути
Стандартные параметры
-
-activebackground, activeBackground, Цвет фона
- -activeborderwidth, activeBorderWidth, Ширина рамки
- -activeforeground, activeForeground, Цвет текста
- -background or -bg, background, Цвет фона
- -borderwidth or -bd, borderWidth, Ширина рамки
- -cursor, cursor, Курсор
- -disabledforeground, disabledForeground, Цвет текста (неактивное состояние)
- -font, font, Шрифт
- -foreground or -fg, foreground, Цвет текста
- -relief, relief, Вид рамки
- -takefocus, takeFocus, Получить фокус
- -activeborderwidth, activeBorderWidth, Ширина рамки
Параметры, специфичные для виджетов
- Имя в командной строке: -postcommand
- Имя базы данных: postCommand
- Класс базы данных: Command
- Имя базы данных: postCommand
- Если этот параметр указан, он предоставляет Tcl-команду для выполнения каждый раз, когда меню открывается. Команда вызывается командой виджета post перед открытием меню. Обратите внимание, что в Tk 8.0 на Macintosh и Windows все пост-команды в системе меню выполняются до открытия любого из этих меню. Это связано с ограничениями менеджеров меню отдельных платформ.
- Имя в командной строке: -selectcolor
- Имя базы данных: selectColor
- Класс базы данных: Background
- Имя базы данных: selectColor
- Для пунктов меню, которые являются флажками или радиокнопками, этот параметр задает цвет, отображаемый в индикаторе, когда флажок или радиокнопка выбраны.
- Имя в командной строке: -tearoff
- Имя базы данных: tearOff
- Класс базы данных: TearOff
- Имя базы данных: tearOff
- Этот параметр должен иметь правильное булево значение, которое указывает, следует ли включать в меню запись для отделения от основной части. Если это так, она будет существовать как запись 0 меню, а остальные записи будут пронумерованы начиная с 1. Стандартные привязки меню обеспечивают отделение меню при вызове записи для отделения. Этот параметр игнорируется в Aqua/Mac OS X, где меню не могут быть отделены.
- Имя в командной строке: -tearoffcommand
- Имя базы данных: tearOffCommand
- Класс базы данных: TearOffCommand
- Имя базы данных: tearOffCommand
- Если этот параметр имеет ненулевое значение, он указывает Tcl-команду, которая должна вызываться всякий раз, когда меню отделяется. Фактическая команда будет состоять из значения этого параметра, за которым следует пробел, имя окна меню, за которым следует пробел, имя созданного отделенного окна меню. Например, если значение параметра — «a b», и меню .x.y отделяется для создания нового меню .x.tearoff1, тогда будет вызвана команда «a b .x.y .x.tearoff1». Этот параметр игнорируется в Aqua/Mac OS X, где меню не могут быть отделены.
- Имя в командной строке: -title
- Имя базы данных: title
- Класс базы данных: Title
- Имя базы данных: title
- Строка будет использоваться в качестве заголовка окна, созданного при отделении этого меню. Если заголовок NULL, то окно будет иметь заголовок menubutton или текст пункта каскада, из которого было вызвано это меню.
- Имя в командной строке: -type
- Имя базы данных: type
- Класс базы данных: Type
- Имя базы данных: type
- Этот параметр может быть menubar, tearoff или normal и устанавливается при создании меню. Хотя строка, возвращаемая базой данных конфигурации, изменится, если этот параметр изменён, это не повлияет на поведение виджета меню. Это используется механизмом клонирования и обычно не устанавливается вне библиотеки Tk.
Введение
Команда menu создаёт новое окно верхнего уровня (заданное аргументом pathName) и делает его виджетом меню. Этот виджет меню может быть использован как всплывающее окно или применён к toplevel (с параметром -menu), чтобы сделать его строкой меню для этого toplevel. Дополнительные параметры, описанные выше, могут быть указаны в командной строке или в базе данных параметров для настройки аспектов меню, таких как цвета и шрифт. Команда menu возвращает свой аргумент pathName. В момент вызова этой команды не должно существовать окна с именем pathName, но родитель pathName должен существовать.Меню — это виджет, который отображает набор однострочных записей, расположенных в одной или нескольких колонках. Существует несколько различных типов записей, каждая со своими свойствами. Записи разных типов могут быть объединены в одном меню. Пункты меню не являются теми же, что виджеты записей. Фактически, записи меню не являются отдельными виджетами; всё меню — один виджет.
Пункты меню отображаются до трёх отдельных полей. Главное поле — это метка в виде строки текста, битовой карты или изображения, управляемая параметрами -label, -bitmap и -image для записи. Если для записи указан параметр -accelerator, то второе текстовое поле отображается справа от метки. Акселератор обычно описывает последовательность нажатий клавиш, которые могут быть введены в приложении, чтобы вызвать тот же результат, что и вызов пункта меню. Третье поле — это индикатор. Индикатор присутствует только для записей флажков или радиокнопок. Он указывает, выбрана ли запись, и отображается слева от строки записи.
В обычном использовании запись становится активной (отображается по-другому), когда указатель мыши находится над записью. Если кнопка мыши отпускается над записью, то запись вызывается. Эффект вызова отличается для каждого типа записи; эти эффекты описаны ниже в разделах по отдельным записям.
Записи могут быть отключены, что приводит к отображению их меток и акселераторов более тусклыми цветами. Стандартные привязки меню не позволят активировать или вызвать отключенную запись. Отключённые записи могут быть повторно включены, в этот момент они станут доступными для активации и вызова.
Всякий раз, когда активная запись меню меняется, в меню отправляется виртуальное событие <<MenuSelect>>. Тогда активный элемент можно запросить у меню, и выполнить действие, такое как установка контекстно-зависимой справки для записи.
Типы записей
Записи команд
Наиболее распространённый вид записи меню — это запись команды, которая ведёт себя как виджет кнопки. Когда запись команды вызывается, выполняется Tcl-команда. Tcl-команда задаётся параметром -command.Записи разделителей
Разделитель — это запись, которая отображается как горизонтальная разделительная линия. Разделитель не может быть активирован или вызван, и он не имеет поведения, кроме визуального.Записи флажков
Запись флажка в меню ведёт себя как виджет флажка. При вызове она переключается между выбранным и невыбранным состояниями. Когда запись выбрана, определённое значение сохраняется в определённой глобальной переменной (как задаётся параметрами -onvalue и -variable для записи); когда запись не выбрана, другое значение (заданное параметром -offvalue) сохраняется в глобальной переменной. В записи флажка отображается индикатор слева от метки. Если запись выбрана, центр индикатора отображается в цвете, заданном параметром -selectcolor для записи; в противном случае центр индикатора отображается в цвете фона меню. Если для записи флажка указан параметр -command, его значение оценивается как Tcl-команда каждый раз, когда запись вызывается; это происходит после переключения выбранного состояния записи.Записи радиокнопок
Запись радиокнопки в меню ведёт себя как виджет радиокнопки. Записи радиокнопок организованы в группы, из которых только одна запись может быть выбрана одновременно. Всякий раз, когда определённая запись становится выбранной, она сохраняет определённое значение в определённой глобальной переменной (как задаётся параметрами -value и -variable для записи). Это действие приводит к тому, что любая ранее выбранная запись в той же группе отменяет свой выбор. После того, как запись стала выбранной, любое изменение связанной с ней переменной заставит запись отменить свой выбор. Группировка записей радиокнопок определяется их связанными переменными: если две записи имеют одну и ту же связанную переменную, то они находятся в одной группе. Индикатор ромба отображается слева от метки в каждой записи радиокнопки. Если запись выбрана, центр индикатора отображается в цвете, заданном параметром -selectcolor для записи; в противном случае центр индикатора отображается в цвете фона меню. Если для записи радиокнопки указан параметр -command, его значение оценивается как Tcl-команда каждый раз, когда запись вызывается; это происходит после выбора записи.Записи каскада
Запись каскада — это запись с связанным меню (заданным параметром -menu). Записи каскада позволяют создавать каскадные меню. Команда виджета postcascade может использоваться для открытия и закрытия связанного меню рядом с записью каскада. Связанное меню должно быть дочерним по отношению к меню, содержащему запись каскада (это необходимо для правильной работы перехода по меню).Запись каскада открывает связанное меню, вызывая Tcl-команду вида
menu post x yгде menu — имя пути связанного меню, а x и y — координаты правого верхнего угла записи каскада в окне корня. В Unix нижнее меню закрывается путём выполнения Tcl-команды вида
menu unpostгде menu — имя связанного меню. На других платформах родной код платформы позаботится о закрытии меню.
Если для записи каскада указан параметр -command, он оценивается как Tcl-команда при каждом вызове записи. Это не поддерживается в Windows.
Записи отделения
Запись отделения появляется в верхней части меню, если она включена с помощью параметра -tearoff. Она не похожа на другие записи меню, так как её нельзя создать с помощью команды виджета add и нельзя удалить с помощью команды delete. Когда создаётся запись отделения, она отображается как пунктирная линия в верхней части меню. Согласно стандартным привязкам, вызов записи отделения создаёт копию меню и всех его подменю.Панели меню
Любое меню может быть установлено как панель меню для окна toplevel (см. команду toplevel для синтаксиса). В Macintosh, когда toplevel находится спереди, пункты каскада этого меню будут отображаться в строке меню в верхней части основного монитора. В Windows и Unix пункты этого меню будут отображаться в строке меню в верхней части окна. Эти меню будут вести себя в соответствии с рекомендациями интерфейса своих платформ. Для каждого меню, установленного как панель меню, создаётся клонированное меню. См. раздел КЛОНЫ для получения дополнительной информации.Как отмечалось, панели меню могут вести себя по-разному на разных платформах. Пример этого касается обработки флажков и радиокнопок в меню. Хотя разрешено размещать эти элементы меню на панелях меню, они могут не отображаться с индикаторами на некоторых платформах из-за системных ограничений.
Специальные меню в панелях меню
Определённые меню в панели меню будут обрабатываться особым образом. В Macintosh предоставляется доступ к специальным меню «Приложение», «Окно» и «Справка». В Windows предоставляется доступ к системному меню Windows в каждом окне. В X Windows может быть предоставлено специальное правое меню справки, если включена совместимость меню Motif. Во всех случаях эти меню должны быть созданы с именем команды меню панели меню, соединённым со специальным именем. Таким образом, для панели меню с именем .menubar в Macintosh специальные меню будут .menubar.apple, .menubar.window и .menubar.help; в Windows — .menubar.system; в X Windows — меню справки будет .menubar.help.Когда Tk видит меню .menubar.apple как первое меню в строке меню на Macintosh, содержимое этого меню формирует первые элементы меню «Приложение» всякий раз, когда окно, содержащее строку меню, находится в фокусе. После всех элементов, определенных Tk, в меню будет разделитель, а затем все стандартные элементы меню «Приложение». Такое меню .apple должно быть присутствовать в меню при первой его конфигурации как строки меню верхнего уровня, в противном случае в строке меню будет вставлено стандартное меню «Приложение» (скрытое от Tk), и последующее добавление меню .apple больше не приведет к тому, что оно станет меню «Приложение».
Когда Tk видит меню .menubar.window на Macintosh, его содержимое вставляется в стандартное меню «Окно» строки меню пользователя всякий раз, когда строка меню окна находится в фокусе. Первые элементы меню предоставляются Mac OS X, а имена текущих окон автоматически добавляются после всех элементов, определенных Tk, и разделителя.
Когда Tk видит меню .menubar.help на Macintosh, его содержимое добавляется к стандартному меню «Справка» строки меню пользователя всякий раз, когда строка меню окна находится в фокусе. Первые элементы меню предоставляются Mac OS X.
При отображении меню «Система» в Windows его элементы добавляются к системному меню, к которому прикреплена строка меню. Это меню привязано к значку приложения и может быть вызвано с помощью мыши или нажатием клавиш Alt+Пробел. Из-за ограничений API Windows любые изменения шрифта, цвета, изображения, растровые изображения или изображения для отрыва меню не будут отображаться в системном меню.
Когда Tk видит меню «Справка» на X Windows и включена совместимость меню Motif, меню перемещается в конец строки меню и выравнивается вправо. Совместимость с меню Motif включена путем установки параметра Tk *Menu.useMotifHelp в значение true или путем вызова tk::classic::restore menu.
Копии
Когда меню устанавливается как строка меню для окна верхнего уровня или когда меню отделяется, создается копия меню. Эта копия является элементом-меню со своими собственными характеристиками, но она является дочерним элементом оригинального меню. Изменения в конфигурации оригинала отражаются в копии. Кроме того, все каскадные элементы, на которые указывает меню, также копируются, чтобы перемещение по меню работало правильно. Копии уничтожаются при исчезновении отрываемого меню или строки меню, а также при уничтожении оригинального меню.Команда виджета
Команда menu создает новую команду Tcl, имя которой pathName. Эта команда может быть использована для вызова различных операций над виджетом. Она имеет следующий общий вид:pathName option ?arg arg ...?Option и args определяют точное поведение команды.
Многие команды виджетов для меню принимают в качестве одного аргумента указатель на тот или иной элемент меню, над которым необходимо выполнить операцию. Эти указатели называются индексами и могут быть указаны в любом из следующих форматов:
Если индекс может соответствовать нескольким из вышеуказанных форматов, то приоритет отдается формату, расположенному выше в списке.
Для виджетов меню возможны следующие команды виджетов:
Параметры элементов меню
Следующие параметры допускаются для элементов меню. Большинство параметров не поддерживаются всеми типами записей.Конфигурации меню
По умолчанию привязки поддерживают четыре способа использования меню:Стандартные привязки
Tk автоматически создает привязки класса для меню, которые предоставляют им следующее поведение по умолчанию:- При входе курсора мыши в меню, элемент под курсором активируется; при перемещении мыши по меню активный элемент изменяется, отслеживая перемещение мыши.
- При выходе курсора мыши из меню все элементы меню деактивируются, за исключением специального случая, когда курсор перемещается из меню в каскадное подменю.
- При отпускании кнопки мыши над меню, активный элемент (если таковой есть) вызывается. Меню также закрывается, если это не отрывное меню.
- Кнопки Пробел и Возврат вызывают активный элемент и закрывают меню.
- Если у элементов меню есть подчеркнутые буквы с опцией -underline, то нажатие одной из подчеркнутых букв (или ее заглавной или строчной версии) вызывает этот элемент и закрывает меню.
- Кнопка Esc прерывает процесс выбора в меню, не вызывая какой-либо элемент. Она также закрывает меню, если это не отрывное меню.
- Кнопки Вверх и Вниз активируют следующий выше или ниже элемент в меню. Когда достигается конец меню, активный элемент переходит к другому концу.
- Кнопка Влево переходит к следующему меню слева. Если текущее меню является каскадным подменю, то подменю закрывается, а текущий элемент меню становится элементом каскада в родительском меню. Если текущее меню открыто из кнопки меню, то текущая кнопка меню закрывается, и открывается следующая кнопка меню слева. В противном случае действие клавиши не влияет. Порядок кнопок меню слева направо определяется их порядком стекирования: Tk предполагает, что самая нижняя кнопка меню (по умолчанию первая созданная) находится слева.
- Кнопка Вправо переходит к следующему меню справа. Если текущий элемент является элементом каскада, то подменю открывается, и текущий элемент меню становится первым элементом в подменю. В противном случае, если текущее меню было открыто из кнопки меню, то текущая кнопка меню закрывается, и открывается следующая кнопка меню справа.
Отключенные элементы меню не реагируют: они не активируются и игнорируют нажатия и отпускания кнопок мыши.
Несколько привязок используют команду tk_menuSetFocus. Она сохраняет текущий фокус и устанавливает фокус на ее аргумент pathName, который является виджетом меню.
Поведение меню может быть изменено путем определения новых привязок для отдельных виджетов или путем переопределения привязок класса.
Ошибки
В настоящее время невозможно использовать базу данных опций для указания значений опций для отдельных элементов.См. также
bind, menubutton, ttk::menubutton, toplevel
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TkCmd/menu.htm
Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TkCmd/menu.htm