在我們的程式發生的一些情況, 我們稱之事件, 將該事件及當時相關的引數, 連結到某個函式, 稱為繫結, 當事件發生, 就會呼叫該函式. 事件有關的內容分為三大部份, 事件 event, 回撥函式 callback 以及繫結 binding.
繫結的層級
- 繫結部件, 使用
bind()
方法 - 繫結部件類別, 使用
bind_class()
方法 - 繫結應用, 使用
bind_all()
方法
事件的序列 sequence
- 事件的序列以字串表示, 內含單一或多個事件模式 pattern. 符合要求的事件, 必須所有的事件模式按照順序都發生. 事件通常是標準的輸入裝置, 像鍵盤, 滑鼠等.
- modifier 諸如組合按鍵, 例如 SHIFT, CTRL, ALT;
- type 可以是單一的事件, 如字母或按鍵名
- detail 說明細節, 比如滑鼠的第 3 個按鍵
- 標準的事件序列格式, 說明如後.
<[modifier-]…type[-detail]>
- 例子
<Button-1> type:滑鼠, detail:第一個按鈕
<KeyPress-H> type:按鍵按下, detail:H 鍵
<Control-Shift-KeyPress-H> modifier:Control/Shift, type:按鍵按下, detail:H 鍵
- 簡易表達方式
'<num>'
同'<Button-num>'
'x'
同'<KeyPress-x>'
(不適用空白鍵
及'<'
)
事件的型別 type
事件的型別有很多, 這裡只提到一些常用的型別.
型別 | 名稱 | 說明 |
---|---|---|
36 | Activate | 部件由停用變成可用 |
4 | Button | 滑鼠鍵被按下, Linux 按鍵 4/5 為向上/下滾動 |
5 | ButtonRelease | 滑鼠鍵被放開 |
22 | Configure | 部件的尺寸被改變 |
37 | Deactivate | 部件由可用變成停用 |
17 | Destroy | 部件正在被刪除 |
7 | Enter | 滑鼠移入部件可見的部份 |
12 | Expose | 應用或部件從被其他視窗掩蓋看不見, 而露出來 |
9 | FocusIn | 部件取得焦聚時 |
10 | FocusOut | 部件失去焦聚時 |
2 | KeyPress | 鍵盤的按鍵被按下 |
3 | KeyRelease | 鍵盤的按鍵被放開 |
8 | Leave | 滑鼠離開部件可見的部份 |
19 | Map | 部件在應用中出現 |
6 | Motion | 滑鼠在部件內部移動 |
38 | MouseWheel | 滑鼠滾輪上下滾動, 僅適用於 Window/MacOS |
18 | Unmap | 部件永遠消失不見 |
15 | Visibility | 在螢幕上, 視窗開始可見 |
事件的修飾器 modifier
修飾器 | 說明 |
---|---|
Alt | ALT 鍵按下時 |
Any | 通用情況, 比如按鍵, 滑鼠等, 可以不用指定是哪一個鍵 |
Control | CTRL 鍵按下時 |
Double | 指短時間內, 連續兩次的事件同時發生 |
Lock | caps lock 鍵按下時 |
Shift | Shift 鍵按下時 |
Triple | 指短時間內, 連續三次的事件同時發生 |
按鍵名稱
- keysym 代表字元的字串名稱 key symbol
- keycode 按鍵碼, 不受其他輔助鍵的影響, 如 A 和 a 的 keycode 相同.
- keysym_num 等同 key symbol, 同一按鍵會有不同的代表碼, 比如 A 和 a 的 keysym_num 不同.
- Key 鍵盤上的文字, 這裡以
"Latin-1"
編碼集代表通用的 101 鍵盤.
keysym | keycode | keysym_num | Key |
---|---|---|---|
Alt_L | 64 | 65513 | left alt |
Alt_R | 113 | 65514 | right alt |
BackSpace | 22 | 65288 | backspace |
Cancel | 110 | 65387 | break |
Caps_Lock | 66 | 65549 | CapsLock |
Control_L | 37 | 65507 | left CTRL |
Control_R | 109 | 65508 | right CTRL |
Delete | 107 | 65535 | Delete |
Down | 104 | 65364 | ↓ |
End | 103 | 65367 | end |
Escape | 9 | 65307 | esc |
Execute | 111 | 65378 | SysReq |
F1 | 67 | 65470 | F1 |
F2 | 68 | 65471 | F2 |
Fi | 66+i | 65469+i | Fi |
F12 | 96 | 65481 | F12 |
Home | 97 | 65360 | home |
Insert | 106 | 65379 | insert |
Left | 100 | 65361 | ← |
Linefeed | 54 | 106 | Linefeed (control-J) |
KP_0 | 90 | 65438 | keypad 0 |
KP_1 | 87 | 65436 | keypad 1 |
KP_2 | 88 | 65433 | keypad 2 |
KP_3 | 89 | 65435 | keypad 3 |
KP_4 | 83 | 65430 | keypad 4 |
KP_5 | 84 | 65437 | keypad 5 |
KP_6 | 85 | 65432 | keypad 6 |
KP_7 | 79 | 65429 | keypad 7 |
KP_8 | 80 | 65431 | keypad 8 |
KP_9 | 81 | 65434 | keypad 9 |
KP_Add | 86 | 65451 | keypad + |
KP_Begin | 84 | 65437 | keypad center (5) |
KP_Decimal | 91 | 65439 | keypad . |
KP_Delete | 91 | 65439 | keypad delete |
KP_Divide | 112 | 65455 | keypad / |
KP_Down | 88 | 65433 | keypad ↓ |
KP_End | 87 | 65436 | keypad end |
KP_Enter | 108 | 65421 | keypad enter |
KP_Home | 79 | 65429 | keypad home |
KP_Insert | 90 | 65438 | keypad insert |
KP_Left | 83 | 65430 | keypad ← |
KP_Multiply | 63 | 65450 | keypad × |
KP_Next | 89 | 65435 | keypad PageDown |
KP_Prior | 81 | 65434 | keypad PageUp |
KP_Right | 85 | 65432 | keypad → |
KP_Subtract | 82 | 65453 | keypad - |
KP_Up | 80 | 65431 | keypad ↑ |
Next | 105 | 65366 | PageDown |
Num_Lock | 77 | 65407 | NumLock |
Pause | 110 | 65299 | pause |
111 | 65377 | PrintScrn | |
Prior | 99 | 65365 | PageUp |
Return | 36 | 65293 | enter (control-M) |
Right | 102 | 65363 | → |
Scroll_Lock | 78 | 65300 | ScrollLock |
Shift_L | 50 | 65505 | left shift |
Shift_R | 62 | 65506 | right shift |
Tab | 23 | 65289 | tab |
Up | 98 | 65362 | ↑ |
事件處理函式 handler
- 函式的引數主要是一個事件物件, 用來說明事件發生時的一些情況, 定義的方式如下
def handler_name(event):
""" general function """
...
def handler_name(self, event):
""" general method in a class """
...
- 事件 event 物件的屬性如下, 有的會被設定, 有的不會, 視事件的類別而定.
屬性 | 說明 |
---|---|
char | KeyPress/KeyRelease 事件中, 代表一般 ASCII 字串 |
delta | MouseWheel 事件中, 正值代表上卷, 負值代表下卷; 在 Window 下, 通常是 120 的倍數; 在 MacOS 下, 為 1 的倍數 |
height | Configure 事件中, 代表部件的新高度點素 |
keycode | KeyPress/KeyRelease 事件中, 代表 keycode |
keysym | KeyPress/KeyRelease 事件中, 代表 keysym |
keysym_num | KeyPress/KeyRelease 事件中, 代表 keysym_num |
num | 滑鼠鍵相事件中, 代表按鍵的編號, 在 Linux 下, 按鍵 4 為向上滾動, 按鍵 5 為向下滾動 |
serial | 隨伺服器處理客戶端請求事件發生遞增的序列號, 可以用來確認事件發生的前後關係 |
state | 事件 modifier 的狀態 |
time | 一個時間常數, 每 ms 遞增, 主要可以用來確認事件之間的時差 |
type | 事件的型別碼 type |
widget | 發生事件的部件 |
width | Configure 事件中, 代表部件的新寛度點素 |
x | 事件發生時, 滑鼠所在位置相對於部件左上角的 x 座標 |
y | 事件發生時, 滑鼠所在位置相對於部件左上角的 y 座標 |
x_root | 事件發生時, 滑鼠所在位置相對於螢幕左上角的 x 座標 |
y_root | 事件發生時, 滑鼠所在位置相對於螢幕左上角的 y 座標 |
- 事件物件 event 屬性 state, 每一個位元都代表某一個狀態.
遮罩 | 對應內容 |
---|---|
0x0001 | Shift |
0x0002 | Caps Lock |
0x0004 | Control |
0x0008 | Left-hand Alt |
0x0010 | Num Lock |
0x0080 | Right-hand Alt |
0x0100 | Mouse button 1 |
0x0200 | Mouse button 2 |
0x0400 | Mouse button 3 |
- 虛擬事件
新增一個名為 virtual 字串值的虛擬事件,事件命名為 "<<…>>", sequence 中為一串實際的事件, 任何一個實際的事件發生, 都會引發該虛擬事件.
# event_delete(virtual, *sequences)
w.event_add('<<panic>>', '<Button-3>', '<KeyPress-Pause>')
其他請參考
event_delete(virtual, *sequences)
event_delete(virtual, *sequences)
event_generate(sequence, **kw)
event_info(virtual=None)
待續
本作品採用《CC 協議》,轉載必須註明作者和本文連結