正如我们此前提到的,一个 Tkinter 应用程序大部分时间花费在事件循环中(通过 mainloop() 方法进入)。事件可以有各种来源:包括用户触发的鼠标和键盘操作和窗口管理器触发的重绘事件(在多数情况下是由用户间接引起的)。
Tkinter 提供一个强大的机制可以让你自由地处理事件,对于每个组件来说,你可以通过 bind() 方法将函数或方法绑定到具体的事件上。
widget.bind(event, handler)
当被触发的事件满足该组件绑定的事件时,Tkinter 就会带着事件对象(Event)去调用 handler() 方法。
这儿有几个例子,大家请随意感受下:
第一个是关于鼠标按键的演示:
# 捕获点击鼠标的位置
import tkinter as tk root = 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() 方法将鼠标点击事件(<Button-1>)和我们自定义的 callback() 方法绑定起来。那么运行后的结果是——当你在点击鼠标左键的时候,IDLE 会相应的将鼠标的位置显示出来(如上图)。
第二个是关于键盘按键的演示:
只有当组件获得焦点的时候才能接收键盘事件(Key),下边例子中我们用 focus_set() 获得焦点,当你你可以设置 Frame 的 takefocus 选项为 True,然后使用 Tab 将焦点转移上来。
# 捕获键盘事件
import tkinter as tk root = 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()
最后我们再用一个例子展示捕获鼠标在组件上的运动轨迹,这里需要关注的是 <Motion> 事件:
# 捕获鼠标在组件上的运动轨迹
import tkinter as tk root = tk.Tk() def callback(event): print("当前位置为:", event.x, event.y) frame = tk.Frame(root, width = 200, height = 200) frame.bind("<Motion>", callback) frame.pack() root.mainloop()
下方主要内容:
事件序列
type
modifier
Event 对象
Key names
事件序列
Tkinter 使用一种称为事件序列的机制来允许用户定义事件,用户需使用 bind() 方法将具体的事件序列与自定义的方法相绑定。事件序列是以字符串的形式表示的,可以表示一个或多个相关联的事件(如果是多个事件,那么对应的方法只有在满足所有事件的前提下才会被调用)。
事件序列使用以下语法描述:
<modifier-type-detail>
事件序列是包含在尖括号(<...>)中
type 部分的内容是最重要的,它通常用于描述普通的事件类型,例如鼠标点击或键盘按键点击(详见下方)。
modifier 部分的内容是可选的,它通常用于描述组合键,例如 Ctrl + c,Shift + 鼠标左键点击(详见下方)。
detail 部分的内容是可选的,它通常用于描述具体的按键,例如 Button-1 表示鼠标左键。
举几个例子帮助大家消化:
事件序列 含义
<Button-1> 用户点击鼠标左键
<KeyPress-H> 用户点击 H 按键
<Control-Shift-KeyPress-H> 用户同时点击 Ctrl + Shift + H
事件类型 事件格式 事件解释 鼠标事件 <Button-1> 鼠标点击(1-左键,2-中键,3-右键) <Double-Button-1> 鼠标双击(1-左键,2-中键,3-右键) <B1-Motion> 鼠标拖动(1-左键,2-中键,3-右键) <ButtonRelease-1> 鼠标按下之后释放(1-左键,2-中键,3-右键) <Enter> 鼠标进入控件范围(widget),不是键盘按键 <Leave> 鼠标离开控件范围(widget) 键盘事件 <Key>/<KeyPress> 任意键盘按键(键值会以char的格式放入event对象) <Return> <Cancel> <BackSpace> <Tab> <Shift_L> <Control_L> <Alt_L> <Home> <Left> <Up> <Down> <Right> <Delete> <F1> <F2> 对应键盘按键 组件事件 <Configure> 如果widget的大小发生改变,新的大小(width和height)会打包到event发往handler。 <Activate> 当组件从不可用变为可用 <Deactivate> 当组件从可用变为不可用 <Destroy> 当组件被销毁时 <Expose> 当组件从被遮挡状态变为暴露状态 <Map> 当组件由隐藏状态变为显示状态 <Unmap> 当组件由显示状态变为隐藏状态 <FocusIn> 当组件获得焦点时 <FocusOut> 当组件失去焦点时 <Property> 当组件属性发生改变时 <Visibility> 当组件变为可视状态时 ———————————————— 版权声明:本文为CSDN博主「xiaozhimonica」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/xiaozhimonica/article/details/87873048