Python的turtle模块的事件处理
Python的turtle模块的事件处理
Python的turtle模块支持事件处理。
先看一个比较有趣的例子:
小海龟一开始出现在屏幕中心,按下"m"键开始运动 ,按下"s"键停止运动,用光标键(上、下、左、右箭头键)来控制小海龟的移动方向:向上、向下、向左、向右。
源码如下:
import turtle# 创建屏幕和海龟对象
screen = turtle.Screen()
t = turtle.Turtle()# 初始化变量
moving = False # 控制是否在移动
speed = 5 # 移动速度# 定义移动函数
def move():if moving: # 如果moving为True,继续移动t.forward(speed)screen.ontimer(move, 50) # 每50毫秒调用一次move函数# 开始移动
def start_moving():global movingmoving = Truemove()# 停止移动
def stop_moving():global movingmoving = False# 改变方向的函数
def turn_up():t.setheading(90) # 向上(90度)def turn_down():t.setheading(270) # 向下(270度)def turn_left():t.setheading(180) # 向左(180度)def turn_right():t.setheading(0) # 向右(0度)# 设置初始位置和外观
t.penup() # 抬起画笔,这样移动时不会画线
t.shape("turtle") # 使用海龟形状# 绑定按键事件
screen.onkey(start_moving, "m") # 按'm'开始移动
screen.onkey(stop_moving, "s") # 按's'停止移动
screen.onkey(turn_up, "Up") # 向上箭头键
screen.onkey(turn_down, "Down") # 向下箭头键
screen.onkey(turn_left, "Left") # 向左箭头键
screen.onkey(turn_right, "Right")# 向右箭头键# 启用键盘监听
screen.listen()# 保持窗口打开
screen.mainloop()
turtle模块常用的事件处理函数/方法介绍
【方法(Method):专指属于某个对象的函数,通常是类中定义的函数。在 turtle 模块的文档和教学材料中,“函数”和“方法”用法并不严格。】
1.绑定键盘事件方法
onkeypress(fun, key=None): 当按下指定键时调用fun函数。如果key为None,则fun会在按下任意键时被调用。表示键的字符串表示是区分大小写的,例如,'W' 代表字母 W,'Left'、'Right'、'Up'、'Down' 分别代表箭头键。
onkeyrelease(fun, key=None): 当释放指定键时调用fun函数。如果key为None,则fun会在释放任意键时被调用。
onkey(fun, key): 当按下并持续按住指定键时,不断调用fun函数。onkey 函数key必须要绑定的具体键的字符串表示。例如,'W' 代表字母 W,'Left'、'Right'、'Up'、'Down' 分别代表箭头键。
注意,在使用 turtle 模块处理键盘事件时,必须调用 screen.listen() 来启用键盘监听。这是因为在 Turtle 的事件处理中,监听器需要被显式地激活,以便能够响应相应的键盘按键事件。换句话说,screen.listen()方法启动对键盘事件的监听。这意味着,当键盘上的按键被按下时,turtle模块将能够捕获这些事件,并根据你使用screen.onkeypress()、 screen.onkeyrelease()、 或 screen.onkey()方法设置的回调函数来响应它们。
键盘事件方法示例(按下'w'键时移动海龟):
import turtle # 创建一个屏幕对象
screen = turtle.Screen() # 创建一个海龟对象
t = turtle.Turtle() # 定义一个键盘事件处理函数
def move_forward(): t.forward(30) # 绑定键盘事件(按下'w'键时移动海龟)
screen.onkey(move_forward, "w") # 开始监听键盘事件
screen.listen() # 启动事件循环,保持窗口打开
screen.mainloop()
2.绑定鼠标事件方法
onscreenclick(fun, btn=1, add=None): 当在屏幕上点击时调用fun函数。btn参数指定鼠标按钮(1表示左键,2表示中键,3表示右键),add参数指定是否添加事件处理函数而不是替换现有的。这个事件方法为整个屏幕添加点击事件,而不仅仅是某个特定的海龟对象。
onmousemotion(fun, add=None): 当鼠标移动时调用fun函数——事件处理函数,绑定事件时指定的函数。
onmousedrag(fun, btn=1, add=None): 当拖动鼠标时调用fun函数。
onbuttonclick(fun, btn=1, add=None): 当点击海龟按钮时调用fun函数(海龟按钮是turtle窗口中的一个小海龟图标,点击它会将海龟重置到窗口中心)。
鼠标事件方法示例(鼠标点击屏幕时移动海龟到点击位置):
import turtle # 创建一个屏幕对象
screen = turtle.Screen() # 创建一个海龟对象
t = turtle.Turtle() # 定义一个鼠标事件处理函数
def move_to_click(x, y): t.penup() t.goto(x, y) t.pendown() # 绑定鼠标事件(点击屏幕时移动海龟到点击位置)
screen.onscreenclick(move_to_click)# 保持窗口打开,直到用户关闭它
screen.mainloop()
3. 设置定时器事件方法
ontimer(fun, t=0, arg=None)方法来设置定时器事件
fun: 要在指定时间后调用的函数。
t: 延迟时间(以毫秒为单位)。如果t为0,则函数会尽快被调用,但仍然是在当前事件处理循环的末尾。
arg: 可选参数,用于传递给函数的参数。如果函数需要多个参数,你可以使用lambda表达式或functools.partial来创建一个只接受一个参数的函数。
定时器事件方法示例(每隔1秒小海龟移动一次):
import turtle # 创建一个屏幕对象
screen = turtle.Screen() # 创建一个海龟对象
t = turtle.Turtle() # 定义一个函数,用于移动海龟
def move_turtle(): t.forward(30) # 移动海龟30个单位 # 再次安排这个函数在1000毫秒(1秒)后被调用 screen.ontimer(move_turtle, 1000) # 初始调用move_turtle函数,并设置1秒的延迟
screen.ontimer(move_turtle, 1000) # 启动事件循环
screen.mainloop()
附录
使用屏幕事件https://docs.python.org/zh-cn/3/library/turtle.html#using-screen-events
使用事件https://docs.python.org/zh-cn/3/library/turtle.html#using-events