绘图库turtle及其应用

news2024/12/23 22:46:59

一、排雷避坑

1. no attribute ‘pensize’

① 文件命名避免使用库/模块的名字为名,会报错。
例如:当使用matplotlib库时,将文件名命名为matplotlib.py,会报错

ModuleNotFoundError: No module named ‘matplotlib.pyplot’; ‘matplotlib’ is not a package

使用turtle库时,文件名命名为turtle.py,会报错

AttributeError: module ‘turtle’ has no attribute ‘pensize’

因为文件的名字命名为turtle了,导入turtle的时候 其实导入的是自己。

2. Cannot find reference

② File → Settings → Editor → Inspections → python → 取消勾选 ☐Unresolved references → OK (不操作也不影响运行结果,只是不太好看🤭🤭)
在这里插入图片描述

Cannot find reference ‘forward’ in ‘turtle.py’ less… (Ctrl+F1)
Inspection info: This inspection detects names that should resolve but don’t. Due to dynamic dispatch and duck typing, this is possible in a limited but useful number of cases. Top-level and class-level items are supported better than instance items.

3. no attribute ‘screen’

③ AttributeError: module ‘turtle’ has no attribute ‘screen’
错误的代码:

import time
import turtle as t

t.screen.title('test')
t.screen.bgcolor('yellow')
t.done()

AttributeError: module ‘turtle’ has no attribute ‘screen’

正常运行的代码:

import time
import turtle

t = turtle.Pen()  # 创建一个 Pen 对象
t.screen.title('test')  # 通过 Pen 对象访问 screen 属性
t.screen.bgcolor('yellow')  # 通过 Pen 对象访问 screen 属性
turtle.done()

原因分析:
第一段代码中将整个 turtle 模块重命名为 t。但是,turtle 模块并没有直接公开 screen 属性,因此试图直接使用 t.screen 会导致错误。
在第二段代码中,首先导入了 turtle 模块,然后创建了一个 Pen 对象 t。Pen 对象有一个 screen 属性,这样就可以通过 t.screen 来访问 screen。
解决方法:
想使用 t 作为别名,并且想要访问 screen,可以使用 t.Screen() 来创建一个屏幕对象,然后就可以直接使用这个对象来设置标题和背景颜色。这样就避免了直接通过 t 模块访问 screen 的问题:

import time
import turtle as t

screen = t.Screen() # 创建一个屏幕对象
screen.title('test')
screen.bgcolor('yellow')
t.done()

二、基本语法

属性 { 方向 位置 画笔 属性\begin{cases} 方向\\ 位置\\ 画笔\\ \end{cases} 属性 方向位置画笔

在这里插入图片描述

三、简单绘图

1. 方形

方法一:线段×4
在这里插入图片描述

import turtle as t
# 绘制线段 重复×4
t.forward(100) # 前移100, 左到右
t.left(90)     # 左转90°(逆时针), 下到上
t.forward(100) 
t.left(90)
t.forward(100)
t.left(90)
t.forward(100)
t.left(90)
t.done() #加了这句,画完之后窗口就不会关闭了

方法二:circle(r,360,steps=4)

在这里插入图片描述

import turtle as t
t.rt(45) # 右转45°(顺时针)
t.circle(100,360,steps=4) # 绘制边长为100的四边形
t.done() #加了这句,画完之后窗口就不会关闭了
import turtle
t=turtle.Pen() # 另一种写法
t.rt(45) # 右转45°(顺时针)
t.circle(100,360,steps=4) # 绘制边长为100的四边形
turtle.done() # t=turtle.Pen() - turtle.done()

2. 星形

五角星/五芒星 内角和为180°,五个角,所以一个角180°/5=36°,等价于绘制时一条线段到另一条线段交界处要旋转角度180°-36°=144°

在这里插入图片描述

import turtle as t
# 画一个五角星 180-144=36 36*5=180
for x in range(1,6):
    t.forward(100)
    t.left(144)
t.done()

类似地,绘制turtle star
n角星(n为奇数且n≥3,n=3 三角形) 内角和180° | 每个角=180°/n | 画笔旋转角度180°-180°/n
在这里插入图片描述

import turtle as t
# 画一个turtle star n角星
n = 17 # n为奇数 (偶数不适用, 若偶数可能需重新起笔)
for x in range(1,1+n):
    t.forward(100)
    t.left(180-180/n)
t.done()

画笔旋转角度angle:
a n g l e = 180 − 内角 = 180 − 内角和 n = { 180 × ( n − 1 ) n ( n 为奇数 ) 180 × ( n − 2 ) n ( n 为偶数 ) angle=180-内角=180-\frac{内角和}{n}=\begin{cases} \frac{180×(n-1)}{n} (n为奇数)\\ \frac{180×(n-2)}{n}(n为偶数)\\ \end{cases} angle=180内角=180n内角和={n180×(n1)(n为奇数)n180×(n2)(n为偶数)

在这里插入图片描述
另一种星星 ——————

胖星星

import turtle as t
for x in range(5):
    t.forward(50)
    t.left(36)
    t.forward(50)
    t.right(108)
t.hideturtle()  # 隐藏海龟
t.done()

在这里插入图片描述

import turtle as t
for x in range(5):
    t.forward(50) # 边长50
    t.left(72) # (180-36)/2=72
    t.forward(50)
    t.right(144) # 180-36=144
t.hideturtle() # 隐藏海龟
t.done()

在这里插入图片描述

import turtle as t
# 画一个六角星
for x in range(6):
    t.forward(50)  # 画出边
    t.left(60)      # 每个角度是60度
    t.forward(50)  # 画出边
    t.right(120)    # 转向120度
t.hideturtle()
t.done()

另一种 ————
在这里插入图片描述

import turtle as t
n=7
for x in range(n):
    t.forward(100)  # 画出边
    t.left((180-180/n)/2)   # 每个角度是51.43度
    t.forward(100)  # 画出边
    t.right((180-180/n)*3/2) # 转向128.57度
t.hideturtle()  # 隐藏海龟
t.done()

在这里插入图片描述

import turtle as t
n=9 # n为奇数
for x in range(n):
    t.forward(100)  # 画出边
    t.left((180-180/n)/2)   
    t.forward(100)  # 画出边
    t.right((180-180/n)*3/2) 
t.hideturtle()  # 隐藏海龟
t.done()

在这里插入图片描述


在这里插入图片描述

import turtle as t
angle = 120
while True:
    t.forward(50)
    t.left(angle)
    if abs(t.pos()) < 1:
        break
t.ht()
t.done()

在这里插入图片描述

from turtle import *
color('red', 'yellow')
begin_fill()
while True:
    forward(100)
    left(170) # n=36
    if abs(pos()) < 1:
        break
end_fill()
ht()
done()

3. 圆形

circle()

import turtle as t
t.circle(50)   # 绘制圆形
t.circle(-50) # 绘制圆形
t.up()          # 起笔
t.forward(100)
t.down()        # 落笔
t.circle(50)   # 绘制圆形
t.circle(-50) # 绘制圆形
t.hideturtle()
t.done()

---- 改变参数steps绘制多边形

"""
画圆      cicrle(r,extend,steps=None)
画三角形 circle(r,extend,steps=3)
画四边形 circle(r,extend,steps=4)
画n边形  circle(r,extend,steps=n) n为正整数
"""
import turtle as t
t.circle(50, steps=3)   # 绘制三角形
t.circle(-50, steps=5) # 绘制正五边形
t.up()          # 起笔
t.forward(100)
t.down()        # 落笔
t.circle(50, steps=4)   # 绘制正方形
t.circle(-50, steps=8) # 绘制正八边形
t.hideturtle()
t.done()

---- 改变参数extend绘制弧形
在这里插入图片描述

import turtle as t
t.circle(50, 180)
t.hideturtle()
t.done()

在这里插入图片描述

import turtle as t
step=5 # 每次增加距离
for r in range(10, 90, step):
    t.circle(r,90+r*2)     # 绘制圆
    t.penup()               # 起笔
    t.home()                # 回到原点
    t.pendown()           # 落笔
t.hideturtle()
t.done()

------- 画同心圆
在这里插入图片描述

import turtle as t
step=10     # 每次增加距离
for r in range(10,50,step):
    t.circle(r)          # 绘圆
    t.up()               # 起笔
    t.right(90) # 顺时针90°, 方向由原先的向右转为向下
    t.forward(step)  # 移动海龟位置起绘点
    t.right(270)      # 方向向右
    t.down()      # 将笔放下准备绘制
t.hideturtle()
t.done()

在这里插入图片描述

import turtle as t
step = 10  # 每次增加距离
colors = ['red','orange','yellow','green','cyan','blue','purple']
twidth = 0 # 初始宽度
for r in range(1,8):
    t.color(colors[r%7-1])
    twidth+=0.5        # 宽度
    t.width(twidth)
    t.circle(r*step)      # 绘圆
    t.up()                 # 起笔
    t.right(90)
    t.forward(step)
    t.right(270)
    t.down()             # 落笔
t.hideturtle()
t.done()

angle=60angle=30
import turtle as t
t.color('pink')
twidth = 0 # 初始宽度
angle = 30 # 旋转角度
for angle in range(0,360,angle):
    t.seth(angle) # 调整海龟的方向 setheading()
    t.circle(25)
t.hideturtle()
t.done()

----填充色 每隔3s时间更改填充区间颜色,达到颜色区间动画设计(红绿灯😄)。

在这里插入图片描述

import time
import turtle as t
colors=['red','yellow','green']
t.speed(10)
for i in range(0,30):
    t.color('white',colors[i%3])
    t.begin_fill()
    t.circle(50)
    t.end_fill()
    time.sleep(3)
t.ht()
t.done()

4. 心形

在这里插入图片描述

from turtle import *
color("red")
begin_fill()
left(45)
forward(100)
circle(50,180)
right(90)
circle(50,180)
forward(100)
end_fill()
hideturtle()
done()

5. 螺旋

方形螺旋
在这里插入图片描述

import turtle as t
for x in range(1,100):
    t.forward(x) # 海龟向前绘线移动x
    t.right(90)  # 海龟方向向右转90°
t.hideturtle()
t.done()

在这里插入图片描述

import turtle as t
for x in range(1,100):
    t.forward(x) # 海龟向前绘线移动x
    t.right(91)   # 海龟方向向右转91°
t.hideturtle()
t.done()

在这里插入图片描述

import turtle as t
for x in range(1,37):
    t.forward(50) # 海龟向前绘线移动100
    t.left(90)  # 海龟方向向左转90°
    t.forward(50)
    t.left(90)
    t.forward(50)
    t.left(90)
    t.forward(50)
    t.left(100)
t.hideturtle()
t.done()

或者

import turtle as t
for _ in range(36):
    for _ in range(4):
        t.forward(50)  # 向前绘线移动50
        t.left(90)  # 方向向左转90°
    t.left(10)  # 转动10°以绘制下一个正方形
t.hideturtle()
t.done()

上色
在这里插入图片描述

import turtle as t
for i in range(36):
    for _ in range(4):
        t.color(0.5, 1, i/36)  # 色彩调整
        t.forward(50)  # 向前绘线移动50
        t.left(90)  # 方向向左转90°
    t.left(10)  # 转动10°以绘制下一个正方形
t.hideturtle()
t.done()

四、窗口设置

在这里插入图片描述

import time
import turtle as t
screen = t.Screen() # 创建一个屏幕
screen.title('test')    # 标题
#screen.bgcolor('yellow') # 背景色
screen.bgpic('q.gif')
print("窗口width=", screen.window_width())# 获取窗口宽度 窗口width= 768
print("窗口height=", screen.window_height())# 获取窗口高度 窗口height= 648
time.sleep(3)
screen.setup(600,480) # 重设窗口大小
print("窗口width=", screen.window_width())# 获取窗口宽度 窗口width= 600
print("窗口height=", screen.window_height())# 获取窗口高度 窗口height= 480

t.left(45)
t.forward(50)
print(t.pos()) # (35.36,35.36)
screen.setworldcoordinates(0,0,100,100) # 重设世界坐标 (左上, 右下)
print(t.pos()) # (0.00,0.00)
t.left(45) 
t.forward(50)
print(t.pos()) #(35.36,35.36)

t.write('测试test',align="center",font=('segeo script',24)) # 绘制文字
t.done()

五、海龟显隐

t.clearstamps()clearstamps(1)clearstamps(-1)
import turtle as t
t.color('green')
t.shape('turtle') # 显示海龟形状
for angle in range(0,361,60):
    t.forward(50)
    t.stamp() # 海龟章
    t.home()  # 回到原点
    t.seth(angle)
    #t.clearstamps(None) # 清除海龟章
t.clearstamps(-1)  # 清除倒数第一只海龟
#t.clearstamps(1)  # 清除第一只海龟
#t.clearstamps()  # 清除所有海龟
#t.clearstamps(None)  # 清除所有海龟
t.ht() # 隐藏海龟 hideturtle
#t.st() # 显示海龟 showturtle
t.done()

使用了ht(),那么isvisible()为False,否则为True
clearstamps()或者clearstamps(None)清除所有海龟,除了作为shape的那一只

在这里插入图片描述

import time
import turtle as t
t.color('green')
t.shape('turtle')
firstStamp=t.stamp()        # 盖章第1只海龟
t.forward(100)
secondStamp=t.stamp()    # 盖章第2只海龟
t.forward(100)
thirdStamp=t.stamp()      # 盖章第3只海龟
time.sleep(3)
t.clearstamp(secondStamp) # 清除第2只海龟
time.sleep(3)
t.clearstamps(None)           # 清除所有海龟(除了作为shape的那一只)
t.hideturtle()                     # 隐藏目前海龟
print(t.isvisible()) # False
t.done()

screen.getshapes() 方法可以列出所有的海龟光标

在这里插入图片描述

import turtle as t
screen = t.Screen() # 创建一个屏幕
t.color('green')
print(screen.getshapes())
for cursor in screen.getshapes():
    t.shape(cursor)            # 更改海龟光标
    t.stamp()                  # 海龟游标盖章
    t.up()
    t.forward(30)
    t.down()
t.done()

六、图形交互

鼠标点击,输出x y

import turtle as t
screen = t.Screen() # 创建一个屏幕
def printStr(x,y):
    print(x,y)
screen.onclick(printStr) # 输出x y
screen.mainloop() # screen.mainloop()在最后一行,让程序不结束

在这里插入图片描述

import turtle as t
screen = t.Screen() # 创建一个屏幕
def drawCircle(x,y):
    if x>0:
        t.fillcolor('yellow')
    else:
        t.fillcolor('blue')
    t.up()
    t.setpos(x,y-50)
    t.begin_fill()
    t.circle(50)
    t.end_fill()
t.ht()
screen.onclick(drawCircle) # 绘制圆形
screen.mainloop() # screen.mainloop()在最后一行,让程序不结束

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

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

相关文章

vue 的属性绑定

双大括号不能在 HTML attributes 中使用。想要响应式地绑定一个 attribute&#xff0c;应该使用 v-bind 指令。 <template> <div v-bind:class"boxClass" v-bind:id"boxId"> </div> </template><script> export default{da…

SameFileMarker:重复文件标记工具

使用智能手机时&#xff0c;因为顾虑存储空间不够&#xff0c;都会定期把占用大量空间的照片视频备份到电脑&#xff0c;但每次备份到电脑的照片&#xff0c;总有一些想随时查看的照片不舍得从手机删掉&#xff0c;于是这些照片在下次手动备份时又会被再次备份。 为了应对这种情…

21.数据结构与算法-遍历二叉树/三种遍历算法/递归遍历/非递归遍历/建立,复制二叉树/求二叉树的深度,节点个数,叶子节点个数

遍历二叉树 遍历方法 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 例题 根据遍历顺序确定二叉树 遍历的算法实现-先序遍历 遍历算法实现-中序遍历 遍历的算法实现-后序遍历 三种算法分析 遍历二叉树的非递归算法-中序遍历 二叉树的层次遍历 建立二叉树 复制二叉树 计算二叉树…

【Linux-SSH远程窗口回传】使用X11或Wayland进行SSH窗口转发

前言 我们通常在进行远程配置板端的时候往往会出现一个问题&#xff0c;在不连接显示屏或者启用VNC服务的前提下(或者使用其他软件提供的功能)&#xff0c;我们无法在远程终端看到板端的新窗口。 例如下图是一个通过远程SSH连接后企图在终端进行OpenCV窗口显示的代码报错 错误…

5.toString()、构造方法、垃圾回收、静态变量与静态方法、单例设计模式、内部类

文章目录 一、toString()1. 优缺点2. 使用方法举例① Dos类里更省事的方法 ② Application里 二、构造方法1. 导入2. 什么是构造方法3. 怎么写构造方法① 无参的构造方法(无参构造器)② 有参的构造方法(有参构造器)③ 注意 4. 构造方法的重载 三、再探this1. 给成员变量用2. 给…

基于ssm的教务管理系统的设计与实现

文未可获取一份本项目的java源码和数据库参考。 在高等院校的教学科研活动中&#xff0c;最重要的部门是学校的教务管理部门。教务管理工作是现代高等院校培养人才的核心工作。高校教务工作具有一个很明显的特征&#xff0c;就是围绕着学生为中心&#xff0c;以学生作为管理对…

ROS2-Jazzy(一):让小乌龟跑起来

配置ROS2 ros为了使一个系统中可以存在多个不同版本的ros&#xff0c;将ros的配置指令写成了脚本&#xff0c;要用ros前根据自己所需要执行对应的脚本 source /opt/ros/jazzy/setup.zsh如果你只用一个版本的ros&#xff0c;可以将执行脚本的指令写到对应shell的配置文件里&am…

STM32 ADC学习日记

STM32 ADC学习日记 1. ADC简介 ADC 即模拟数字转换器&#xff0c;英文详称 Analog-to-digital converter&#xff0c;可以将外部的模拟信号转换为数字信号。 STM32F103 系列芯片拥有 3 个 ADC&#xff08;C8T6 只有 2 个&#xff09;&#xff0c;这些 ADC 可以独立使用&…

10.9 Qt事件处理机制

键盘按键调整label移动 #include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QKeyEvent>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);}Widget::~Widget() {delete ui;…

解决新版Android studio不能连接手机的问题

我要说的是一个特例&#xff0c;装了22年的版本AS可以正常连接手机&#xff0c;装了23年以后新版本&#xff0c;AS不能正常连接手机了&#xff0c;但是在CMD控制台可以正常的执行adb命令&#xff0c;并且CMD和AS都是指向D:\android_sdk\platform-tools\adb.exe 一、 为什么会出…

【万字长文】Word2Vec计算详解(二)Skip-gram模型

【万字长文】Word2Vec计算详解&#xff08;二&#xff09;Skip-gram模型 写在前面 本篇介绍Word2Vec中的第二个模型Skip-gram模型 【万字长文】Word2Vec计算详解&#xff08;一&#xff09;CBOW模型 markdown行 9000 【万字长文】Word2Vec计算详解&#xff08;二&#xff09;S…

HCIA——one

推荐电影&#xff1a;《模仿游戏》《黑客帝国》《头号玩家》 图灵机每秒五千次计算&#xff0c;当今计算机4080ti算力每秒21万亿次的计算。 OSI七层模型 应用层&#xff1a;人机交互&#xff0c;将抽象语言转换成编码 表示层&#xff1a;将编码转换成二进制 介质访问控制层…

Vue3 + TypeScript + Vite + Echarts + DataV

Vue3 TypeScript Vite Echarts DataV 官网&#xff1a; datav datav-vue3 1、创建工程 npm create vitelatestcd datav-app npm install npm run dev2、安装项目依赖模块 npm install types/node --save-devnpm install vue-router4npm install animate.css --save npm i…

【093】基于SpringBoot+Vue实现的精品水果线上销售系统

系统介绍 视频演示 基于SpringBootVue实现的精品水果线上销售系统&#xff08;有文档&#xff09; 基于SpringBootVue实现的精品水果线上销售系统采用前后端分离的架构方式&#xff0c;系统设计了管理员、商家、用户三种角色&#xff0c;实现了公告类型管理、商家信誉类型管理…

网络编程(16)——asio多线程模型IOServicePool

目录 十六、day16 1. 什么是多线程&#xff1f; 2. IOServicePool实现 3. 服务器修改 4. 客户端修改 5. 总结 1. boost::asio::io_context::work的作用&#xff1f; 十六、day16 在之前的设计中&#xff0c;我们对 ASIO 的使用都是采用单线程模式。为了提升网络 I/O 并…

基于多能互补的热电联供型微网优化运行【matlab代码】

目录 1 主要内容 多能互补模型 算例分析 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序基本复现《基于多能互补的热电联供型微网优化运行》&#xff0c;在需求侧对负荷类型进行分类&#xff0c;利用电负荷的弹性和系统供热方式的多样性&#xff0c;构建含电负荷时…

常见的图像处理算法:中值滤波----median filter

一、中值滤波是什么 中值滤波法是一种非线性平滑技术&#xff0c;可用于消除孤立的噪声点。中值滤波在滤除噪声的同时&#xff0c;能够保护信号的边缘&#xff0c;使之不被模糊&#xff0c;这些特性是线性滤波方法所不具有的。 二、中值滤波的原理 中值滤波是将每一像素点的灰度…

数据结构进阶:二叉搜索树_C++

目录 前言&#xff1a; 一、二叉搜索树 1.1二叉搜索树概念 2.2 二叉搜索树操作 1. 二叉搜索树的插入 1.1、插入过程 1.2、代码实现 2、二叉树的删除 2.1、结点删除情况 2.2、替换删除法 1、替换思路 2、代码实现&#xff1a; 3、二叉搜索树的查找 3.1、查找规则 …

LLM - 配置 GraphRAG + Ollama 服务 构建 中文知识图谱

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142795151 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 GraphR…

基于springboot的公司财务管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的公司财务管理系统拥有两种角色 管理员&#xff1a;员工管理、部门管理、工资管理、资产管理、经营管理、利润管理等 员工&#xff1a;查看工资、查看公告、登录注册 1.…