一个 Tkinter 应用程序大部分时间是花在事件循环当中的,也就是通过 mainloop() 进入的事件循环。
事件可以有各种来源:用户触发的鼠标和键盘操作和窗口管理器触发的重绘事件(在多数情况下是由用户简介引起的)
Tkinter 给我们提供了一个强大的机制去管理这些事件,去定义这些事件的操作。对每一个组件来说,可以通过 bind() 的方法来将自己定义的函数或方法绑定到具体的事件上。
widget.bind(event, handler)
当被触发的事件满足该组件绑定的事件的时候,Tkinter 就会带着事件对象(Event、事件本身的描述)去调用自定义的 handler() 方法。
目录
实例
捕获鼠标点击的位置的演示
from tkinter import *
root =Tk()
#当触发<Button-1>,Tkinter会带着事件本身去调用callback,会把它传入到callback中,因此要个形参来接收对应的事件描述
def callback(event):
print("点击位置:", event.x, event.y) #这个x和y表示的是相对于应用程序左上角的x和y。root的x和y相对的是屏幕
frame = Frame(root, width=200, height=200)
frame.bind("<Button-1>", callback) # -左边是事件本身,右边是事件详细描述。Button表示的是鼠标的点击事件,1表示的是左键,2代表滚轮,3表示右键,4、5对于Linux系统才有用,表示滚轮向上滚和向下滚。对于Windows和Mac系统来说则是通过mousewhell来表示用户是向上滚还是向下滚了滚轮。
frame.pack()
mainloop()
关于键盘的演示
from tkinter import *
root =Tk()
def callback(event):
print(event.char) #获取当前键盘按下的字符
frame = Frame(root, width=200, height=200)
frame.bind("<Key>", callback) #组件想要响应键盘事件,组件必须获得焦点,组件才会响应键盘来的消息。因为一个窗口可以有很多组件,键盘一次敲击不知道给哪个组件。
frame.focus_set() #通过focus_set方法获得焦点。也可以设置Frame的takefocus选项为True,然后使用Tab将焦点转移上来
frame.pack()
mainloop()
利用<Motion>事件获取鼠标实时位置的方式
from tkinter import *
root =Tk()
def callback(event):
print("当前位置:", event.x, event.y)
frame = Frame(root, width=200, height=200)
frame.bind("<Motion>", callback) #Motion事件表示当鼠标进入组件时,就会响应这个事件
frame.focus_set()
frame.pack()
mainloop()
<