已獲原做者受權. 原系列地址: Python Tkinter
一個 Tkinter 應用生命週期中的大部分時間都處在一個消息循環 (event loop) 中. 它等待事件的發生: 事件多是 按鍵按下, 鼠標點擊, 鼠標移動 等.
Tkinter 提供了用以處理相關事件的機制. 處理函數能夠被綁定給各個控件的各類事件.widget.bind(event, handler)
若是相關事件發生, handler 函數會被觸發, 事件對象 event 會傳遞給 handler 函數.php
#!/usr/bin/python3 # write tkinter as Tkinter to be Python 2.x compatible from tkinter import * def hello(event): print("Single Click, Button-l") def quit(event): print("Double Click, so let's stop") import sys; sys.exit() widget = Button(None, text='Mouse Clicks') widget.pack() widget.bind('Button-1', hello) widget.bind('Double-1', quit) widget.mainloop()
讓咱們再寫一個例子, 用以處理上面提到的鼠標在控件內移動的事件:python
from tkinter import * def motion(event): print("Mouse position: (%s %s)" % (event.x, event.y)) return master = Tk() whatever_you_do = "Whatever you do will be insignificant, but it is very important that you do it.\n(Mahatma Gandhi)" msg = Message(master, text = whatever_you_do) msg.config(bg='lightgreen', font=('times', 24, 'italic')) msg.bind('Motion',motion) msg.pack() mainloop()
Tkinter 使用所謂的 事件隊列 (event sequences) 暴露接口以綁定 handler 到相關事件. 事件以字符串的形式給出:segmentfault
modifier-type-detail
type
字段是一個事件的關鍵字段. modifer
和 detail
字段則不是必要字段, 不少狀況下這兩個字段都不會被賦值. 這兩個字段用以提供 type
所表明的事件的附加信息. type
字段描述事件種類, 好比 鼠標點擊, 鍵位按下, 控件得到焦點 等.less
Event | Description |
---|---|
Button | 某個鼠標按鍵在控件上被點擊. detail 指定了哪個按鍵被點擊了, 好比, 鼠標左鍵點擊爲 Button-1, 鼠標中鍵點擊爲 Button-2, 鼠標右鍵點擊爲 Button-3, 向上滾動滑輪爲 Button-4, 向下滾動滑輪爲 Button-5. 若是在控件上按下鼠標的某個鍵並保持按下, Tkinter 將"抓住"該事件. 以後的鼠標事件, 好比 鼠標移動 或 鼠標按鍵釋放 事件, 會被自動發送給該控件處理, 即便鼠標移動出該控件時依然如此. 鼠標相對當前控件的位置會被存儲在 event 對象中的 x 和 y 字段中傳遞給回調函數. |
Motion | 鼠標在某個按鍵被按下時的移動事件. 鼠標左鍵點擊爲 B1-Motion, 鼠標中鍵點擊爲 B2-Motion, 鼠標右鍵點擊爲 B3-Motion. 鼠標相對當前控件的位置會被存儲在 event 對象中的 x 和 y 字段中傳遞給回調函數. |
ButtonRelease | 按鈕點擊釋放事件. 鼠標左鍵點擊爲 ButtonRelease-1, 鼠標中鍵點擊爲 ButtonRelease-2, 鼠標右鍵點擊爲 ButtonRelease-3. 鼠標相對當前控件的位置會被存儲在 event 對象中的 x 和 y 字段中傳遞給回調函數. |
Double-Button | 鼠標雙擊事件. 鼠標左鍵點擊爲 Double-Button-1, 鼠標中鍵點擊爲 Double-Button-2, 鼠標右鍵點擊爲 Double-Button-3. Double 和 Triple 均可以被用做前綴. 注意: 若是同時綁定單擊事件 (Button-1) 和雙擊事件 (Double-Button-1), 則兩個回調都會被調用. |
Enter | 鼠標移入控件事件. 注意: 這個事件不是 Enter 鍵按下事件, Enter 按下事件是 Return. |
Leave | 鼠標移出控件事件. |
FocusIn | 控件或控件的子空間得到鍵盤焦點. |
FocusOut | 控件丟失鍵盤焦點 (焦點移動到另外一個控件). |
Return | Enter 點擊事件. 鍵盤上的全部鍵位均可以被綁定. 特殊鍵位名稱包括 Cancel, BackSpace, Tab, Return (Enter), Shift_L (任意 Shift), Control_L (任意 Control), Alt_L (任意 Alt), Pause, Caps_Lock, Escape, Prior (Page Up), Next (Page Down), End, Home, Left, Up, Right, Down, Print, Insert, Delete, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, Num_Lock, and Scroll_Lock |
Key | 鍵盤按鍵點擊事件. 鍵值被存儲在 event 對象中傳遞. (特殊鍵位會傳遞空鍵值). |
a | "a" 鍵被點擊. 其餘字符也能夠如此定義. 特殊狀況包括 空格 (space) 和 小於號 (less). 注意 "1" 是綁定鍵盤鍵位, 而 1 則是按鈕綁定. |
Shift-Up | 在 shift 被按下時點擊 up 鍵. 一樣的, 也有 Alt-Up, Control-Up 事件. |
Configure | 控件大小改變事件. 新的控件大小會存儲在 event 對象中的 width 和 height 屬性傳遞. 有些平臺上該事件也可能表明控件位置改變. |
全系列:
[譯][Tkinter 教程01] 入門: Label 控件
[譯][Tkinter 教程02] Message 控件
[譯][Tkinter 教程03] Button 控件
[譯][Tkinter 教程04] Variable 類
[譯][Tinkter 教程05] Radiobutton 控件
[譯][Tkinter 教程06] Checkbox 控件
[譯][Tkinter 教程07] Entry 控件
[譯][Tkinter 教程08] Canvas 圖形繪製
[譯][Tkinter 教程09] Scale 控件
[譯][Tkinter 教程10] Text 控件
[譯][Tkinter 教程11] 對話框和消息框
[譯][Tkinter 教程12] 佈局管理 (Pack Place Grid)
[譯][Tkinter 教程13] Mastermind 遊戲
[譯][Tkinter 教程14] menu 菜單
[譯][Tkinter 教程15] event 事件綁定
譯者水平有限, 若有疏漏, 歡迎指正.
已得到原做者受權. 原文地址: Events and Binds