Tkinter:事件绑定
正如我們此前提到的,一個 Tkinter 應用程序大部分時間花費在事件循環中(通過 mainloop() 方法進入)。事件可以有各種來源:包括用戶觸發的鼠標和鍵盤操作和窗口管理器觸發的重繪事件(在多數情況下是由用戶間接引起的)。
Tkinter 提供一個強大的機制可以讓你自由地處理事件,對于每個組件來說,你可以通過 bind() 方法將函數或方法綁定到具體的事件上。
widget.bind(event, handler)當被觸發的事件滿足該組件綁定的事件時,Tkinter 就會帶著事件對象(Event)去調用 handler() 方法。
這兒有幾個例子,大家請隨意感受下:
第一個是關于鼠標按鍵的演示:
# 捕獲點擊鼠標的位置 import tkinter as tkroot = tk.Tk()def callback(event):print("點擊位置:", event.x, event.y)frame = tk.Frame(root, width = 200, height = 200) frame.bind("<Button-1>", callback) frame.pack()root.mainloop()在上邊這個例子中,我們使用 Frame 組件的 bind() 方法將鼠標點擊事件(<Button-1>)和我們自定義的 callback() 方法綁定起來。那么運行后的結果是——當你在點擊鼠標左鍵的時候,IDLE 會相應的將鼠標的位置顯示出來(如上圖)。
第二個是關于鍵盤按鍵的演示:
只有當組件獲得焦點的時候才能接收鍵盤事件(Key),下邊例子中我們用 focus_set() 獲得焦點,當你你可以設置 Frame 的 takefocus 選項為 True,然后使用 Tab 將焦點轉移上來。
# 捕獲鍵盤事件 import tkinter as tkroot = tk.Tk()def callback(event):print("點擊的鍵盤字符為:", event.char)frame = tk.Frame(root, width = 200, height = 200) frame.bind("<Key>", callback) frame.focus_set() frame.pack()root.mainloop()最后我們再用一個例子展示捕獲鼠標在組件上的運動軌跡,這里需要關注的是 <Motion> 事件:
# 捕獲鼠標在組件上的運動軌跡 import tkinter as tkroot = tk.Tk()def callback(event):print("當前位置為:", event.x, event.y)frame = tk.Frame(root, width = 200, height = 200) frame.bind("<Motion>", callback) frame.pack()root.mainloop()下方主要內容:
事件序列
Tkinter 使用一種稱為事件序列的機制來允許用戶定義事件,用戶需使用 bind() 方法將具體的事件序列與自定義的方法相綁定。事件序列是以字符串的形式表示的,可以表示一個或多個相關聯的事件(如果是多個事件,那么對應的方法只有在滿足所有事件的前提下才會被調用)。
事件序列使用以下語法描述:
<modifier-type-detail>
- 事件序列是包含在尖括號(<...>)中
- type 部分的內容是最重要的,它通常用于描述普通的事件類型,例如鼠標點擊或鍵盤按鍵點擊(詳見下方)。
- modifier 部分的內容是可選的,它通常用于描述組合鍵,例如 Ctrl + c,Shift + 鼠標左鍵點擊(詳見下方)。
- detail 部分的內容是可選的,它通常用于描述具體的按鍵,例如 Button-1 表示鼠標左鍵。
舉幾個例子幫助大家消化:
| 事件序列 | 含義 |
| <Button-1> | 用戶點擊鼠標左鍵 |
| <KeyPress-H> | 用戶點擊 H 按鍵 |
| <Control-Shift-KeyPress-H> | 用戶同時點擊 Ctrl + Shift + H |
type
| type | 含義 |
| Activate | 當組件的狀態從“未激活”變為“激活”的時候觸發該事件 |
| Button | 1. 當用戶點擊鼠標按鍵的時候觸發該事件 2. detail 部分指定具體哪個按鍵:<Button-1>鼠標左鍵,<Button-2>鼠標中鍵,<Button-3>鼠標右鍵,<Button-4>滾輪上滾(Linux),<Button-5>滾輪下滾(Linux) |
| ButtonRelease | 1. 當用戶釋放鼠標按鍵的時候觸發該事 2. 在大多數情況下,比 Button 要更好用,因為如果當用戶不小心按下鼠標,用戶可以將鼠標移出組件再釋放鼠標,從而避免不小心觸發事件 |
| Configure | 當組件的尺寸發生改變的時候觸發該事件 |
| Deactivate | 當組件的狀態從“激活”變為“未激活”的時候觸發該事件 |
| Destroy | 當組件被銷毀的時候觸發該事件 |
| Enter | 1. 當鼠標指針進入組件的時候觸發該事件 2. 注意:不是指用戶按下回車鍵 |
| Expose | 當窗口或組件的某部分不再被覆蓋的時候觸發該事件 |
| FocusIn | 1. 當組件獲得焦點的時候觸發該事件 2. 用戶可以用 Tab 鍵將焦點轉移到該組件上(需要該組件的 takefocus 選項為 True) 3. 你也可以調用 focus_set() 方法使該組件獲得焦點(見上方例子) |
| FocusOut | 當組件失去焦點的時候觸發該事件 |
| KeyPress | 1. 當用戶按下鍵盤按鍵的時候觸發該事件 2. detail 可以指定具體的按鍵,例如 <KeyPress-H>表示當大寫字母 H 被按下的時候觸發該事件 3. KeyPress 可以簡寫為 Key |
| KeyRelease | 當用戶釋放鍵盤按鍵的時候觸發該事件 |
| Leave | 當鼠標指針離開組件的時候觸發該事件 |
| Map | 1. 當組件被映射的時候觸發該事件 2. 意思是在應用程序中顯示該組件的時候,例如調用 grid() 方法 |
| Motion | 當鼠標在組件內移動的整個過程均觸發該事件 |
| MouseWheel | 1. 當鼠標滾輪滾動的時候觸發該事件 2. 目前該事件僅支持 Windows 和 Mac 系統,Linux 系統請參考 Button |
| Unmap | 1. 當組件被取消映射的時候觸發該事件 2. 意思是在應用程序中不再顯示該組件的時候,例如調用 grid_remove() 方法 |
| Visibility | 當應用程序至少有一部分在屏幕中是可見的時候觸發該事件 |
modifier
在事件序列中,modifier 部分的內容可以是以下這些:
| modifier | 含義 |
| Alt | 當按下 Alt 按鍵的時候 |
| Any | 1. 表示任何類型的按鍵被按下的時候 2. 例如 <Any-KeyPress> 表示當用戶按下任何按鍵時觸發事件 |
| Control | 當按下 Ctrl 按鍵的時候 |
| Double | 1. 當后續兩個事件被連續觸發的時候 2. 例如 <Double-Button-1> 表示當用戶雙擊鼠標左鍵時觸發事件 |
| Lock | 當打開大寫字母鎖定鍵(CapsLock)的時候 |
| Shift | 當按下 Shift 按鍵的時候 |
| Triple | 跟 Double 類似,當后續三個事件被連續觸發的時候 |
Event 對象
當 Tkinter 去回調你定義的函數的時候,都會帶著 Event 對象(作為參數)去調用,Event 對象以下這些屬性你可以使用:
| 屬性 | 含義 |
| widget | 產生該事件的組件 |
| x, y | 當前的鼠標位置坐標(相對于窗口左上角,像素為單位) |
| x_root, y_root | 當前的鼠標位置坐標(相對于屏幕左上角,像素為單位) |
| char | 按鍵對應的字符(鍵盤事件專屬) |
| keysym | 按鍵名,見下方 Key names(鍵盤事件專屬) |
| keycode | 按鍵碼,見下方 Key names(鍵盤事件專屬) |
| num | 按鈕數字(鼠標事件專屬) |
| width, height | 組件的新尺寸(Configure 事件專屬) |
| type | 該事件類型 |
Key names
當事件為 <Key>,<KeyPress>,<KeyRelease> 的時候,detail 可以通過設定具體的按鍵名(keysym)來篩選。例如 <Key-H> 表示按下鍵盤上的大寫字母 H 時候觸發事件,<Key-Tab> 表示按下鍵盤上的 Tab 按鍵的時候觸發事件。
下表列舉了鍵盤所有特殊按鍵的 keysym 和 keycode:
(下邊按鍵碼是對應美國標準 101 鍵盤的“Latin-1”字符集,鍵盤標準不同對應的按鍵碼不同,但按鍵名是一樣的)
| 按鍵名(keysym) | 按鍵碼(keycode) | 代表的按鍵 |
| Alt_L | 64 | 左邊的 Alt 按鍵 |
| Alt_R | 113 | 右邊的 Alt 按鍵 |
| BackSpace | 22 | Backspace(退格)按鍵 |
| Cancel | 110 | break 按鍵 |
| Caps_Lock | 66 | CapsLock(大寫字母鎖定)按鍵 |
| Control_L | 37 | 左邊的 Ctrl 按鍵 |
| Control_R | 109 | 右邊的 Ctrl 按鍵 |
| Delete | 107 | Delete 按鍵 |
| Down | 104 | ↓ 按鍵 |
| End | 103 | End 按鍵 |
| Escape | 9 | Esc 按鍵 |
| Execute | 111 | SysReq 按鍵 |
| F1 | 67 | F1 按鍵 |
| F2 | 68 | F2 按鍵 |
| F3 | 69 | F3 按鍵 |
| F4 | 70 | F4 按鍵 |
| F5 | 71 | F5 按鍵 |
| F6 | 72 | F6 按鍵 |
| F7 | 73 | F7 按鍵 |
| F8 | 74 | F8 按鍵 |
| F9 | 75 | F9 按鍵 |
| F10 | 76 | F10 按鍵 |
| F11 | 77 | F11 按鍵 |
| F12 | 96 | F12 按鍵 |
| Home | 97 | Home 按鍵 |
| Insert | 106 | Insert 按鍵 |
| Left | 100 | ← 按鍵 |
| Linefeed | 54 | Linefeed(Ctrl + J) |
| KP_0 | 90 | 小鍵盤數字 0 |
| KP_1 | 87 | 小鍵盤數字 1 |
| KP_2 | 88 | 小鍵盤數字 2 |
| KP_3 | 89 | 小鍵盤數字 3 |
| KP_4 | 83 | 小鍵盤數字 4 |
| KP_5 | 84 | 小鍵盤數字 5 |
| KP_6 | 85 | 小鍵盤數字 6 |
| KP_7 | 79 | 小鍵盤數字 7 |
| KP_8 | 80 | 小鍵盤數字 8 |
| KP_9 | 81 | 小鍵盤數字 9 |
| KP_Add | 86 | 小鍵盤的 + 按鍵 |
| KP_Begin | 84 | 小鍵盤的中間按鍵(5) |
| KP_Decimal | 91 | 小鍵盤的點按鍵(.) |
| KP_Delete | 91 | 小鍵盤的刪除鍵 |
| KP_Divide | 112 | 小鍵盤的 / 按鍵 |
| KP_Down | 88 | 小鍵盤的 ↓ 按鍵 |
| KP_End | 87 | 小鍵盤的 End 按鍵 |
| KP_Enter | 108 | 小鍵盤的 Enter 按鍵 |
| KP_Home | 79 | 小鍵盤的 Home 按鍵 |
| KP_Insert | 90 | 小鍵盤的 Insert 按鍵 |
| KP_Left | 83 | 小鍵盤的 ← 按鍵 |
| KP_Multiply | 63 | 小鍵盤的 * 按鍵 |
| KP_Next | 89 | 小鍵盤的 PageDown 按鍵 |
| KP_Prior | 81 | 小鍵盤的 PageUp 按鍵 |
| KP_Right | 85 | 小鍵盤的 → 按鍵 |
| KP_Subtract | 82 | 小鍵盤的 - 按鍵 |
| KP_Up | 80 | 小鍵盤的 ↑ 按鍵 |
| Next | 105 | PageDown 按鍵 |
| Num_Lock | 77 | NumLock(數字鎖定)按鍵 |
| Pause | 110 | Pause(暫停)按鍵 |
| 111 | PrintScrn(打印屏幕)按鍵 | |
| Prior | 99 | PageUp 按鍵 |
| Return | 36 | Enter(回車)按鍵 |
| Right | 102 | → 按鍵 |
| Scroll_Lock | 78 | ScrollLock 按鍵 |
| Shift_L | 50 | 左邊的 Shift 按鍵 |
| Shift_R | 62 | 右邊的 Shift 按鍵 |
| Tab | 23 | Tab(制表)按鍵 |
| Up | 98 | ↑ 按鍵 |
總結
以上是生活随笔為你收集整理的Tkinter:事件绑定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解JVM - ZGC垃圾收集器
- 下一篇: sql语句中select……as的用法