Python Tkinter之事件處理詳解
事件處理,是 GUI 程序中不可或缺的重要組成部分,相比來說,控件只是組成一臺機器的零部件, 而事件處理則是驅動這臺機器“正常”運轉的關鍵所在,它能夠將零部件之間“優(yōu)雅”的貫穿起來,因此“事件處理”可謂是 GUI 程序的“靈魂”,同時它也是實現(xiàn)人機交互的關鍵。
對于“事件”這一名詞,在講解控件時也偶爾提及過,在本節(jié)我們將對 Tkinter 中的事件處理機制做更為詳細的介紹。
在一款 GUI 程序中,我們將用戶對軟件的操作統(tǒng)稱為“事件”,比如鼠標點擊按鈕、鍵盤輸入文本以及窗口管理器觸發(fā)的重繪事件等,這些事件有一個共同的特點,即都是由用戶自身直接或者間接觸發(fā)的。
事件綁定方法
Tkinter 提供的事件處理機制允許我們?yōu)?ldquo;控件”綁定相應的事件和事件處理函數(shù)(即 callback函數(shù)),從而實現(xiàn)控件與用戶的交互,其語法格式如下:
widget.bind("<event>",func)上述語法中,widget 代表控件的實例對象,之后,采用 bind() 方法進行事件綁定,該函數(shù)有兩個參數(shù):
- <event>:一個字符串參數(shù),表示事件的類型,并使用“尖括號”的形式進行包裹;
- func:表示事件的處理函數(shù)(callback,即回調函數(shù)),當觸發(fā)事件時,Tk 會攜帶事件對象(Event)去調用 func 方法。
注意:bind() 方法可以完成事件與處理函數(shù)綁定,而使用 unbind() 方法可以將事件與處理函數(shù)解綁。
常用事件類型
事件類型(也稱事件碼)是 Tkinter 模塊規(guī)定的,主要包括鼠標、鍵盤、光標等相關事件,Tkinter 為其規(guī)定了相應的語法格式:
<modifier-type-detail>
上述語法由三部分組成,說明如下:
- <>:事件類型必須包含在“尖括號”內;
- modifier:可選項,事件類型的修飾符,通常用于描述組合鍵、雙擊<Double-Button-1>、大寫鎖定鍵<Lock>以及<Alt-Shift>等;
- type:是必不可少的一項,表示事件的具體類型;
- detail:可選項,通常用于描述具體的哪個按鍵,比如 <Button-1> 表示鼠標左鍵;
這里有必要對經常使用的 modifier 修飾符做簡單的介紹,修飾符可以修改事件的激活條件,比如雙擊鼠標或者需要同時按下某個鍵才觸發(fā)事件,常用的修飾符如下:
| 修飾符 | 說明 |
|---|---|
| Control | 事件發(fā)生時需按下 Control 鍵 |
| Alt | 事件發(fā)生時需按下 Alt 鍵 |
| Shift | 事件發(fā)生時需按下 Shift 鍵 |
| Lock | 事件發(fā)生時需處于大寫鎖定狀態(tài) |
| Double | 事件連續(xù)發(fā)生兩次,比如雙擊鼠標 |
| Triple | 事件連續(xù)發(fā)生三次 |
| Quadruple | 事件連續(xù)發(fā)生四次 |
下述表格中介紹了 Tkinter 中經常使用的事件類型,如下所示:
| 事件碼 | 說明 |
|---|---|
| <ButtonPress-1> | 單擊鼠標左鍵,簡寫為<Button-1>,后面的數(shù)字可以是1/2/3,分別代表左鍵、中間滑輪、右鍵 |
| <ButtonRelease-1> | 釋放鼠標左鍵,后面數(shù)字可以是1/2/3,分別代表釋放左鍵、滑輪、右鍵 |
| <B1-Motion> | 按住鼠標左鍵移動,<B2-Motion>和<B3-Motion>分別表示按住鼠標滑輪移動、右鍵移動 |
| <MouseWheel> | 轉動鼠標滑輪 |
| <Double-Button-1> | 雙擊鼠標左鍵 |
| <Enter> | 鼠標光標進入控件實例 |
| <Leave> | 鼠標光標離開控件實例 |
| <Key> | 按下鍵盤上的任意鍵 |
| <KeyPress-字母>/<KeyPress-數(shù)字> | 按下鍵盤上的某一個字母或者數(shù)字鍵 |
| <KeyRelease> | 釋放鍵盤上的按鍵 |
| <Return> | 回車鍵,其他同類型鍵有<Shift>/<Tab>/<Control>/<Alt> |
| <Space> | 空格鍵 |
| <UP>/<Down>/<Left>/<Right> | 方向鍵 |
| <F1>...<F12> | 常用的功能鍵 |
| <Control-Alt> | 組合鍵,再比如<Control-Shift-KeyPress-T>,表示用戶同時點擊 Ctrl + Shift + T |
| <FocusIn> | 當控件獲取焦點時候觸發(fā),比如鼠標點擊輸入控件輸入內容,可以調用 focus_set() 方法使控件獲得焦點 |
| <FocusOut> | 當控件失去焦點時激活,比如當鼠標離開輸入框的時候 |
| <Configure > | 控件的發(fā)生改變的時候觸發(fā)事件,比如調整了控件的大小等 |
| <Deactivate> | 當控件的狀態(tài)從“激活”變?yōu)?ldquo;未激活”時觸發(fā)事件 |
| <Destroy> | 當控件被銷毀的時候觸發(fā)執(zhí)行事件的函數(shù) |
| <Expose> | 當窗口或組件的某部分不再被覆蓋的時候觸發(fā)事件 |
| <Visibility> | 當應用程序至少有一部分在屏幕中是可見狀態(tài)時觸發(fā)事件 |
Event事件對象
當事件觸發(fā)后,Tkinter 會自動將事件對象交給回調函數(shù)進行下步的處理,Event 對象包含了以下常用屬性:
| 屬性 | 說明 |
|---|---|
| widget | 發(fā)生事件的是哪一個控件 |
| x,y | 相對于窗口的左上角而言,當前鼠標的坐標位置 |
| x_root,y_root | 相對于屏幕的左上角而言,當前鼠標的坐標位置 |
| char | 用來顯示所按鍵相對應的字符 |
| keysym | 按鍵名,比如 Control_L 表示左邊的 Ctrl 按鍵 |
| keycode | 按鍵碼,一個按鍵的數(shù)字編號,比如 Delete 按鍵碼是107 |
| num | 1/2/3中的一個,表示點擊了鼠標的哪個按鍵,按鍵分為左、中、右 |
| width,height | 控件的修改后的尺寸,對應著 <Configure>事件 |
| type | 事件類型 |
下面看一組關于“鍵盤事件”的使用示例:
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語言中文網")
root.geometry('450x350+300+200')
root.iconbitmap('C:/Users/Administrator/Desktop/C語言中文網logo.ico')
# 添加一個按鈕控件
lb=Label(root,text='請按鍵',fg='blue',font=('微軟雅黑',15))
# 給按鈕控件綁定事件,按下任意鍵,然后調用事件處理函數(shù)。注意,此處需要在英文狀態(tài)下進行輸入
lb.bind('<Key>',show_key)
# 設置按鈕獲取焦點
lb.focus_set()
lb.pack()
# 顯示窗口
root.mainloop()程序運行結果如下:

圖1:Tkinter事件處理
注意:在上述示例中,只有當 Label 控件獲取焦點后才能接收鍵盤事件,因此在給控件綁定事件和回調函數(shù)后,需要使用 focus_set() 方法來獲取焦點。
下面再看一組關于“鼠標事件”的相關示例:
# 定義事件函數(shù)
from tkinter import *
def handleMotion(event):
lb1['text'] = '你移動了光標的所在位置'
lb2['text'] = '目前光標位置:x ='+ str(event.x)+';y='+str(event.y)
print('光標當前位置',event.x,event.y)
# 創(chuàng)建主窗口
win = Tk()
win.config(bg='#87CEEB')
win.title("C語言中文網")
win.geometry('450x350+300+200')
win.iconbitmap('C:/Users/Administrator/Desktop/C語言中文網logo.ico')
# 創(chuàng)建一個窗體容器frame
frame = Frame (win, relief=RAISED, borderwidth=2, width=300,height=200)
frame.bind('<Motion>',handleMotion)
lb1 = Label(frame,text='沒有任何事件觸發(fā)', bg='purple', )
# 使用place進行位置布局,下一節(jié)會介紹
lb1.place (x=20,y=20)
lb2 = Label(frame,text='')
lb2.place (x=16,y=60)
frame.pack(side=TOP)
# 顯示窗口
win.mainloop()程序運行結果如下:

圖2:Tkinter鼠標移動事件
以上就是Python Tkinter之事件處理詳解的詳細內容,更多關于Python Tkinter事件處理的資料請關注腳本之家其它相關文章!
相關文章
Python在終端通過pip安裝好包以后在Pycharm中依然無法使用的問題(三種解決方案)
這篇文章主要介紹了Python在終端通過pip安裝好包以后在Pycharm中依然無法使用的問題及解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03
Python進程崩潰AttributeError異常問題解決
這篇文章主要介紹了Python進程崩潰(AttributeError異常)問題解決,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下方法2023-06-06
python爬蟲搭配起B(yǎng)ilibili唧唧的流程分析
這篇文章主要介紹了python爬蟲搭配起B(yǎng)ilibili唧唧的流程分析,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
Python DBM模塊輕松使用小型數(shù)據(jù)庫存儲管理數(shù)據(jù)
這篇文章主要介紹了Python DBM模塊輕松使用小型數(shù)據(jù)庫存儲管理數(shù)據(jù),它可以讓你輕松地存儲和管理鍵值對數(shù)據(jù),可以使用 dbm 模塊來操作 DBM 文件,或者使用 shelve 模塊來存儲任意類型的 Python 對象2024-01-01
python檢測lvs real server狀態(tài)
這篇文章主要介紹了用python檢測lvs real server狀態(tài)的示例,大家參考使用吧2014-01-01

