Spec-Zone.ru › Tcl/Tk

event

НАЗВАНИЕ
event — Разнообразные средства обработки событий: определение виртуальных событий и генерация событий
СИНТАКСИС
ОПИСАНИЕ
event add <<virtual>> sequence ?sequence ...?
event delete <<virtual>> ?sequence sequence ...?
event generate window event ?option value option value ...?
event info ?<<virtual>>?
ПОЛЯ СОБЫТИЙ
-above window
-borderwidth size
-button number
-count number
-data string
-delta number
-detail detail
-focus boolean
-height size
-keycode number
-keysym name
-mode notify
-override boolean
-place where
-root window
-rootx coord
-rooty coord
-sendevent boolean
-serial number
-state state
-subwindow window
-time integer
-warp boolean
-width size
-when when
now
tail
head
mark
-x coord
-y coord
ПРЕДОПРЕДЕЛЕННЫЕ ВИРТУАЛЬНЫЕ СОБЫТИЯ
<<AltUnderlined>>
<<Invoke>>
<<ListboxSelect>>
<<MenuSelect>>
<<Modified>>
<<Selection>>
<<ThemeChanged>>
<<TraverseIn>>
<<TraverseOut>>
<<UndoStack>>
<<WidgetViewSync>>
<<Clear>>
<<Copy>>
<<Cut>>
<<LineEnd>>
<<LineStart>>
<<NextChar>>
<<NextLine>>
<<NextPara>>
<<NextWord>>
<<Paste>>
<<PasteSelection>>
<<PrevChar>>
<<PrevLine>>
<<PrevPara>>
<<PrevWindow>>
<<PrevWord>>
<<Redo>>
<<SelectAll>>
<<SelectLineEnd>>
<<SelectLineStart>>
<<SelectNextChar>>
<<SelectNextLine>>
<<SelectNextPara>>
<<SelectNextWord>>
<<SelectNone>>
<<SelectPrevChar>>
<<SelectPrevLine>>
<<SelectPrevPara>>
<<SelectPrevWord>>
<<ToggleSelection>>
<<Undo>>
ПРИМЕРЫ
СОПОСТАВЛЕНИЕ КЛАВИШ С ВИРТУАЛЬНЫМИ СОБЫТИЯМИ
ПЕРЕМЕЩЕНИЕ УКАЗАТЕЛЯ МЫШИ
СМОТРИТЕ ТАКЖЕ
КЛЮЧЕВЫЕ СЛОВА

Название

event — Разнообразные средства обработки событий: определение виртуальных событий и генерация событий

Синтаксис

event option ?arg arg ...?

Описание

Команда event предоставляет несколько средств для работы с событиями системы окон, таких как определение виртуальных событий и синтезирование событий. У команды есть несколько различных форм, определяемых первым аргументом. В настоящее время поддерживаются следующие формы:
event add <<virtual>> sequence ?sequence ...?
Ассоциирует виртуальное событие virtual с физическим(и) событием(ями) последовательность(ями), заданными аргументами sequence, таким образом, что виртуальное событие будет срабатывать всякий раз, когда происходит любое из событий sequence. Virtual может иметь любое строковое значение, а sequence может принимать любые значения, разрешённые для аргумента sequence команды bind. Если virtual уже определено, новые физические последовательности событий добавляются к существующим последовательностям для события.
event delete <<virtual>> ?sequence sequence ...?
Удаляет каждую из последовательностей sequence из тех, которые ассоциированы с виртуальным событием, заданным virtual. Virtual может иметь любое строковое значение, а sequence может принимать любые значения, разрешённые для аргумента sequence команды bind. Любые sequence, которые не ассоциированы в данный момент с virtual, игнорируются. Если аргумент sequence не указан, все физические последовательности событий удаляются для virtual, так что виртуальное событие больше не будет срабатывать.
event generate window event ?option value option value ...?
Генерирует событие окна и организует его обработку так, как если бы оно пришло из системы окон. Window задаёт имя пути окна, для которого будет сгенерировано событие; оно также может быть идентификатором (например, возвращённым функцией winfo id), при условии, что он относится к окну в текущем приложении. Event предоставляет основное описание события, например, <Shift-Button-2> или <<Paste>>. Если Window пустое, подразумевается всё окно, и координаты относительны к экрану. Event может принимать любые формы, разрешённые для аргумента sequence команды bind, за исключением того, что он должен состоять из одного шаблона события, а не последовательности. Пары option-value могут использоваться для указания дополнительных атрибутов события, таких как положение x и y мыши; см. ПОЛЯ СОБЫТИЙ ниже. Если опция -when не указана, событие обрабатывается немедленно: все обработчики события будут завершены до возврата команды event generate. Если опция -when указана, она определяет, когда событие будет обработано. Некоторые события, такие как события нажатия клавиш, требуют, чтобы окно имело фокус для надлежащего получения события.
event info ?<<virtual>>?
Возвращает информацию о виртуальных событиях. Если аргумент <<virtual>> опущен, возвращаемое значение представляет собой список всех виртуальных событий, которые в данный момент определены. Если <<virtual>> указан, возвращаемое значение представляет собой список, элементы которого — физические последовательности событий, которые в настоящее время определены для заданного виртуального события; если виртуальное событие не определено, возвращается пустая строка.

Обратите внимание, что виртуальные события, которые не привязаны к физическим последовательностям событий, не возвращаются функцией event info.

Поля событий

Следующие опции поддерживаются командой event generate. Они соответствуют расширениям «%», разрешённым в скриптах привязки для команды bind.
-above window
Окно задаёт поле above для события, либо в виде имени пути к окну, либо в виде целового идентификатора окна. Допустимо для событий Configure. Соответствует подстановке %a в скриптах привязки.
-borderwidth size
Размер должен быть расстоянием на экране; он задаёт поле border_width для события. Допустимо для событий Configure. Соответствует подстановке %B в скриптах привязки.
-button number
Число должно быть целым; оно задаёт поле detail для события ButtonPress или ButtonRelease, перезаписывая любое значение номера кнопки, указанное в базовом аргументе event. Соответствует подстановке %b в скриптах привязки.
-count number
Число должно быть целым; оно задаёт поле count для события. Допустимо для событий Expose. Соответствует подстановке %c в скриптах привязки.
-data string
Строка может быть любым значением; она задаёт поле user_data для события. Допустимо только для виртуальных событий. Соответствует подстановке %d в скриптах привязки для виртуальных событий.
-delta number
Число должно быть целым; оно задаёт поле delta для события MouseWheel. Delta относится к направлению и величине поворота колесика мыши. Обратите внимание, что значение не является расстоянием на экране, а представляет собой единицы перемещения колесика мыши. Обычно эти значения являются кратными 120. Например, 120 должно прокрутить текстовое поле вверх на 4 строки, а -240 — прокрутить его вниз на 8 строк. Конечно, другие виджеты могут определять различное поведение для движения колесика мыши. Это поле соответствует подстановке %D в скриптах привязки.
-detail detail
Detail задаёт поле detail для события и должно быть одним из следующих:

NotifyAncestor

NotifyNonlinearVirtual

NotifyDetailNone

NotifyPointer

NotifyInferior

NotifyPointerRoot

NotifyNonlinear

NotifyVirtual

Допустимо для событий Enter, Leave, FocusIn и FocusOut. Соответствует подстановке %d в скриптах привязки.
-focus boolean
Boolean должно быть булевым значением; оно задаёт поле focus для события. Допустимо для событий Enter и Leave. Соответствует подстановке %f в скриптах привязки.
-height size
Размер должен быть расстоянием на экране; он задаёт поле height для события. Допустимо для событий Configure. Соответствует подстановке %h в скриптах привязки.
-keycode number
Число должно быть целым; оно задаёт поле keycode для события. Допустимо для событий KeyPress и KeyRelease. Соответствует подстановке %k в скриптах привязки.
-keysym name
Имя должно быть именем допустимого keysym, например, g, space или Return; соответствующее значение keycode используется как поле keycode для события, перезаписывая любое значение detail, указанное в базовом аргументе event. Допустимо для событий KeyPress и KeyRelease. Соответствует подстановке %K в скриптах привязки.
-mode notify
Notify задаёт поле mode для события и должно быть одним из NotifyNormal, NotifyGrab, NotifyUngrab или NotifyWhileGrabbed. Допустимо для событий Enter, Leave, FocusIn и FocusOut. Соответствует подстановке %m в скриптах привязки.
-override boolean
Boolean должно быть булевым значением; оно задаёт поле override_redirect для события. Допустимо для событий Map, Reparent и Configure. Соответствует подстановке %o в скриптах привязки.
-place where
Где задаёт поле place для события; оно должно быть либо PlaceOnTop, либо PlaceOnBottom. Допустимо для событий Circulate. Соответствует подстановке %p в скриптах привязки.
-root window
Окно должно быть именем пути к окну или целовым идентификатором окна; оно задаёт поле root для события. Допустимо для событий KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave и Motion. Соответствует подстановке %R в скриптах привязки.
-rootx coord
Координата должна быть расстоянием на экране; она задаёт поле x_root для события. Допустимо для событий KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave и Motion. Соответствует подстановке %X в скриптах привязки.
-rooty coord
Координата должна быть расстоянием на экране; она задаёт поле y_root для события. Допустимо для событий KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave и Motion. Соответствует подстановке %Y в скриптах привязки.
-sendevent boolean
Boolean должно быть булевым значением; оно задаёт поле send_event для события. Допустимо для всех событий. Соответствует подстановке %E в скриптах привязки.
-serial number
Число должно быть целым; оно задаёт поле serial для события. Допустимо для всех событий. Соответствует подстановке %# в скриптах привязки.
-state state
State задаёт поле state для события. Для событий KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave и Motion оно должно быть целым значением. Для событий Visibility оно должно быть одним из VisibilityUnobscured, VisibilityPartiallyObscured или VisibilityFullyObscured. Этот параметр перезаписывает любые модификаторы, такие как Meta или Control, указанные в базовом аргументе event. Соответствует подстановке %s в скриптах привязки.
-subwindow window
Окно задаёт поле subwindow для события, либо в виде имени пути к Tk виджету, либо в виде целового идентификатора окна. Допустимо для событий KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave и Motion. Аналогично подстановке %S в скриптах привязки.
-time integer
Целое должно быть целым значением; оно задаёт поле time для события. Допустимо для событий KeyPress, KeyRelease, ButtonPress, ButtonRelease, Enter, Leave, Motion и Property. Соответствует подстановке %t в скриптах привязки.
-warp boolean
boolean должно быть булевым значением; указывает, нужно ли также перемещать указатель мыши. Допустимо для событий KeyPress, KeyRelease, ButtonPress, ButtonRelease и Motion. Указатель будет перемещён только в то окно, если оно отображено.
-width size
Размер должен быть расстоянием на экране; он задаёт поле width для события. Допустимо для событий Configure. Соответствует подстановке %w в скриптах привязки.
-when when
Когда определяет, когда событие будет обработано; оно должно иметь одно из следующих значений:
now
Обработать событие немедленно, прежде чем команда вернётся. Это также происходит, если параметр -when опущен.
tail
Поместить событие в очередь событий Tcl позади любых событий, уже в очереди для этого приложения.
head
Поместить событие в начало очереди событий Tcl, так что оно будет обработано перед любыми другими событиями, уже в очереди.
mark
Поместить событие в начало очереди событий Tcl, но позади любых других событий, уже в очереди с -when mark. Этот параметр полезен при генерировании серии событий, которые должны обрабатываться в порядке, но в начале очереди.
-x coord
Координата должна быть расстоянием на экране; она задаёт поле x для события. Допустимо для событий KeyPress, KeyRelease, ButtonPress, ButtonRelease, Motion, Enter, Leave, Expose, Configure, Gravity и Reparent. Соответствует подстановке %x в скриптах привязки. Если Окно пустое, координата относительна экрана, и этот параметр соответствует подстановке %X в скриптах привязки.
-y coord
Координата должна быть расстоянием на экране; она задаёт поле y для события. Допустимо для событий KeyPress, KeyRelease, ButtonPress, ButtonRelease, Motion, Enter, Leave, Expose, Configure, Gravity и Reparent. Соответствует подстановке %y в скриптах привязки. Если Окно пустое, координата относительна экрана, и этот параметр соответствует подстановке %Y в скриптах привязки.

Любые параметры, которые не указаны при генерации события, заполняются значением 0, за исключением serial, который заполняется следующим номером последовательности событий X.

Предопределённые виртуальные события

Tk определяет следующие виртуальные события для целей уведомления:
<<AltUnderlined>>
Это сообщение отправляется виджету для уведомления о том, что нажата клавиша Alt в сочетании с буквой, которая была подчеркнута (в качестве индикатора ускоренного доступа) с параметром -underline. Обычно это приводит к тому, что виджет (или какой-либо связанный виджет) получает фокус или вызывается действие виджета.
<<Invoke>>
Это сообщение может быть отправлено некоторым виджетам (например, кнопке, списку, меню) в качестве альтернативы <space>.
<<ListboxSelect>>
Это сообщение отправляется списку, когда обновляется набор выбранных элементов в списке.
<<MenuSelect>>
Это сообщение отправляется меню, когда меняется текущий выбранный элемент в меню. Оно предназначено для использования с контекстно-зависимыми системами справки.
<<Modified>>
Это сообщение отправляется текстовому виджету, когда содержимое виджета изменяется.
<<Selection>>
Это сообщение отправляется текстовому виджету, когда изменяется выделение в виджете.
<<ThemeChanged>>
Это сообщение отправляется текстовому виджету, когда изменилась тема ttk (Tile).
<<TraverseIn>>
Это сообщение отправляется виджету, когда фокус попадает в виджет из-за действия пользователя «переход к виджету» с помощью клавиши табуляции.
<<TraverseOut>>
Это сообщение отправляется виджету, когда фокус покидает виджет из-за действия пользователя «переход к виджету» с помощью клавиши табуляции.
<<UndoStack>>
Это сообщение отправляется текстовому виджету, когда его стек отмены или стек повтора становится пустым или непустым.
<<WidgetViewSync>>
Это сообщение отправляется текстовому виджету, когда его внутренние данные становятся устаревшими, а затем снова, когда эти внутренние данные снова синхронизируются с представлением виджета. Поле детали (%d замена) имеет значение true (когда виджет синхронизирован) или false (когда он не синхронизирован).

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

<<Clear>>
Удалить содержимое текущего выбранного виджета.
<<Copy>>
Скопировать содержимое текущего выбранного виджета в буфер обмена.
<<Cut>>
Переместить содержимое текущего выбранного виджета в буфер обмена.
<<LineEnd>>
Переместиться в конец строки в текущем виджете, одновременно сбросив любое выделенное содержимое.
<<LineStart>>
Переместиться в начало строки в текущем виджете, одновременно сбросив любое выделенное содержимое.
<<NextChar>>
Переместиться к следующему элементу (т.е., видимому символу) в текущем виджете, одновременно сбросив любое выделенное содержимое.
<<NextLine>>
Переместиться к следующей строке в текущем виджете, одновременно сбросив любое выделенное содержимое.
<<NextPara>>
Переместиться к следующему абзацу в текущем виджете, одновременно сбросив любое выделенное содержимое.
<<NextWord>>
Переместиться к следующей группе элементов (т.е., видимому слову) в текущем виджете, одновременно сбросив любое выделенное содержимое.
<<Paste>>
Заменить содержимое текущего выбранного виджета содержимым буфера обмена.
<<PasteSelection>>
Вставить содержимое выделения в позицию указателя мыши. (Это событие имеет осмысленные замены %x и %y).
<<PrevChar>>
Переместиться к предыдущему элементу (т.е., видимому символу) в текущем виджете, одновременно сбросив любое выделенное содержимое.
<<PrevLine>>
Переместиться к предыдущей строке в текущем виджете, одновременно сбросив любое выделенное содержимое.
<<PrevPara>>
Переместиться к предыдущему абзацу в текущем виджете, одновременно сбросив любое выделенное содержимое.
<<PrevWindow>>
Перейти к предыдущему окну.
<<PrevWord>>
Переместиться к предыдущей группе элементов (т.е., видимому слову) в текущем виджете, одновременно сбросив любое выделенное содержимое.
<<Redo>>
Повторить одно отменённое действие.
<<SelectAll>>
Установить диапазон выбранного содержимого для всего виджета.
<<SelectLineEnd>>
Переместиться в конец строки в текущем виджете, одновременно расширив диапазон выбранного содержимого.
<<SelectLineStart>>
Переместиться в начало строки в текущем виджете, одновременно расширив диапазон выбранного содержимого.
<<SelectNextChar>>
Переместиться к следующему элементу (т.е., видимому символу) в текущем виджете, одновременно расширив диапазон выбранного содержимого.
<<SelectNextLine>>
Переместиться к следующей строке в текущем виджете, одновременно расширив диапазон выбранного содержимого.
<<SelectNextPara>>
Переместиться к следующему абзацу в текущем виджете, одновременно расширив диапазон выбранного содержимого.
<<SelectNextWord>>
Переместиться к следующей группе элементов (т.е., видимому слову) в текущем виджете, одновременно расширив диапазон выбранного содержимого.
<<SelectNone>>
Сбросить диапазон выбранного содержимого до пустого.
<<SelectPrevChar>>
Переместиться к предыдущему элементу (т.е., видимому символу) в текущем виджете, одновременно расширив диапазон выбранного содержимого.
<<SelectPrevLine>>
Переместиться к предыдущей строке в текущем виджете, одновременно расширив диапазон выбранного содержимого.
<<SelectPrevPara>>
Переместиться к предыдущему абзацу в текущем виджете, одновременно расширив диапазон выбранного содержимого.
<<SelectPrevWord>>
Переместиться к предыдущей группе элементов (т.е., видимому слову) в текущем виджете, одновременно расширив диапазон выбранного содержимого.
<<ToggleSelection>>
Переключить выделение.
<<Undo>>
Отменить последнее действие.

Примеры

Сопоставление клавиш с виртуальными событиями

Для того, чтобы привязка к виртуальному событию сработала, необходимо выполнить два шага. Во-первых, виртуальное событие должно быть определено с помощью команды event add. Во-вторых, для виртуального события должна быть создана привязка с помощью команды bind. Рассмотрим следующие определения виртуальных событий:
event add <<Paste>> <Control-y>
event add <<Paste>> <Button-2>
event add <<Save>> <Control-X><Control-S>
event add <<Save>> <Shift-F12>
if {[tk windowingsystem] eq "aqua"} {
    event add <<Save>> <Command-s>
}

В команде bind виртуальное событие можно привязать как и любое другое встроенное событие следующим образом:

bind Entry <<Paste>> {%W insert [selection get]}

Двойные угловые скобки используются для указания того, что привязывается виртуальное событие. Если пользователь нажмёт Control-y или нажмёт правую кнопку мыши, или если виртуальное событие <<Paste>> будет сгенерировано с помощью event generate, то привязка <<Paste>> будет вызвана.

Если виртуальная привязка имеет точно такую же последовательность, как и отдельная физическая привязка, то будет иметь приоритет физическая привязка. Рассмотрим следующий пример:

event add <<Paste>> <Control-y> <Meta-Control-y>
bind Entry <Control-y> {puts Control-y}
bind Entry <<Paste>> {puts Paste}

Когда пользователь нажмёт Control-y, будет вызвана привязка <Control-y>, потому что физическое событие считается более специфичным, чем виртуальное событие при прочих равных условиях. Однако, когда пользователь нажмёт Meta-Control-y, будет вызвана привязка <<Paste>>, потому что модификатор Meta в физическом шаблоне, связанном с виртуальной привязкой, является более специфичным, чем последовательность <Control-y> для физического события.

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

Если определение виртуального события изменяется во время выполнения, все окна мгновенно отреагируют на новое определение. Исходя из предыдущего примера, если выполнить следующий код:

bind Entry <Control-y> {}
event add <<Paste>> <Key-F6>

поведение изменится двумя способами. Во-первых, появится затенённая привязка <<Paste>>. Нажатие клавиш Control-y больше не вызовет привязки <Control-y>, а вместо этого вызовет виртуальное событие <<Paste>>. Во-вторых, нажатие клавиши F6 также вызовет привязку <<Paste>>.

Перемещение указателя мыши

Иногда полезно уметь перемещать указатель мыши. Например, если у вас есть какое-либо программное обеспечение, которое способно напрямую продемонстрировать пользователю, как использовать программу. Для этого нужно «переместить» указатель мыши, используя event generate, например, так:
for {set xy 0} {$xy < 200} {incr xy} {
    event generate . <Motion> -x $xy -y $xy -warp 1
    update
    after 50
}

Обратите внимание, что обычно считается плохим стилем перемещать указатель мыши за пользователя, так как это лишает его контроля. Поэтому эту технику следует использовать с осторожностью. Также обратите внимание, что она не гарантирует работы на всех платформах.

См. также

bind

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TkCmd/event.htm

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TkCmd/event.htm

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API