已获原做者受权. 原系列地址: 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