Python Tkinter之事件處理詳解
事件處理,是 GUI 程序中不可或缺的重要組成部分,相比來(lái)說(shuō),控件只是組成一臺(tái)機(jī)器的零部件, 而事件處理則是驅(qū)動(dòng)這臺(tái)機(jī)器“正常”運(yùn)轉(zhuǎn)的關(guān)鍵所在,它能夠?qū)⒘悴考g“優(yōu)雅”的貫穿起來(lái),因此“事件處理”可謂是 GUI 程序的“靈魂”,同時(shí)它也是實(shí)現(xiàn)人機(jī)交互的關(guān)鍵。
對(duì)于“事件”這一名詞,在講解控件時(shí)也偶爾提及過(guò),在本節(jié)我們將對(duì) Tkinter 中的事件處理機(jī)制做更為詳細(xì)的介紹。
在一款 GUI 程序中,我們將用戶(hù)對(duì)軟件的操作統(tǒng)稱(chēng)為“事件”,比如鼠標(biāo)點(diǎn)擊按鈕、鍵盤(pán)輸入文本以及窗口管理器觸發(fā)的重繪事件等,這些事件有一個(gè)共同的特點(diǎn),即都是由用戶(hù)自身直接或者間接觸發(fā)的。
事件綁定方法
Tkinter 提供的事件處理機(jī)制允許我們?yōu)?ldquo;控件”綁定相應(yīng)的事件和事件處理函數(shù)(即 callback函數(shù)),從而實(shí)現(xiàn)控件與用戶(hù)的交互,其語(yǔ)法格式如下:
widget.bind("<event>",func)
上述語(yǔ)法中,widget 代表控件的實(shí)例對(duì)象,之后,采用 bind() 方法進(jìn)行事件綁定,該函數(shù)有兩個(gè)參數(shù):
- <event>:一個(gè)字符串參數(shù),表示事件的類(lèi)型,并使用“尖括號(hào)”的形式進(jìn)行包裹;
- func:表示事件的處理函數(shù)(callback,即回調(diào)函數(shù)),當(dāng)觸發(fā)事件時(shí),Tk 會(huì)攜帶事件對(duì)象(Event)去調(diào)用 func 方法。
注意:bind() 方法可以完成事件與處理函數(shù)綁定,而使用 unbind() 方法可以將事件與處理函數(shù)解綁。
常用事件類(lèi)型
事件類(lèi)型(也稱(chēng)事件碼)是 Tkinter 模塊規(guī)定的,主要包括鼠標(biāo)、鍵盤(pán)、光標(biāo)等相關(guān)事件,Tkinter 為其規(guī)定了相應(yīng)的語(yǔ)法格式:
<modifier-type-detail>
上述語(yǔ)法由三部分組成,說(shuō)明如下:
- <>:事件類(lèi)型必須包含在“尖括號(hào)”內(nèi);
- modifier:可選項(xiàng),事件類(lèi)型的修飾符,通常用于描述組合鍵、雙擊<Double-Button-1>、大寫(xiě)鎖定鍵<Lock>以及<Alt-Shift>等;
- type:是必不可少的一項(xiàng),表示事件的具體類(lèi)型;
- detail:可選項(xiàng),通常用于描述具體的哪個(gè)按鍵,比如 <Button-1> 表示鼠標(biāo)左鍵;
這里有必要對(duì)經(jīng)常使用的 modifier 修飾符做簡(jiǎn)單的介紹,修飾符可以修改事件的激活條件,比如雙擊鼠標(biāo)或者需要同時(shí)按下某個(gè)鍵才觸發(fā)事件,常用的修飾符如下:
修飾符 | 說(shuō)明 |
---|---|
Control | 事件發(fā)生時(shí)需按下 Control 鍵 |
Alt | 事件發(fā)生時(shí)需按下 Alt 鍵 |
Shift | 事件發(fā)生時(shí)需按下 Shift 鍵 |
Lock | 事件發(fā)生時(shí)需處于大寫(xiě)鎖定狀態(tài) |
Double | 事件連續(xù)發(fā)生兩次,比如雙擊鼠標(biāo) |
Triple | 事件連續(xù)發(fā)生三次 |
Quadruple | 事件連續(xù)發(fā)生四次 |
下述表格中介紹了 Tkinter 中經(jīng)常使用的事件類(lèi)型,如下所示:
事件碼 | 說(shuō)明 |
---|---|
<ButtonPress-1> | 單擊鼠標(biāo)左鍵,簡(jiǎn)寫(xiě)為<Button-1>,后面的數(shù)字可以是1/2/3,分別代表左鍵、中間滑輪、右鍵 |
<ButtonRelease-1> | 釋放鼠標(biāo)左鍵,后面數(shù)字可以是1/2/3,分別代表釋放左鍵、滑輪、右鍵 |
<B1-Motion> | 按住鼠標(biāo)左鍵移動(dòng),<B2-Motion>和<B3-Motion>分別表示按住鼠標(biāo)滑輪移動(dòng)、右鍵移動(dòng) |
<MouseWheel> | 轉(zhuǎn)動(dòng)鼠標(biāo)滑輪 |
<Double-Button-1> | 雙擊鼠標(biāo)左鍵 |
<Enter> | 鼠標(biāo)光標(biāo)進(jìn)入控件實(shí)例 |
<Leave> | 鼠標(biāo)光標(biāo)離開(kāi)控件實(shí)例 |
<Key> | 按下鍵盤(pán)上的任意鍵 |
<KeyPress-字母>/<KeyPress-數(shù)字> | 按下鍵盤(pán)上的某一個(gè)字母或者數(shù)字鍵 |
<KeyRelease> | 釋放鍵盤(pán)上的按鍵 |
<Return> | 回車(chē)鍵,其他同類(lèi)型鍵有<Shift>/<Tab>/<Control>/<Alt> |
<Space> | 空格鍵 |
<UP>/<Down>/<Left>/<Right> | 方向鍵 |
<F1>...<F12> | 常用的功能鍵 |
<Control-Alt> | 組合鍵,再比如<Control-Shift-KeyPress-T>,表示用戶(hù)同時(shí)點(diǎn)擊 Ctrl + Shift + T |
<FocusIn> | 當(dāng)控件獲取焦點(diǎn)時(shí)候觸發(fā),比如鼠標(biāo)點(diǎn)擊輸入控件輸入內(nèi)容,可以調(diào)用 focus_set() 方法使控件獲得焦點(diǎn) |
<FocusOut> | 當(dāng)控件失去焦點(diǎn)時(shí)激活,比如當(dāng)鼠標(biāo)離開(kāi)輸入框的時(shí)候 |
<Configure > | 控件的發(fā)生改變的時(shí)候觸發(fā)事件,比如調(diào)整了控件的大小等 |
<Deactivate> | 當(dāng)控件的狀態(tài)從“激活”變?yōu)?ldquo;未激活”時(shí)觸發(fā)事件 |
<Destroy> | 當(dāng)控件被銷(xiāo)毀的時(shí)候觸發(fā)執(zhí)行事件的函數(shù) |
<Expose> | 當(dāng)窗口或組件的某部分不再被覆蓋的時(shí)候觸發(fā)事件 |
<Visibility> | 當(dāng)應(yīng)用程序至少有一部分在屏幕中是可見(jiàn)狀態(tài)時(shí)觸發(fā)事件 |
Event事件對(duì)象
當(dāng)事件觸發(fā)后,Tkinter 會(huì)自動(dòng)將事件對(duì)象交給回調(diào)函數(shù)進(jìn)行下步的處理,Event 對(duì)象包含了以下常用屬性:
屬性 | 說(shuō)明 |
---|---|
widget | 發(fā)生事件的是哪一個(gè)控件 |
x,y | 相對(duì)于窗口的左上角而言,當(dāng)前鼠標(biāo)的坐標(biāo)位置 |
x_root,y_root | 相對(duì)于屏幕的左上角而言,當(dāng)前鼠標(biāo)的坐標(biāo)位置 |
char | 用來(lái)顯示所按鍵相對(duì)應(yīng)的字符 |
keysym | 按鍵名,比如 Control_L 表示左邊的 Ctrl 按鍵 |
keycode | 按鍵碼,一個(gè)按鍵的數(shù)字編號(hào),比如 Delete 按鍵碼是107 |
num | 1/2/3中的一個(gè),表示點(diǎn)擊了鼠標(biāo)的哪個(gè)按鍵,按鍵分為左、中、右 |
width,height | 控件的修改后的尺寸,對(duì)應(yīng)著 <Configure>事件 |
type | 事件類(lèi)型 |
下面看一組關(guān)于“鍵盤(pán)事件”的使用示例:
from tkinter import * # 定義事件函數(shù),必須用event參數(shù) def show_key(event): # 查看觸發(fā)事件的按鈕 s=event.keysym # 將其顯示在按鈕控件上 lb.config(text=s) root=Tk() root.config(bg='#87CEEB') root.title("C語(yǔ)言中文網(wǎng)") root.geometry('450x350+300+200') root.iconbitmap('C:/Users/Administrator/Desktop/C語(yǔ)言中文網(wǎng)logo.ico') # 添加一個(gè)按鈕控件 lb=Label(root,text='請(qǐng)按鍵',fg='blue',font=('微軟雅黑',15)) # 給按鈕控件綁定事件,按下任意鍵,然后調(diào)用事件處理函數(shù)。注意,此處需要在英文狀態(tài)下進(jìn)行輸入 lb.bind('<Key>',show_key) # 設(shè)置按鈕獲取焦點(diǎn) lb.focus_set() lb.pack() # 顯示窗口 root.mainloop()
程序運(yùn)行結(jié)果如下:
圖1:Tkinter事件處理
注意:在上述示例中,只有當(dāng) Label 控件獲取焦點(diǎn)后才能接收鍵盤(pán)事件,因此在給控件綁定事件和回調(diào)函數(shù)后,需要使用 focus_set() 方法來(lái)獲取焦點(diǎn)。
下面再看一組關(guān)于“鼠標(biāo)事件”的相關(guān)示例:
# 定義事件函數(shù) from tkinter import * def handleMotion(event): lb1['text'] = '你移動(dòng)了光標(biāo)的所在位置' lb2['text'] = '目前光標(biāo)位置:x ='+ str(event.x)+';y='+str(event.y) print('光標(biāo)當(dāng)前位置',event.x,event.y) # 創(chuàng)建主窗口 win = Tk() win.config(bg='#87CEEB') win.title("C語(yǔ)言中文網(wǎng)") win.geometry('450x350+300+200') win.iconbitmap('C:/Users/Administrator/Desktop/C語(yǔ)言中文網(wǎng)logo.ico') # 創(chuàng)建一個(gè)窗體容器frame frame = Frame (win, relief=RAISED, borderwidth=2, width=300,height=200) frame.bind('<Motion>',handleMotion) lb1 = Label(frame,text='沒(méi)有任何事件觸發(fā)', bg='purple', ) # 使用place進(jìn)行位置布局,下一節(jié)會(huì)介紹 lb1.place (x=20,y=20) lb2 = Label(frame,text='') lb2.place (x=16,y=60) frame.pack(side=TOP) # 顯示窗口 win.mainloop()
程序運(yùn)行結(jié)果如下:
圖2:Tkinter鼠標(biāo)移動(dòng)事件
以上就是Python Tkinter之事件處理詳解的詳細(xì)內(nèi)容,更多關(guān)于Python Tkinter事件處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python3+PyQt5實(shí)現(xiàn)文檔打印功能
這篇文章主要為大家詳細(xì)介紹了python3+PyQt5實(shí)現(xiàn)文檔打印功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04python發(fā)送郵件功能實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了python發(fā)送郵件功能實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-07-07Python在終端通過(guò)pip安裝好包以后在Pycharm中依然無(wú)法使用的問(wèn)題(三種解決方案)
這篇文章主要介紹了Python在終端通過(guò)pip安裝好包以后在Pycharm中依然無(wú)法使用的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Python進(jìn)程崩潰AttributeError異常問(wèn)題解決
這篇文章主要介紹了Python進(jìn)程崩潰(AttributeError異常)問(wèn)題解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下方法2023-06-06python爬蟲(chóng)搭配起B(yǎng)ilibili唧唧的流程分析
這篇文章主要介紹了python爬蟲(chóng)搭配起B(yǎng)ilibili唧唧的流程分析,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Python DBM模塊輕松使用小型數(shù)據(jù)庫(kù)存儲(chǔ)管理數(shù)據(jù)
這篇文章主要介紹了Python DBM模塊輕松使用小型數(shù)據(jù)庫(kù)存儲(chǔ)管理數(shù)據(jù),它可以讓你輕松地存儲(chǔ)和管理鍵值對(duì)數(shù)據(jù),可以使用 dbm 模塊來(lái)操作 DBM 文件,或者使用 shelve 模塊來(lái)存儲(chǔ)任意類(lèi)型的 Python 對(duì)象2024-01-01python調(diào)用Matplotlib繪制分布點(diǎn)圖
這篇文章主要為大家詳細(xì)介紹了python調(diào)用Matplotlib繪制分布點(diǎn)圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10python檢測(cè)lvs real server狀態(tài)
這篇文章主要介紹了用python檢測(cè)lvs real server狀態(tài)的示例,大家參考使用吧2014-01-01