鼠标与键盘交互设计

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

在海龟绘图中,也支持与鼠标或键盘的交互操作。它提供了监听键盘按键事件、鼠标事件以及定时器等方法,下面分别进行介绍。

1键盘事件

海龟绘图中提供了对键盘事件进行监听的方法。在执行键盘事件监听时,需要调用listen()方法。

该方法用于让海龟屏幕(TurtleScreen)可以获得焦点,为接收键盘事件做好准备。调用listen()方法的代码如下:

turtle.listen()

海龟绘图中的键盘事件主要有以下两个:

l   onkey()|onkeyrelease() :当按键被按下并释放时发生语法如下:

turtle.onkey(fun, key)

或者

turtle.onkeyrelease(fun, key)

参数说明:

l  fun :必选参数,表示一个无参数的函数,用于指定当按下并释放指定按键时,执行的函数。也可以指定为 None,表示什么都不做。

l  key :必选参数,表示被按下的键对应的字符串, 如 "a" 或"space"。当指定"a"时,表示当按下并释放<a>键时执行fun参数所指定的函数。

例如,当按下并释放键盘上的<w>键时,海龟向上移动100像素,代码如下:

import turtle # 导入海龟绘图模块

def funmove():

turtle.left(90) # 逆时针旋转90度

turtle.forward(100) # 向前移动100像素

turtle.listen() # 让海龟屏幕(TurtleScreen)获得焦点

turtle.onkey(funmove,'w') # 按下并释放<w>键

turtle.done() # 海龟绘图程序的结束语句(开始主循环)

运行上面的代码,当按下并释放键盘上的<w>键时,屏幕上的向右箭头将逆时针旋转90度,并且快速向上移动100像素并画线。

l  onkeypress() :当按键被按下(不释放)时发生语法如下:

turtle.onkeypress(fun, key=None)

参数说明:

l  fun :表示一个无参数的函数,用于指定当按下(不释放)指定按键时,执行的函数。也可以指定为 None,表示什么都不做。

l  key :可选参数,表示被按下的键对应的字符串, 如 "a"或"space"。当指定"a"时,表示当按下(不释放)<a>键时执行fun参数所指定函数。如果未指定,则移除事件绑定。

例如,当一直按下(不释放)键盘上的<↑>键时,让海龟一直向前移动,释放按键即停止移动,代码如下:

import turtle # 导入海龟绘图模块

def funmove():

turtle.forward(1) # 向前移动1像素

turtle.listen() # 让海龟屏幕(TurtleScreen)获得焦点

turtle.onkeypress(funmove,'Up') # 按下向上方向键

turtle.done() # 海龟绘图程序的结束语句(开始主循环)

运行上面的代码,当一直按下(不释放)键盘上的<↑>键时,海龟将一直向前移动。

2  鼠标事件

在海龟绘图中提供了对鼠标事件进行监听的方法。海龟绘图中的鼠标事件主要有以下3个:

l  onclick()|onscreenclick() :表示处理鼠标点击屏幕事件语法如下:

turtle.getscreen().onclick(fun, btn=1, add=None)

或者

turtle.onscreenclick(fun, btn=1, add=None)

参数说明:

l  fun :表示一个函数,用于指定当鼠标按键被按下时执行的函数。该函数调用时将传入两个参数,表示在屏幕上点击位置的坐标,所以指定的函数需要带有两个参数。

l  btn :鼠标按键编号,默认值为1(鼠标左键)、2(鼠标中键,即按下滑轮)、3(鼠标右键)。

l  add :一个布尔值,表示是否添加新绑定。如果为True,则添加一个新绑定;否则将取代先前的绑定。

说明:如果将fun 参数设置为None,则将移除事件绑定。

实例15.8   获取鼠标的点击位置       

当使用鼠标左键点击屏幕时,显示点击位置的坐标,代码如下:

import turtle # 导入海龟绘图模块

def funclick(x,y):

turtle.clear() # 清空屏幕

turtle.write((x,y),font=('宋体',15,'normal')) # 输出坐标的位置

turtle.onscreenclick(funclick,1) # 单击鼠标左键

turtle.done() # 海龟绘图程序的结束语句(开始主循环)

运行上面的代码,单击屏幕将显示出单击位置的坐标,如图15.46所示。

图15.46  显示单击位置的坐标

onclick()方法也可以作为海龟对象的方法,例如,下面的代码将实现在单击屏幕中的海龟时,显示当前的坐标位置:

import turtle # 导入海龟绘图模块

t = turtle.Turtle() # 创建海龟对象

t.shape('turtle') # 设置画笔形状

def funclick(x,y):

turtle.clear() # 清空屏幕

turtle.write((x,y),font=('宋体',15,'normal')) # 显示坐标位置

t.onclick(funclick,1) # 单击海龟

turtle.done() # 海龟绘图程序的结束语句(开始主循环)

运行上面的代码,只在单击屏幕上的小海龟时,才会显示当前的坐标位置。

l   onrelease() :该方法为海龟对象的方法,表示处理鼠标释放事件语法如下:

turtle.onrelease(fun, btn=1, add=None)

参数说明:

l  fun :表示一个事件触发时执行的函数。该函数调用时将传入两个参数表示释放鼠标按键时鼠标位置的坐标,所以指定的函数需要带有两个参数。

l  btn :鼠标按键编号,默认值为1(鼠标左键)、2(鼠标中键,即按下滑轮)、3(鼠标右键)。

l  add :一个布尔值,表示是否添加新绑定。如果为True,则添加一个新绑定;否则将取代先前的绑定。

例如,创建一个海龟对象,当用户在海龟对象上按下鼠标左键并释放时显示释放时鼠标位置的坐标,代码如下:

import turtle # 导入海龟绘图模块

t = turtle.Turtle() # 创建海龟对象

t.shape('turtle') # 指定画笔形状

def fun(x,y):

turtle.clear() # 清空屏幕

turtle.write((x,y),font=('宋体',15,'normal')) # 显示坐标的位置

t.onrelease(fun,1) # 处理鼠标释放事件

turtle.done() # 海龟绘图程序的结束语句(开始主循环)

l  ondrag() :表示处理鼠标拖动事件语法如下:

turtle.ondrag(fun, btn=1, add=None)

参数说明:

l  fun :表示按住鼠标左键并拖动时执行的函数。该函数调用时将传入两个参数表示释放鼠标按键时鼠标位置的坐标,所以指定的函数需要带有两个参数。

l  btn :鼠标按键编号,默认值为1(鼠标左键)、2(鼠标中键,即按下滑轮)、3(鼠标右键)。

l  add :一个布尔值,表示是否添加新绑定。如果为True则,则添加一个新绑定;否则将取代先前的绑定。

说明:当画笔为落笔状态时,在海龟对象上单击并拖动海龟可在屏幕上手绘线条。

例如,创建一个海龟对象,并且为该对象添加拖动事件,实现拖动屏幕中的海龟时,在屏幕上手绘线条,代码如下:

import turtle # 导入海龟绘图模块

t = turtle.Turtle() # 创建海龟对象

t.shape('turtle') # 设置画笔形状

334

Python 从入门到实践

t.color('blue') # 设置画笔颜色

turtle.listen() # 让海龟屏幕(TurtleScreen)获得焦点

def fun(x,y):

t.pendown() # 落笔

t.goto(x,y) # 移动到指定坐标

t.ondrag(fun,1) # 处理拖动事件

turtle.done() # 海龟绘图程序的结束语句(开始主循环)

运行上面的代码,拖动海龟光标绘制想要的图案,效果如图15.47所示。

图15.47  在屏幕上手绘线条

3计算器

在海龟绘图中,提供了ontimer()方法来实现一个计时器,用于当达到指定时间时,执行一个操作。

语法如下:

turtle.ontimer(fun, t=0)

参数说明:

l  fun :无参数的函数,当计时器到到指定时间时执行。

l  t :指定一个大于或等于0的数值,表示多长时间(单位为毫秒)后触发fun指定的函数。

例如,安装一个计时器,在300毫秒后调用画正方形的函数,代码如下:

import turtle # 导入海龟绘图模块

def fun(): # 绘制正方形

for i in range(4):

turtle.forward(100)

turtle.left(90)

turtle.getscreen().ontimer(fun, 300) # 设置计时器

turtle.done() # 海龟绘图程序的结束语句(开始主循环)

运行程序,等待300毫秒后,将绘制一个正方形。

动手试一试6

 任务一:通过←、→、↑、↓键控制海龟的移动

在游戏中,通过按下键盘上的←、→、↑、↓键来控制精灵移动。本任务要求实现按下←、→、↑、↓键控制海龟移动,例如,按下↑键海龟头朝上同时一直向前移动,如图15.48所示,按下←键海龟头朝左同时一直向左移动,如图15.49所示。

  

图15.48  按下↑键

 图15.49  按下←键

任务二:追逐鼠标的红点

本任务要求编写一段Python代码,将画笔形状设置为圆点,画笔颜色为红色,然后实现单击屏幕时光标移动到点击位置,同时在原位置和新位置之间画一条线,再次单击,则继续画线,如图15.50所示。当单击鼠标右键时清空屏幕,光标位置不动。

图15.50  追逐鼠标的红点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/743765.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

tensorflow学习:错误 InternalError: Dst tensor is not initialized

tensorflow学习&#xff1a;错误 InternalError: Dst tensor is not initialized_dst tensor is not initialized.-CSDN博客https://blog.csdn.net/wanglitao588/article/details/77033659

基于51单片机的RFID门禁系统-LCD12864显示

一.硬件方案 本RFID系统设计可分为硬件部分和软件部分。硬件部分以MFRC522射频识别模块为核心&#xff0c;结合主控模块STC89C52设计系统的外围硬件电路&#xff0c;实现对射频卡的控制与MCU之间的互通。软件部分采用C语言进行系统的下位机程序的开发&#xff0c;完成与IC卡之…

后端学习笔记:Python基础

后端学习笔记&#xff1a;Python基础 数据类型&#xff1a; Python中主要有以下几种常用的基本数据类型&#xff1a; String 字符串类型&#xff0c;用单引号或者双引号引用Number 数字类型&#xff0c;包括浮点数&#xff0c;整数&#xff0c;长整数和复数List 列表项&…

【Linux】常用基本命令

wget网址用于直接从网上下载某个文件到服务器&#xff0c;当然也可以直接从网上先把东西下到本地然后用filezilla这个软件来传输到服务器上。 当遇到不会的命令时候&#xff0c;可以使用man “不会的命令”来查看这个命令的详细信息。比如我想要看看ls这个命令的详细用法&…

一个土木工程专业背景的开发者,讲述开源带给他的力量

在前段时间我们举办的“TDengine Open Day”第一季技术沙龙中&#xff0c;TDengine 应用研发高级工程师谭雪峰进行的“开源之路&#xff1a;程序员的成长与探索”主题分享获得了众多参会者的好评。谭雪峰从自身独特的职业发展经历出发&#xff0c;分享了自己在开源领域的种种收…

替换或重写Tomcat内置的404页面

替换或重写Tomcat内置的404页面 准备一个Tomcat隐藏Tomcat的相关信息纯净版的Tomcat解决Tomcat启动乱码的问题 替换或重写Tomcat内置的404页面创建新的首页和错误页面页面代码如下所示&#xff1a;创建首页index.html创建error_404.html页面创建其他错误页面创建编写web.xml&am…

工业软件的分类与选择策略:针对中小企业的实际应用考量

工业软件是现代工业体系的“大脑”&#xff0c;已经渗透到几乎所有工业领域的核心环节&#xff0c;是现代产业之“魂”&#xff0c;是制造强国之重器。工业软件通过优化生产流程、实时监控设备状态、实现自动化控制等功能&#xff0c;可以帮助企业显著提升生产效率和质量&#…

让工厂像手机一样更“聪明”

手机&#xff0c;作为我们日常生活中不可或缺的一部分&#xff0c;以其智能、便捷、高效的特点&#xff0c;彻底改变了我们的沟通、娱乐和工作方式。那么&#xff0c;想象一下&#xff0c;如果工厂能像手机一样便捷&#xff0c;那么生产过程中的每一个环节都将变得触手可及。通…

jstack的火焰图使用说明

1、jstack的官方文档说明 How to use Flame Graph? - Fast thread 2、jstack的文件分析网站&#xff0c;可以关注cpu消耗比较高的线程和火焰图 GC log analysis error

[word] Word如何删除所有的空行? #职场发展#学习方法

Word如何删除所有的空行&#xff1f; 很多网友从网页复制文字粘贴到word文档后发现段落之间有空行&#xff0c;如果文字不多&#xff0c;手动删除这些空行也没有多少工作量&#xff0c;但是如果文字的字数达到成千上万&#xff0c;一个个手动删除这些空行还是很繁琐的。那么&a…

Linux-笔记 高级I/O操作

前言 I/O&#xff08;Input/Output&#xff0c;输入/输出&#xff09;是计算机系统中的一个重要组成部分&#xff0c;它是指计算机与 外部世界之间的信息交流过程。I/O 操作是计算机系统中的一种基本操作&#xff0c;用于向外部设备&#xff08;如 硬盘、键盘、鼠标、网络等&am…

Spring Cloud - 开发环境搭建

1、JDK环境安装 1、下载jdk17&#xff1a;下载地址&#xff0c;在下图中红色框部分进行下载 2、双击安装&#xff0c;基本都是下一步直到完成。 3、设置系统环境变量&#xff1a;参考 4、设置JAVA_HOME环境变量 5、在PATH中添加%JAVA_HOME%/bin 6、在命令行中执行&#xff1a;j…

Python学习笔记17:进阶篇(六)代码测试

代码测试 代码测试是软件开发过程中的关键环节&#xff0c;旨在确保代码质量、功能正确性以及性能符合预期。 在开发过程中&#xff0c;进行代码测试有很多好处&#xff1a; 提高软件质量&#xff1a;通过发现并修复错误&#xff0c;测试有助于提升软件的功能性、可靠性和稳…

黑马程序员-瑞吉外卖-前六章

黑马程序员瑞吉外卖 文章目录 1、开发环境搭建1.1 数据库环境1.2 maven项目搭建1.2.1 新建项目1.2.2 整合MyBatisPlus1.2.3 整合Druid1.2.4 配置文件application.yml1.2.5 尝试启动项目1.2.6 将前端静态页面引入到项目中 2、 后台系统登录功能2.1 需求分析2.2 代码开发2.2.1 创…

解析网页数据并且处理网页正则表达式与re模块

目录 一、解析网页数据的技术 1&#xff0e;正则表达式 2&#xff0e;XPath 3&#xff0e;Beautiful Soup 4&#xff0e;JSONPath 二、正则表达式的语法 1&#xff0e;元字符 2&#xff0e;预定义字符集 三、 re 模块的使用 1&#xff0e;创建 Pattern 对象 2&#…

libreoffice报: error while loading shared libraries: libcups.so.2: cannot

切换到cd /opt/libreoffice7.1/programlibreoffice查看版本的时候报:/opt/libreoffice7.1/program/soffice.bin: error while loading shared libraries: libcups.so.2: cannot open shared object file: No such file or directory ./soffice --version解决办法&#xff1a; …

MySQL之复制(六)

复制 复制拓扑 拥有备库的主-主结构 另外一种相关的配置是为每个主库增加一个备库&#xff0c;如图所示。这种配置的优点是增加了冗余&#xff0c;对于不同地理位置的复制拓扑&#xff0c;能够消除站点单点失效的问题。你也可以像平常一样&#xff0c;将读查询分配到备库上。…

深入JVM:详解JIT即时编译器

文章目录 深入JVM&#xff1a;详解JIT即时编译器一、序言二、基础概念1、何为JIT即时编译2、热点代码 三、HotSpot内置的即时编译器1、C1编译器2、C2编译器3、分层编译3.1 协作流程 四、常见JIT优化技术1、方法内联2、逃逸分析&#xff08;1&#xff09;同步锁消除&#xff08;…

从零开始学习Linux(10)----动静态库

目录 1.制作静态库 1.编写源代码 2.编译 3.打包库 4.使用库 2.制作动态库 1.编译 2.打包库 3.总结 3.理解动态库加载 1.站在系统角度理解 2.谈谈编址&#xff0c;可执行程序 1.制作静态库 1.编写源代码 假设你编写了两个源代码文件mymath.c和myprintf.c以及它们对应…

vuex的actions返回结果类型是promise及actions方法互相调用

this.$store.dispatch(‘logout’)返回的结果是Promise类型的 调用成功的情况下&#xff0c;返回状态为fulfilled&#xff0c;值为undefined。 所以可以直接进行.then操作&#xff1a; this.$store.dispatch(logout).then((result) > {console.log(result); });因为 Vuex …