Tkinter (44) 事件 Event

Jason990420發表於2020-08-29

在我們的程式發生的一些情況, 我們稱之事件, 將該事件及當時相關的引數, 連結到某個函式, 稱為繫結, 當事件發生, 就會呼叫該函式. 事件有關的內容分為三大部份, 事件 event, 回撥函式 callback 以及繫結 binding.

繫結的層級

  1. 繫結部件, 使用 bind() 方法
  2. 繫結部件類別, 使用 bind_class() 方法
  3. 繫結應用, 使用 bind_all() 方法

事件的序列 sequence

  1. 事件的序列以字串表示, 內含單一或多個事件模式 pattern. 符合要求的事件, 必須所有的事件模式按照順序都發生. 事件通常是標準的輸入裝置, 像鍵盤, 滑鼠等.
  • modifier 諸如組合按鍵, 例如 SHIFT, CTRL, ALT;
  • type 可以是單一的事件, 如字母或按鍵名
  • detail 說明細節, 比如滑鼠的第 3 個按鍵
  1. 標準的事件序列格式, 說明如後.

<[modifier-]…type[-detail]>

  1. 例子
<Button-1> type:滑鼠, detail:第一個按鈕
<KeyPress-H> type:按鍵按下, detail:H 鍵
<Control-Shift-KeyPress-H> modifier:Control/Shift, type:按鍵按下, detail:H 鍵
  1. 簡易表達方式
  • '<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
Print 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

  1. 函式的引數主要是一個事件物件, 用來說明事件發生時的一些情況, 定義的方式如下
def handler_name(event):
    """ general function """
    ...

def handler_name(self, event):
    """ general method in a class """
    ...
  1. 事件 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 座標
  1. 事件物件 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
  1. 虛擬事件

新增一個名為 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 協議》,轉載必須註明作者和本文連結
Jason Yang

相關文章