一個 Tkinter 應用程式大部分時間是花在事件迴圈當中的,也就是通過 mainloop() 進入的事件迴圈。

事件可以有各種來源:使用者觸發的滑鼠和鍵盤操作和視窗管理器觸發的重繪事件(在多數情況下是由使用者簡介引起的)

Tkinter 給我們提供了一個強大的機制去管理這些事件,去定義這些事件的操作。對每一個元件來說,可以通過 bind() 的方法來將自己定義的函式或方法繫結到具體的事件上。

widget.bind(event, handler)

當被觸發的事件滿足該元件繫結的事件的時候,Tkinter 就會帶著事件物件(Event、事件本身的描述)去呼叫自定義的 handler() 方法。

目錄

例項

事件序列

type

例項

捕獲滑鼠點選的位置的演示

from tkinter import *

root =Tk()

#當觸發<Button-1>,Tkinter會帶著事件本身去呼叫callback,會把它傳入到callback中,因此要個形參來接收對應的事件描述
def callback(event):
    print("點選位置:", event.x, event.y) #這個x和y表示的是相對於應用程式左上角的x和y。root的x和y相對的是螢幕

frame = Frame(root, width=200, height=200)
frame.bind("<Button-1>", callback)  # -左邊是事件本身,右邊是事件詳細描述。Button表示的是滑鼠的點選事件,1表示的是左鍵,2代表滾輪,3表示右鍵,4、5對於Linux系統才有用,表示滾輪向上滾和向下滾。對於Windows和Mac系統來說則是通過mousewhell來表示使用者是向上滾還是向下滾了滾輪。
frame.pack()

mainloop()

關於鍵盤的演示

from tkinter import *

root =Tk()

def callback(event):
    print(event.char)  #獲取當前鍵盤按下的字元

frame = Frame(root, width=200, height=200)
frame.bind("<Key>", callback)  #元件想要響應鍵盤事件,元件必須獲得焦點,元件才會響應鍵盤來的訊息。因為一個視窗可以有很多元件,鍵盤一次敲擊不知道給哪個元件。
frame.focus_set()  #通過focus_set方法獲得焦點。也可以設定Frame的takefocus選項為True,然後使用Tab將焦點轉移上來
frame.pack()

mainloop()

利用<Motion>事件獲取滑鼠實時位置的方式

from tkinter import *

root =Tk()

def callback(event):
    print("當前位置:", event.x, event.y)

frame = Frame(root, width=200, height=200)
frame.bind("<Motion>", callback)  #Motion事件表示當滑鼠進入元件時,就會響應這個事件
frame.focus_set()
frame.pack()

mainloop()

下方主要內容:

1.事件序列

2.type

3.modifier

4.Event 物件

5.Key names

事件序列

Tkinter 使用一種稱為事件序列的機制來允許使用者定義事件,使用者需要使用 bind() 方法將具體的事件序列與自定義的方法相繫結。事件序列是以字串的形式表示的,可以表示一個或多個相關聯的事件(若果是多個事件,那麼對應的方法只有在滿足所有事件的前提下才會被呼叫)

事件序列使用以下語法描述:

<modifier-type-detail>

事件序列是包含在尖括號(<...>)中的

type部分的內容是必須的,它通常用於描述普通的事件型別,例如滑鼠點選或鍵盤按鍵點選

modifier部分的內容是可選的,它通常用於描述組合鍵,例如Ctrl + c(<Control-Key-C>),Shift + 滑鼠左鍵點選(<Shift-Button-1>)

detail部分的內容是可選的,它通常用於描述具體的按鍵,例如Button-1表示的是滑鼠左鍵

如:

事件序列<Button-1>:使用者點選滑鼠左鍵

事件序列<KeyPress-H>:使用者點選H按鍵

事件序列<Control-Shift-KeyPress-H>:使用者同時點選Ctrl + Shift +H

type

Active 當元件的狀態從“未啟用”變為“啟用”的時候觸發該事件
Button

當用戶點選滑鼠按鍵的時候觸發該事件

detail部分指定是具體用哪個鍵:<Button-1>滑鼠左鍵,<Button-2>滑鼠中鍵(滾輪點選),<Button-3>滑鼠右鍵,<Button-4>滾輪上滾(Linux),<Button-5>滾輪下滾(Linux)

ButtonRelease

當用戶釋放滑鼠按鍵的時候觸發該事件

在大多數情況下,比Button要更好使用,因為如果當用戶不小心按下滑鼠鍵,使用者可以將滑鼠移出元件再釋放滑鼠,從而避免不小心觸發事件

Configure 當元件的尺寸改變的時候觸發該事件(視窗管理器觸發的重繪事件,當你調整元件的尺寸或者移動應用程式,元件會和視窗一樣被重繪)
Deactivate

當元件的狀態從“啟用”變為“未啟用”的時候觸發該事件

Destroy當元件被銷燬時觸發該事件

Enter

當滑鼠指標進入元件的時候觸發該事件

注意:不是使用者按下回車鍵(回車鍵是Return<Key-Return>)

Expose 當視窗或元件的某部分不再被覆蓋的時候觸發該事件
FocusIn

當元件獲得焦點的時候觸發該事件

使用者可以用Tab鍵將焦點轉移到該元件上(需要該元件的takefocus選項為True)

你也可以呼叫focus_set()方法使該元件獲得焦點

FocusOut 當元件失去焦點的時候觸發該事件
KeyPress

當用戶按下鍵盤按鍵的時候觸發該事件

detail可以指定具體的按鍵,例如<KeyPress-H>表示當大寫字母H被按下的時候觸發該事件

KeyPress可以縮寫為Key

KeyRelease 當用戶釋放鍵盤按鍵的時候觸發該事件
Leave 當滑鼠指標離開元件的時候觸發該事件
Map

當元件被對映的時候觸發該事件

意思是在應用程式中顯示該元件的時候,例如呼叫get()方法

Motion

當滑鼠在元件內移動的時候觸發該事件

MouseWheel

當滑鼠滾輪滾動的時候觸發該事件

目前該事件僅支援Windows和Mac系統

Unmap

當元件被取消對映的時候觸發該事件

意思是在應用程式中不再顯示該元件的時候,例如呼叫grid_remove()方法

Visibility 當應用程式至少有一部分在螢幕中是可見的時候觸發該事件

modifier

在事件序列中,modifier部分的內容可以是以下這些:

Alt 當按下Alt按鍵的時候
Any

表示任何型別的按鍵被按下的時候

例如<Any-keyPress>表示當用戶按下任何按鍵時觸發事件

Control 當按下Ctrl按鍵的時候
Double

當後續兩個事件被連續觸發的時候

例如<Double-Button-1>表示當用戶雙擊滑鼠左鍵時觸發事件

Lock 當開啟大寫字母鎖定鍵(CapsLock)的時候
Shift 當按下Shift按鍵的時候
Triple 跟Double類似,當後續三個事件被連續觸發的時候

Event物件

當Tkinter去回撥你定義的函式的時候,就會帶著Event物件(作為引數)去呼叫,Event物件以下這些屬性你可以使用:

widget 產生該事件的元件
x, y 當前的滑鼠的位置座標(相對於視窗左上角,單位為畫素)
x_root, y_root 當前的滑鼠的位置座標(相對於螢幕左上角,單位為畫素)
char 按鍵對應的字元(鍵盤事件專屬,不會顯示Control,Shift等鍵)
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鍵盤的“Lantin-1”字符集,鍵盤標準不同,對應的按鍵碼不同,但按鍵名是一樣的)

按鍵名(keysym)   按鍵碼(keycode)       代表的按鍵
Alt_L                64                左邊的Alt按鍵
Alt_R                113               右邊的Alt按鍵
BackSpace            22                BackSpace(退格)按鍵
Cancel               110               break按鍵
Caps_Lock            66                CapsLock(大寫字母鎖定)按鍵
Control_L            37                左邊的Control
Control_R            109               右邊的Control
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                 72                小鍵盤數字0
KP_1                 73                小鍵盤數字1
KP_2                 74                小鍵盤數字2
KP_3                 75                小鍵盤數字3
KP_4                 76                小鍵盤數字4
KP_5                 77                小鍵盤數字5
KP_6                 78                小鍵盤數字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_Mutiply           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(暫停)按鍵
Print                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                ↑按鍵

可以通過如下程式試驗:

from tkinter import *

root =Tk()

def callback(event):
    print(event.keysym)
    print(event.keycode)

frame = Frame(root, width=200, height=200)
frame.bind("<Key>", callback)  #元件想要響應鍵盤事件,元件必須獲得焦點,元件才會響應鍵盤來的訊息。因為一個視窗可以有很多元件,鍵盤一次敲擊不知道給哪個元件。
frame.focus_set()  #通過focus_set方法獲得焦點。也可以設定Frame的takefocus選項為True,然後使用Tab將焦點轉移上來
frame.pack()

mainloop()
.