[Tkinter 教程15] event 事件绑定

原系列地址: Python Tkinter

简介

一个 Tkinter 应用生命周期中的大部分时间都处在一个消息循环 (event loop) 中. 它等待事件的发生: 事件可能是 按键按下, 鼠标点击, 鼠标移动 等.
Tkinter 提供了用以处理相关事件的机制. 处理函数可以被绑定给各个控件的各种事件.
widget.bind(event, handler)
如果相关事件发生, handler 函数会被触发, 事件对象 event 会传递给 handler 函数.

#!/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()

让我们再写一个例子, 用以处理上面提到的鼠标在控件内移动的事件:

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 到相关事件. 事件以字符串的形式给出:

<modifier-type-detail>

type 字段是一个事件的关键字段. modiferdetail 字段则不是必要字段, 很多情况下这两个字段都不会被赋值. 这两个字段用以提供 type 所代表的事件的附加信息. type 字段描述事件种类, 比如 鼠标点击, 键位按下, 控件获得焦点 等.

EventDescription
<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 属性传递. 有些平台上该事件也可能代表控件位置改变.

译者水平有限, 如有疏漏, 欢迎指正.
已获得原作者授权. 原文地址: Events and Binds

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值