日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Tkinter:事件绑定

發(fā)布時間:2023/12/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tkinter:事件绑定 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

正如我們此前提到的,一個 Tkinter 應(yīng)用程序大部分時間花費(fèi)在事件循環(huán)中(通過 mainloop() 方法進(jìn)入)。事件可以有各種來源:包括用戶觸發(fā)的鼠標(biāo)和鍵盤操作和窗口管理器觸發(fā)的重繪事件(在多數(shù)情況下是由用戶間接引起的)。

Tkinter 提供一個強(qiáng)大的機(jī)制可以讓你自由地處理事件,對于每個組件來說,你可以通過 bind() 方法將函數(shù)或方法綁定到具體的事件上。

widget.bind(event, handler)

當(dāng)被觸發(fā)的事件滿足該組件綁定的事件時,Tkinter 就會帶著事件對象(Event)去調(diào)用 handler() 方法。

這兒有幾個例子,大家請隨意感受下:

第一個是關(guān)于鼠標(biāo)按鍵的演示:

# 捕獲點擊鼠標(biāo)的位置 import tkinter as tkroot = tk.Tk()def callback(event):print("點擊位置:", event.x, event.y)frame = tk.Frame(root, width = 200, height = 200) frame.bind("<Button-1>", callback) frame.pack()root.mainloop()

在上邊這個例子中,我們使用 Frame 組件的 bind() 方法將鼠標(biāo)點擊事件(<Button-1>)和我們自定義的 callback() 方法綁定起來。那么運(yùn)行后的結(jié)果是——當(dāng)你在點擊鼠標(biāo)左鍵的時候,IDLE 會相應(yīng)的將鼠標(biāo)的位置顯示出來(如上圖)。

第二個是關(guān)于鍵盤按鍵的演示:

只有當(dāng)組件獲得焦點的時候才能接收鍵盤事件(Key),下邊例子中我們用 focus_set() 獲得焦點,當(dāng)你你可以設(shè)置 Frame 的 takefocus 選項為 True,然后使用 Tab 將焦點轉(zhuǎn)移上來。

# 捕獲鍵盤事件 import tkinter as tkroot = tk.Tk()def callback(event):print("點擊的鍵盤字符為:", event.char)frame = tk.Frame(root, width = 200, height = 200) frame.bind("<Key>", callback) frame.focus_set() frame.pack()root.mainloop()

最后我們再用一個例子展示捕獲鼠標(biāo)在組件上的運(yùn)動軌跡,這里需要關(guān)注的是 <Motion> 事件:

# 捕獲鼠標(biāo)在組件上的運(yùn)動軌跡 import tkinter as tkroot = tk.Tk()def callback(event):print("當(dāng)前位置為:", event.x, event.y)frame = tk.Frame(root, width = 200, height = 200) frame.bind("<Motion>", callback) frame.pack()root.mainloop()

下方主要內(nèi)容:

  • 事件序列
  • type
  • modifier
  • Event 對象
  • Key names
  • 事件序列

    Tkinter 使用一種稱為事件序列的機(jī)制來允許用戶定義事件,用戶需使用 bind() 方法將具體的事件序列與自定義的方法相綁定。事件序列是以字符串的形式表示的,可以表示一個或多個相關(guān)聯(lián)的事件(如果是多個事件,那么對應(yīng)的方法只有在滿足所有事件的前提下才會被調(diào)用)。

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

    <modifier-type-detail>

    • 事件序列是包含在尖括號(<...>)中
    • type 部分的內(nèi)容是最重要的,它通常用于描述普通的事件類型,例如鼠標(biāo)點擊或鍵盤按鍵點擊(詳見下方)。
    • modifier 部分的內(nèi)容是可選的,它通常用于描述組合鍵,例如 Ctrl + c,Shift + 鼠標(biāo)左鍵點擊(詳見下方)。
    • detail 部分的內(nèi)容是可選的,它通常用于描述具體的按鍵,例如 Button-1 表示鼠標(biāo)左鍵。

    舉幾個例子幫助大家消化:

    事件序列含義
    <Button-1>用戶點擊鼠標(biāo)左鍵
    <KeyPress-H>用戶點擊 H 按鍵
    <Control-Shift-KeyPress-H>用戶同時點擊 Ctrl + Shift + H

    type

    type含義
    Activate當(dāng)組件的狀態(tài)從“未激活”變?yōu)椤凹せ睢钡臅r候觸發(fā)該事件
    Button1. 當(dāng)用戶點擊鼠標(biāo)按鍵的時候觸發(fā)該事件
    2. detail 部分指定具體哪個按鍵:<Button-1>鼠標(biāo)左鍵,<Button-2>鼠標(biāo)中鍵,<Button-3>鼠標(biāo)右鍵,<Button-4>滾輪上滾(Linux),<Button-5>滾輪下滾(Linux)
    ButtonRelease1. 當(dāng)用戶釋放鼠標(biāo)按鍵的時候觸發(fā)該事
    2. 在大多數(shù)情況下,比 Button 要更好用,因為如果當(dāng)用戶不小心按下鼠標(biāo),用戶可以將鼠標(biāo)移出組件再釋放鼠標(biāo),從而避免不小心觸發(fā)事件
    Configure當(dāng)組件的尺寸發(fā)生改變的時候觸發(fā)該事件
    Deactivate當(dāng)組件的狀態(tài)從“激活”變?yōu)椤拔醇せ睢钡臅r候觸發(fā)該事件
    Destroy當(dāng)組件被銷毀的時候觸發(fā)該事件
    Enter1. 當(dāng)鼠標(biāo)指針進(jìn)入組件的時候觸發(fā)該事件
    2. 注意:不是指用戶按下回車鍵
    Expose當(dāng)窗口或組件的某部分不再被覆蓋的時候觸發(fā)該事件
    FocusIn1. 當(dāng)組件獲得焦點的時候觸發(fā)該事件
    2. 用戶可以用 Tab 鍵將焦點轉(zhuǎn)移到該組件上(需要該組件的 takefocus 選項為 True)
    3. 你也可以調(diào)用 focus_set() 方法使該組件獲得焦點(見上方例子)
    FocusOut當(dāng)組件失去焦點的時候觸發(fā)該事件
    KeyPress1. 當(dāng)用戶按下鍵盤按鍵的時候觸發(fā)該事件
    2. detail 可以指定具體的按鍵,例如 <KeyPress-H>表示當(dāng)大寫字母 H 被按下的時候觸發(fā)該事件
    3. KeyPress 可以簡寫為 Key
    KeyRelease當(dāng)用戶釋放鍵盤按鍵的時候觸發(fā)該事件
    Leave當(dāng)鼠標(biāo)指針離開組件的時候觸發(fā)該事件
    Map1. 當(dāng)組件被映射的時候觸發(fā)該事件
    2. 意思是在應(yīng)用程序中顯示該組件的時候,例如調(diào)用 grid() 方法
    Motion當(dāng)鼠標(biāo)在組件內(nèi)移動的整個過程均觸發(fā)該事件
    MouseWheel1. 當(dāng)鼠標(biāo)滾輪滾動的時候觸發(fā)該事件
    2. 目前該事件僅支持 Windows 和 Mac 系統(tǒng),Linux 系統(tǒng)請參考 Button
    Unmap1. 當(dāng)組件被取消映射的時候觸發(fā)該事件
    2. 意思是在應(yīng)用程序中不再顯示該組件的時候,例如調(diào)用 grid_remove() 方法
    Visibility當(dāng)應(yīng)用程序至少有一部分在屏幕中是可見的時候觸發(fā)該事件

    modifier

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

    modifier含義
    Alt當(dāng)按下 Alt 按鍵的時候
    Any1. 表示任何類型的按鍵被按下的時候
    2. 例如 <Any-KeyPress> 表示當(dāng)用戶按下任何按鍵時觸發(fā)事件
    Control當(dāng)按下 Ctrl 按鍵的時候
    Double1. 當(dāng)后續(xù)兩個事件被連續(xù)觸發(fā)的時候
    2. 例如 <Double-Button-1> 表示當(dāng)用戶雙擊鼠標(biāo)左鍵時觸發(fā)事件
    Lock當(dāng)打開大寫字母鎖定鍵(CapsLock)的時候
    Shift當(dāng)按下 Shift 按鍵的時候
    Triple跟 Double 類似,當(dāng)后續(xù)三個事件被連續(xù)觸發(fā)的時候

    Event 對象

    當(dāng) Tkinter 去回調(diào)你定義的函數(shù)的時候,都會帶著 Event 對象(作為參數(shù))去調(diào)用,Event 對象以下這些屬性你可以使用:

    屬性含義
    widget產(chǎn)生該事件的組件
    x, y當(dāng)前的鼠標(biāo)位置坐標(biāo)(相對于窗口左上角,像素為單位)
    x_root, y_root當(dāng)前的鼠標(biāo)位置坐標(biāo)(相對于屏幕左上角,像素為單位)
    char按鍵對應(yīng)的字符(鍵盤事件專屬)
    keysym按鍵名,見下方 Key names(鍵盤事件專屬)
    keycode按鍵碼,見下方 Key names(鍵盤事件專屬)
    num按鈕數(shù)字(鼠標(biāo)事件專屬)
    width, height組件的新尺寸(Configure 事件專屬)
    type該事件類型

    Key names

    當(dāng)事件為 <Key>,<KeyPress>,<KeyRelease> 的時候,detail 可以通過設(shè)定具體的按鍵名(keysym)來篩選。例如 <Key-H> 表示按下鍵盤上的大寫字母 H 時候觸發(fā)事件,<Key-Tab> 表示按下鍵盤上的 Tab 按鍵的時候觸發(fā)事件。

    下表列舉了鍵盤所有特殊按鍵的 keysym 和 keycode:

    (下邊按鍵碼是對應(yīng)美國標(biāo)準(zhǔn) 101 鍵盤的“Latin-1”字符集,鍵盤標(biāo)準(zhǔn)不同對應(yīng)的按鍵碼不同,但按鍵名是一樣的)

    按鍵名(keysym)按鍵碼(keycode)代表的按鍵
    Alt_L64左邊的 Alt 按鍵
    Alt_R113右邊的 Alt 按鍵
    BackSpace22Backspace(退格)按鍵
    Cancel110break 按鍵
    Caps_Lock66CapsLock(大寫字母鎖定)按鍵
    Control_L37左邊的 Ctrl 按鍵
    Control_R109右邊的 Ctrl 按鍵
    Delete107Delete 按鍵
    Down104↓ 按鍵
    End103End 按鍵
    Escape9Esc 按鍵
    Execute111SysReq 按鍵
    F167F1 按鍵
    F268F2 按鍵
    F369F3 按鍵
    F470F4 按鍵
    F571F5 按鍵
    F672F6 按鍵
    F773F7 按鍵
    F874F8 按鍵
    F975F9 按鍵
    F1076F10 按鍵
    F1177F11 按鍵
    F1296F12 按鍵
    Home97Home 按鍵
    Insert106Insert 按鍵
    Left100← 按鍵
    Linefeed54Linefeed(Ctrl + J)
    KP_090小鍵盤數(shù)字 0
    KP_187小鍵盤數(shù)字 1
    KP_288小鍵盤數(shù)字 2
    KP_389小鍵盤數(shù)字 3
    KP_483小鍵盤數(shù)字 4
    KP_584小鍵盤數(shù)字 5
    KP_685小鍵盤數(shù)字 6
    KP_779小鍵盤數(shù)字 7
    KP_880小鍵盤數(shù)字 8
    KP_981小鍵盤數(shù)字 9
    KP_Add86小鍵盤的 + 按鍵
    KP_Begin84小鍵盤的中間按鍵(5)
    KP_Decimal91小鍵盤的點按鍵(.)
    KP_Delete91小鍵盤的刪除鍵
    KP_Divide112小鍵盤的 / 按鍵
    KP_Down88小鍵盤的 ↓ 按鍵
    KP_End87小鍵盤的 End 按鍵
    KP_Enter108小鍵盤的 Enter 按鍵
    KP_Home79小鍵盤的 Home 按鍵
    KP_Insert90小鍵盤的 Insert 按鍵
    KP_Left83小鍵盤的 ← 按鍵
    KP_Multiply63小鍵盤的 * 按鍵
    KP_Next89小鍵盤的 PageDown 按鍵
    KP_Prior81小鍵盤的 PageUp 按鍵
    KP_Right85小鍵盤的 → 按鍵
    KP_Subtract82小鍵盤的 - 按鍵
    KP_Up80小鍵盤的 ↑ 按鍵
    Next105PageDown 按鍵
    Num_Lock77NumLock(數(shù)字鎖定)按鍵
    Pause110Pause(暫停)按鍵
    Print111PrintScrn(打印屏幕)按鍵
    Prior99PageUp 按鍵
    Return36Enter(回車)按鍵
    Right102→ 按鍵
    Scroll_Lock78ScrollLock 按鍵
    Shift_L50左邊的 Shift 按鍵
    Shift_R62右邊的 Shift 按鍵
    Tab23Tab(制表)按鍵
    Up98↑ 按鍵

    總結(jié)

    以上是生活随笔為你收集整理的Tkinter:事件绑定的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。