1. 程式人生 > >魚c筆記——Python 的 GUI 程式設計(十一):Tkinter 事件繫結

魚c筆記——Python 的 GUI 程式設計(十一):Tkinter 事件繫結

一個 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()

相關推薦

c筆記——PythonGUI 程式設計Tkinter 事件

一個 Tkinter 應用程式大部分時間是花在事件迴圈當中的,也就是通過 mainloop() 進入的事件迴圈。 事件可以有各種來源:使用者觸發的滑鼠和鍵盤操作和視窗管理器觸發的重繪事件(在多數情況下是由使用者簡介引起的) Tkinter 給我們提供了一個強大的機制去管理

c筆記——PythonGUI 程式設計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學習筆記JSP1

目錄 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服務