Tkinter:事件绑定
正如我們此前提到的,一個 Tkinter 應(yīng)用程序大部分時間花費(fèi)在事件循環(huán)中(通過 mainloop() 方法進(jìn)入)。事件可以有各種來源:包括用戶觸發(fā)的鼠標(biāo)和鍵盤操作和窗口管理器觸發(fā)的重繪事件(在多數(shù)情況下是由用戶間接引起的)。
Tkinter 提供一個強(qiáng)大的機(jī)制可以讓你自由地處理事件,對于每個組件來說,你可以通過 bind() 方法將函數(shù)或方法綁定到具體的事件上。
widget.bind(event, handler)當(dāng)被觸發(fā)的事件滿足該組件綁定的事件時,Tkinter 就會帶著事件對象(Event)去調(diào)用 handler() 方法。
這兒有幾個例子,大家請隨意感受下:
第一個是關(guān)于鼠標(biāo)按鍵的演示:
# 捕獲點擊鼠標(biāo)的位置 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() 方法將鼠標(biāo)點擊事件(<Button-1>)和我們自定義的 callback() 方法綁定起來。那么運(yùn)行后的結(jié)果是——當(dāng)你在點擊鼠標(biāo)左鍵的時候,IDLE 會相應(yīng)的將鼠標(biāo)的位置顯示出來(如上圖)。
第二個是關(guān)于鍵盤按鍵的演示:
只有當(dāng)組件獲得焦點的時候才能接收鍵盤事件(Key),下邊例子中我們用 focus_set() 獲得焦點,當(dāng)你你可以設(shè)置 Frame 的 takefocus 選項為 True,然后使用 Tab 將焦點轉(zhuǎn)移上來。
# 捕獲鍵盤事件 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()最后我們再用一個例子展示捕獲鼠標(biāo)在組件上的運(yùn)動軌跡,這里需要關(guān)注的是 <Motion> 事件:
# 捕獲鼠標(biāo)在組件上的運(yùn)動軌跡 import tkinter as tkroot = tk.Tk()def callback(event):print("當(dāng)前位置為:", event.x, event.y)frame = tk.Frame(root, width = 200, height = 200) frame.bind("<Motion>", callback) frame.pack()root.mainloop()下方主要內(nèi)容:
事件序列
Tkinter 使用一種稱為事件序列的機(jī)制來允許用戶定義事件,用戶需使用 bind() 方法將具體的事件序列與自定義的方法相綁定。事件序列是以字符串的形式表示的,可以表示一個或多個相關(guān)聯(lián)的事件(如果是多個事件,那么對應(yīng)的方法只有在滿足所有事件的前提下才會被調(diào)用)。
事件序列使用以下語法描述:
<modifier-type-detail>
- 事件序列是包含在尖括號(<...>)中
- type 部分的內(nèi)容是最重要的,它通常用于描述普通的事件類型,例如鼠標(biāo)點擊或鍵盤按鍵點擊(詳見下方)。
- modifier 部分的內(nèi)容是可選的,它通常用于描述組合鍵,例如 Ctrl + c,Shift + 鼠標(biāo)左鍵點擊(詳見下方)。
- detail 部分的內(nèi)容是可選的,它通常用于描述具體的按鍵,例如 Button-1 表示鼠標(biāo)左鍵。
舉幾個例子幫助大家消化:
| 事件序列 | 含義 |
| <Button-1> | 用戶點擊鼠標(biāo)左鍵 |
| <KeyPress-H> | 用戶點擊 H 按鍵 |
| <Control-Shift-KeyPress-H> | 用戶同時點擊 Ctrl + Shift + H |
type
| type | 含義 |
| Activate | 當(dāng)組件的狀態(tài)從“未激活”變?yōu)椤凹せ睢钡臅r候觸發(fā)該事件 |
| Button | 1. 當(dāng)用戶點擊鼠標(biāo)按鍵的時候觸發(fā)該事件 2. detail 部分指定具體哪個按鍵:<Button-1>鼠標(biāo)左鍵,<Button-2>鼠標(biāo)中鍵,<Button-3>鼠標(biāo)右鍵,<Button-4>滾輪上滾(Linux),<Button-5>滾輪下滾(Linux) |
| ButtonRelease | 1. 當(dāng)用戶釋放鼠標(biāo)按鍵的時候觸發(fā)該事 2. 在大多數(shù)情況下,比 Button 要更好用,因為如果當(dāng)用戶不小心按下鼠標(biāo),用戶可以將鼠標(biāo)移出組件再釋放鼠標(biāo),從而避免不小心觸發(fā)事件 |
| Configure | 當(dāng)組件的尺寸發(fā)生改變的時候觸發(fā)該事件 |
| Deactivate | 當(dāng)組件的狀態(tài)從“激活”變?yōu)椤拔醇せ睢钡臅r候觸發(fā)該事件 |
| Destroy | 當(dāng)組件被銷毀的時候觸發(fā)該事件 |
| Enter | 1. 當(dāng)鼠標(biāo)指針進(jìn)入組件的時候觸發(fā)該事件 2. 注意:不是指用戶按下回車鍵 |
| Expose | 當(dāng)窗口或組件的某部分不再被覆蓋的時候觸發(fā)該事件 |
| FocusIn | 1. 當(dāng)組件獲得焦點的時候觸發(fā)該事件 2. 用戶可以用 Tab 鍵將焦點轉(zhuǎn)移到該組件上(需要該組件的 takefocus 選項為 True) 3. 你也可以調(diào)用 focus_set() 方法使該組件獲得焦點(見上方例子) |
| FocusOut | 當(dāng)組件失去焦點的時候觸發(fā)該事件 |
| KeyPress | 1. 當(dāng)用戶按下鍵盤按鍵的時候觸發(fā)該事件 2. detail 可以指定具體的按鍵,例如 <KeyPress-H>表示當(dāng)大寫字母 H 被按下的時候觸發(fā)該事件 3. KeyPress 可以簡寫為 Key |
| KeyRelease | 當(dāng)用戶釋放鍵盤按鍵的時候觸發(fā)該事件 |
| Leave | 當(dāng)鼠標(biāo)指針離開組件的時候觸發(fā)該事件 |
| Map | 1. 當(dāng)組件被映射的時候觸發(fā)該事件 2. 意思是在應(yīng)用程序中顯示該組件的時候,例如調(diào)用 grid() 方法 |
| Motion | 當(dāng)鼠標(biāo)在組件內(nèi)移動的整個過程均觸發(fā)該事件 |
| MouseWheel | 1. 當(dāng)鼠標(biāo)滾輪滾動的時候觸發(fā)該事件 2. 目前該事件僅支持 Windows 和 Mac 系統(tǒng),Linux 系統(tǒng)請參考 Button |
| Unmap | 1. 當(dāng)組件被取消映射的時候觸發(fā)該事件 2. 意思是在應(yīng)用程序中不再顯示該組件的時候,例如調(diào)用 grid_remove() 方法 |
| Visibility | 當(dāng)應(yīng)用程序至少有一部分在屏幕中是可見的時候觸發(fā)該事件 |
modifier
在事件序列中,modifier 部分的內(nèi)容可以是以下這些:
| modifier | 含義 |
| Alt | 當(dāng)按下 Alt 按鍵的時候 |
| Any | 1. 表示任何類型的按鍵被按下的時候 2. 例如 <Any-KeyPress> 表示當(dāng)用戶按下任何按鍵時觸發(fā)事件 |
| Control | 當(dāng)按下 Ctrl 按鍵的時候 |
| Double | 1. 當(dāng)后續(xù)兩個事件被連續(xù)觸發(fā)的時候 2. 例如 <Double-Button-1> 表示當(dāng)用戶雙擊鼠標(biāo)左鍵時觸發(fā)事件 |
| Lock | 當(dāng)打開大寫字母鎖定鍵(CapsLock)的時候 |
| Shift | 當(dāng)按下 Shift 按鍵的時候 |
| Triple | 跟 Double 類似,當(dāng)后續(xù)三個事件被連續(xù)觸發(fā)的時候 |
Event 對象
當(dāng) Tkinter 去回調(diào)你定義的函數(shù)的時候,都會帶著 Event 對象(作為參數(shù))去調(diào)用,Event 對象以下這些屬性你可以使用:
| 屬性 | 含義 |
| widget | 產(chǎn)生該事件的組件 |
| x, y | 當(dāng)前的鼠標(biāo)位置坐標(biāo)(相對于窗口左上角,像素為單位) |
| x_root, y_root | 當(dāng)前的鼠標(biāo)位置坐標(biāo)(相對于屏幕左上角,像素為單位) |
| char | 按鍵對應(yīng)的字符(鍵盤事件專屬) |
| keysym | 按鍵名,見下方 Key names(鍵盤事件專屬) |
| keycode | 按鍵碼,見下方 Key names(鍵盤事件專屬) |
| num | 按鈕數(shù)字(鼠標(biāo)事件專屬) |
| width, height | 組件的新尺寸(Configure 事件專屬) |
| type | 該事件類型 |
Key names
當(dāng)事件為 <Key>,<KeyPress>,<KeyRelease> 的時候,detail 可以通過設(shè)定具體的按鍵名(keysym)來篩選。例如 <Key-H> 表示按下鍵盤上的大寫字母 H 時候觸發(fā)事件,<Key-Tab> 表示按下鍵盤上的 Tab 按鍵的時候觸發(fā)事件。
下表列舉了鍵盤所有特殊按鍵的 keysym 和 keycode:
(下邊按鍵碼是對應(yīng)美國標(biāo)準(zhǔn) 101 鍵盤的“Latin-1”字符集,鍵盤標(biāo)準(zhǔn)不同對應(yīng)的按鍵碼不同,但按鍵名是一樣的)
| 按鍵名(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 | 小鍵盤數(shù)字 0 |
| KP_1 | 87 | 小鍵盤數(shù)字 1 |
| KP_2 | 88 | 小鍵盤數(shù)字 2 |
| KP_3 | 89 | 小鍵盤數(shù)字 3 |
| KP_4 | 83 | 小鍵盤數(shù)字 4 |
| KP_5 | 84 | 小鍵盤數(shù)字 5 |
| KP_6 | 85 | 小鍵盤數(shù)字 6 |
| KP_7 | 79 | 小鍵盤數(shù)字 7 |
| KP_8 | 80 | 小鍵盤數(shù)字 8 |
| KP_9 | 81 | 小鍵盤數(shù)字 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(數(shù)字鎖定)按鍵 |
| 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 | ↑ 按鍵 |
總結(jié)
以上是生活随笔為你收集整理的Tkinter:事件绑定的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入理解JVM - ZGC垃圾收集器
- 下一篇: sql语句中select……as的用法