当前位置: 首页 > news >正文

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


http://www.mrgr.cn/news/66601.html

相关文章:

  • 【Python】Python自习课:第一个python程序
  • AI大模型开发架构设计(14)——基于LangChain大模型的案例架构实战
  • Docker-- cgroups资源控制实战
  • 介绍一下rand函数生成随机数(c基础)
  • 《MySQL 8 DBA基础教程》第一章习题
  • 开发中使用UML的流程_01概述
  • Vue(JavaScript)读取csv表格并求某一列之和(大浮点数处理: decimal.js)
  • Vue组件有哪些属性、方法和销毁函数?
  • python项目使用sqlalchemy的order_by方法报错‘Out of sort memory‘的解决方案
  • npm镜像的常用操作
  • wireshark-网络分析工具
  • Chart.js 混合图
  • Scala IF...ELSE 语句
  • Visual Studio 2022:一个功能全面且强大的IDE
  • 【C++ 数学】1330. 翻转子数组得到最大的数组值|2481
  • 使用 Python 调用云 API 实现批量共享自定义镜像
  • verilog-HDL
  • 数字信号处理Python示例(6)使用指数衰减函数建模放射性衰变过程
  • 100、Python并发编程:保护临界资源的最简单方式,加锁
  • 国产安卓旗舰手机全部涨价
  • C++算法练习-day36——513.找树左下角的值
  • 基于matlab的语音识别系统
  • C++ | Leetcode C++题解之第540题有序数组中的单一元素
  • 【Linux 28】应用层协议 - HTTPS
  • Golang | Leetcode Golang题解之第540题有序数组中的单一元素
  • Python | Leetcode Python题解之第541题反转字符串II