正如我们此前提到的,一个 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()

Tkinter:事件绑定


在上边这个例子中,我们使用 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()

Tkinter:事件绑定


最后我们再用一个例子展示捕获鼠标在组件上的运动轨迹,这里需要关注的是 <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
View Code

相关文章:

  • 2021-09-25
  • 2021-08-25
  • 2022-12-23
  • 2021-06-20
  • 2021-07-16
  • 2021-07-24
  • 2021-06-08
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-17
  • 2022-12-23
相关资源
相似解决方案