鼠标与键盘交互设计

自学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  追逐鼠标的红点

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

背包模型——AcWing 423. 采药

背包模型 定义 背包模型是一种常见的算法问题模型&#xff0c;它主要涉及将一些物品放入一个容量有限的背包中&#xff0c;以达到某种最优目标&#xff0c;如最大化价值或最小化重量等。 运用情况 常用于资源分配、项目选择、货物装载等实际问题中。例如&#xff0c;在选择…

AWS云中的VPC启用流日志保存S3(AWS中国云)

问题 需要在AWS中国云中对VPC启用流日志操作。 步骤 创建s3桶 这里设置一个s3桶名&#xff0c;创建即可。如果出现已存在具有相同名称的存储桶错误&#xff0c;就换个桶名再试一试吧。 启用vpc流日志 找到vpc流日志入口操作&#xff0c;如下图&#xff1a; 设置vpc流日志…

『亚马逊云科技产品测评』程序员最值得拥有的第一台专属服务器 “亚马逊EC2实例“

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 引言 自2006年8月9日&#xff0c;在搜索引擎大会&#xff08;SES San Jo…

嵌入式EMC

名词介绍&#xff1a; EMC&#xff1a;兼容&#xff0c;设备间相互兼容在共同环境下工作的能力。包括&#xff1a;EMI和EMS EMI&#xff1a;interference干扰&#xff0c;自身对其他设备的干扰 EMS&#xff1a;susceptibility抗干扰能力 EMS包含以下&#xff1a; 浪涌&…

Java文件操作小项目-带GUI界面统计文件夹内文件类型及大小

引言 在Java编程中&#xff0c;文件操作是一项基本且常见的任务。我们经常需要处理文件和文件夹&#xff0c;例如读取、写入、删除文件&#xff0c;或者遍历文件夹中的文件等。本文将介绍如何使用Java的File类和相关API来统计一个文件夹中不同类型文件的数量和大小。 准备工作…

c++基本数据类型和计算(三)习题讲解

1.【单选题】 int a450; int main() { int a100; { int a 999; std::cout << a; } } A.999 B.100 C.450 解析&#xff1a;这道题考察作用域&#xff0c;本身遵守就近原则&#xff0c;所以选A。 2.【单选题】 int a; { int b 100; } ab<&l…

MySQL 基础概念

MySQL逻辑架构 MySQL 服务器逻辑架构图 最上层的服务并不是MySQL所独有的&#xff0c;大多数基于网络的客户端/服务器的工具或者服务都有类似的架构&#xff0c;比如连接管理、授权认证、安全等等。 大多数MySQL的核心服务都在第二层&#xff0c;包括查询解析、分析、优化、…

手持小风扇品牌有哪些?分享口碑最好的五款手持小风扇

手持小风扇在炎热的夏季成为了许多人解暑的好帮手。它们不仅轻便便携&#xff0c;随时随地都能为我们带来清凉和舒适。然而&#xff0c;市场上手持小风扇的品牌繁多&#xff0c;让人眼花缭乱。为了帮助大家做出更明智的选择&#xff0c;接下来我们将分享口碑最好的五款手持小风…

vscode关于java扩展

包含IDEA同款代码提示&#xff0c;vscode的debug&#xff0c;除了创建类要手动新建java文件以外&#xff0c;其他都还行&#xff0c;满足初学者要求。

Python+Pytest+Allure+Yaml接口自动化测试框架详解

PythonPytestAllureYaml接口自动化测试框架详解 编撰人&#xff1a;CesareCheung 更新时间&#xff1a;2024.06.20 一、技术栈 PythonPytestAllureYaml 版本要求&#xff1a;Python3.7.0,Pytest7.4.4,Allure2.18.1,PyYaml6.0 二、环境配置 1、安装python3.7&#xff0c;并配置…

C++编程逻辑讲解step by step:根据关键词自动判断文章的类别,去掉无关词后统计文章中每个单词出现的频率。

题目分析 根据关键词自动判断文章的类别。共2篇文章&#xff08;用char s1[]和char s2[]保存&#xff09;&#xff0c;去掉无关词后&#xff08;用char irrelevant[][10]保存&#xff09;&#xff0c;统计文章里面每个单词出现的频率&#xff1a;关键词个数去掉无关词后的文章…

前端JS必用工具【js-tool-big-box】学习,数值型数组的正向排序和倒向排序

这一小节&#xff0c;我们说一下前端 js-tool-big-box 这个工具库&#xff0c;添加的数值型数组的正向排序和倒向排序。 以前呢&#xff0c;我们的数组需要排序的时候&#xff0c;都是在项目的utils目录里&#xff0c;写一段公共方法&#xff0c;弄个冒泡排序啦&#xff0c;弄…

已解决java.security.GeneralSecurityException: 安全性相关的通用异常的正确解决方法,亲测有效!!!

已解决java.security.GeneralSecurityException: 安全性相关的通用异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 问题分析 报错原因 解决思路 解决方法 确定具体异常类型 检查输入参数 验证算法支持性 调整安全策略 确保资源可…

uniapp 小程序 堆叠轮播图 左滑 右滑 自动翻页 点击停止自动翻页

uniapp 小程序 堆叠轮播图 左滑 右滑 自动翻页 点击停止自动翻页 超过指定时间未点击滑动 则继续开始滚动 直接上代码 componentSwiper.vue 需要注意页面切换时清除计时器 <template><view><view class"swiperPanel" touchstart"startMove"…

Verilog刷题笔记48——FSM1型异步复位

题目: 解题&#xff1a; module top_module(input clk,input areset, // Asynchronous reset to state Binput in,output out);// parameter A0, B1; reg state, next_state;always (*) begin // This is a combinational always block// State transition logiccase(…

VMware vSphere 8.0 Update 3 发布下载 - 企业级工作负载平台

VMware vSphere 8.0 Update 3 发布下载 - 企业级工作负载平台 vSphere 8.0U3 | ESXi 8.0U3 & vCenter Server 8.0U3 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vsphere-8-u3/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&am…

【yolov8:报错AttributeError: ‘Segment‘ object has no attribute ‘detect‘】

今天在运行yolov8的Segment模式的val模型测验时报错&#xff1a; AttributeError: ‘Segment’ object has no attribute ‘detect’ 原因是yolov8的版本问题&#xff0c;更新至最新版就可以了&#xff1a; 输入ultralytics查看版本 卸载当前的老版本 然后下载最新版本就可以…

【前端】Vue项目和微信小程序生成二维码和条形码

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;我是前端菜鸟的自我修养&#xff01;今天给大家分享Vue项目和微信小程序如何生成二维码和条形码&#xff0c;介绍了JsBarcode、wxbarcode等插件&#xff0c;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01…

为什么要学Java?

想要自己教会自己java&#xff0c;从小白成长到架构师。实现硬实力就业&#xff01; 因为Java是全球排名第一的编程语言&#xff0c;Java工程师也是市场需求最大的软件工程师&#xff0c;选择Java&#xff0c;就是选择了高薪。 为什么Java应用最广泛&#xff1f; 从互联网到…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP4141(SPI接口)的数字电位器Proteus仿真

一、仿真原理图: 二、运行效果: 三、软件部分: 1)、SPI读写: 2)、初始化部分: void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; /** Initializes the CPU, AHB and APB busses clocks …