魚c筆記——Python 的 GUI 程式設計(十一):Tkinter 事件繫結
一個 Tkinter 應用程式大部分時間是花在事件迴圈當中的,也就是通過 mainloop() 進入的事件迴圈。
事件可以有各種來源:使用者觸發的滑鼠和鍵盤操作和視窗管理器觸發的重繪事件(在多數情況下是由使用者簡介引起的)
Tkinter 給我們提供了一個強大的機制去管理這些事件,去定義這些事件的操作。對每一個元件來說,可以通過 bind() 的方法來將自己定義的函式或方法繫結到具體的事件上。
widget.bind(event, handler)
當被觸發的事件滿足該元件繫結的事件的時候,Tkinter 就會帶著事件物件(Event、事件本身的描述)去呼叫自定義的 handler() 方法。
目錄
例項
捕獲滑鼠點選的位置的演示
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()
相關推薦
魚c筆記——Python 的 GUI 程式設計(十一):Tkinter 事件繫結
一個 Tkinter 應用程式大部分時間是花在事件迴圈當中的,也就是通過 mainloop() 進入的事件迴圈。 事件可以有各種來源:使用者觸發的滑鼠和鍵盤操作和視窗管理器觸發的重繪事件(在多數情況下是由使用者簡介引起的) Tkinter 給我們提供了一個強大的機制去管理
魚c筆記——Python 的 GUI 程式設計(十四):Tkinter 的元件 PanedWindow
PanedWindow(窗格)元件(Tk8.4 新增是一個空間管理元件。跟 Frame 元件類似,都是為元件提供一個框架,不過 PanedWindow 允許讓使用者調整應用程式的空間劃分。 目錄 用法 引數 方法 何時使用 Paned
Python併發程式設計(十一):程序池,執行緒池,協程
目錄 注意 二、執行緒池 協程的本質 注意 1、不能無限的開程序和執行緒,最常用的就是開程序池,開執行緒池。 2、其中回撥函式非常重要,回撥函式其實可以作為一種程式設計思想,函數語言程式設
大學生學程式設計(十一):如何建立程式設計邏輯思維
編者按:誰沒有年輕過,誰沒有二過? 作為一個軟體工程的學生,雖然專業課(C,資料結構之類的)學得算是過得去吧,但是始終覺得沒有建立起程式設計所需要的邏輯思維。也許跟我從小數學不好有關。打個比方吧,簡單的問題可以很快搞定,但是遇到較為複雜的問題,就很難將其抽象出來,總感覺腦中一團混沌。為此
Java高併發程式設計(十一):Java中執行緒池
在開發過程中,合理地使用執行緒池能夠帶來3個好處。 降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷燬造成的消耗。 提高響應速度。當任務到達時,任務可以不需要等到執行緒建立就能立即執行。 提高執行緒的可管理性。執行緒是稀缺資源,如果無限制地建立
Python+Selenium筆記(十一):配置selenium Grid
find arch 自己 {} get 說明 前言 mon AC (一) 前言 Selenium Grid可以將測試分布在若幹個物理或虛擬機器上,從而實現分布方式或並行方式執行測試。 這個鏈接是官方的相關說明。 https://github.com/SeleniumHQ/s
Python筆記(十一):多線程
st2 pv操作 出現 end 談話 col 隊列大小 == done (二)和(三)不感興趣的可以跳過,這裏參考了《深入理解計算機系統》第一章和《Python核心編程》第四章 (一) 多線程編程 一個程序包含多個子任務,並且子任務之間相互獨立,讓這些子任務同時運
Python之路(十五):網路程式設計(上)
python基礎之網路程式設計(上篇) socket程式設計 本篇介紹socket是基於什麼來的,為什麼要知道網際網路底層實現通訊的原理 一、客戶端/服務端架構 即C/S架構,包括 1.硬體C/S架構(印表機) 2.軟體C/S架構(web
Python之路(十四):網路程式設計基礎 Python基礎之網路程式設計
Python基礎之網路程式設計 學習網路程式設計之前,要對計算機底層的通訊實現機制要有一定的理解。 OSI 網際網路協議按照功能不同分為osi七層或tcp/ip五層或tcp/ip四層 可以將應用層,表示層,會
Cris 的Python筆記(十一):面向物件三大特徵之多型
''' Python 的多型:一個物件可以以不同的形態去呈現,實現方式相比 Java更加簡單 因為動態語言的特點,Python 無法實現在程式碼指向前對方法引數進行檢查,所以只要滿足指定方法體的要求,任何資料型別的物件都可以作為該方法的實參 ''' class A: def _
Python學習筆記(十一):Python函式
以Mark Lutz著的《Python學習手冊》為教程,每天花1個小時左右時間學習,爭取兩週完成。 --- 寫在前面的話 2013-7-21 22:00 學習筆記 1,def是Python中的一個可執行語句——函式並不存在,直到Python運行了def後才存
python基礎教程(十一)
list repeat stop row lis flatten ror 教程 [1] 叠代器 本節進行叠代器的討論。只討論一個特殊方法---- __iter__ ,這個方法是叠代器規則的基礎。 叠代器規則 叠代的意思是重復做一些事很多次---就像在循環中做的
EF學習筆記(十一):實施繼承
long cannot oid data- turn cati com list pac 學習總目錄:ASP.NET MVC5 及 EF6 學習筆記 - (目錄整理) 上篇鏈接:EF學習筆記(十) 處理並發 本篇原文鏈接:Implementing Inheritance 面
R語言學習筆記(十一):廣義線性模型
學習筆記 Education 5.0 1.3 style only 可能性 div erro #Logistic 回歸 install.packages("AER") data(Affairs,package="AER") summary(Affairs) a
c#數字圖像處理(十一)圖像旋轉
nbsp 雙線 else 處理 找不到 nsa sin hds 像素點 如果平面上的點繞原點逆時針旋轉θo,則其坐標變換公式為:
hadoop學習筆記(十一):MapReduce數據類型
筆記 ash all 記錄 write 一個 操作 png bool 一、序列化 1 hadoop自定義了數據類型,在hadoop中,所有的key/value類型必須實現Writable接口。有兩個方法,一個是write,一個是readFileds。分別用於讀(反序列化操
javaweb學習筆記(十一):JSP(1)
目錄 jsp(1) 1.基本概念 1 .1Jsp的執行過程 1.2 JSP與servlet 2 JSP語法 2.1 Jsp模板 2.2 Jsp表示式 2.3 Jsp指令碼 2.4 Jsp宣告 2.5 Jsp註釋 jsp(1) 1.基本
學習筆記(十一):使用K-Means演算法檢測DGA域名
1.資料收集與清洗:同(十) 2.特徵化:同(十) 3.訓練樣本 model = KMeans(n_clusters = 2, random_state=random_state) y_pred = model.fit_predict(x) 4.效果驗證:使用TSNE將
安全程式設計(十一)- ArrayList,Vector,LinkedList
1.三者介紹 1.1ArrayList 1.1.1簡單介紹: ArrayList是Java集合中常用的資料結構,繼承自AbstractList,實現了List介面,是一個動態陣列,支援大小的改變,可以靈活
Python之路(十五):網絡編程(上)
核心 accept 廣泛 文件系統 類型 操作 兩種 學習 一起 socket編程 本篇介紹socket是基於什麽來的,為什麽要知道互聯網底層實現通信的原理 一、客戶端/服務端架構 即C/S架構,包括 1.硬件C/S架構(打印機) 2.軟件C/S架構(web服務