[譯][Tkinter 教程15] event 事件綁定

已獲原做者受權. 原系列地址: 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 字段是一個事件的關鍵字段. modiferdetail 字段則不是必要字段, 不少狀況下這兩個字段都不會被賦值. 這兩個字段用以提供 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
相關文章
相關標籤/搜索