Python基础图形绘制库——turtle
(1).介绍
turtle库也叫海龟库,是turtle绘图体系的Python实现。turtle库是Python语言的标准库之一,是入门级的图形绘制函数库。
turtle绘图体系:也叫海龟绘图系统,它是在1969年诞生,主要用于程序设计入门的一种绘图方式。
Python计算生态 = 标准库 + 第三方库
标准库:随解释器直接安装到操作系统中的功能模块。
第三方库:需要经过安装才能使用的功能模块。
turtle官方文档:https://docs.python.org/3/library/turtle.html
(2).原理
turtle(海龟)是真实的存在,可以想象成一只海龟在窗体正中间,由程序控制在画布上游走,走过的轨迹形成了绘制的图形,可以变换海龟的颜色和宽度等。这里海龟就是我们的画笔。
(3).turtle的绘图窗体布局
绘制turtle图形首先需要一个绘图窗体,在操作系统上表现为一个窗口,它是turtle的一个画布空间。在窗口中使用的最小单位是像素,例如要绘制一个100单位长度的直线,就是指100像素长的直线。
在一个操作系统上,将显示器的左上角坐标定义为(0,0),那么我们将窗体的左上角定义为turtle绘图窗体的坐标原点,相对于整个显示器坐标为(startx,starty)。这里可以使用turtle.setup(width,height,startx,starty)来设置启动窗体的位置和大小,当然setup()函数并不是必须的。而且在setup()函数中startx和starty参数是可选的,如果没有指定这两个参数,那么系统会默认该窗体在显示器的正中心。
参数说明:
width和height:如果是整数,则为像素大小;如果是浮点数则为屏幕的百分比。width默认为屏幕的50%,height默认为屏幕的70%。
startx和starty:如果为正,则为距屏幕左侧或顶部的像素长度;如果为负,则为举例屏幕右侧或底部的像素长度;如果为None,则水平或垂直居中。
更多窗体控制请查看turtle官方文档:https://docs.python.org/3/library/turtle.html。
(4).turtle空间坐标体系
在turtle窗体内部形成了一个空间坐标体系,包含绝对坐标和海龟坐标两种。
1)绝对坐标
对于绝对坐标来讲,turtle也就是海龟最开始出现的地方,即画布的正中心作为绝对坐标的(0,0)。海龟的运行方向向着画布的右侧,所以整个窗体的右方向为x轴,上方向为y轴,由此构成了绝对坐标系。
绝对坐标系在绘图时经常用到,与之相关的最重要的函数是turtle.goto(x,y),该函数是让任意位置的海龟到达指定位置。
2)海龟坐标
对于海龟坐标来讲,无论海龟朝向什么方向,海龟当前行进方向都叫前进方向,反方向是后退方向,左侧是左侧方向,右侧是右侧方向
与之相关的常用函数有:turtle.fd(d),前进d像素距离;turtle.bk(d),后退d像素距离,海龟方向不变;turtle.circle(r,angle),以海龟左侧为原点,半径为r像素,行进angle度圆形弧度,并且海龟方向改变angle度,如果没有angle,那么行进一个完整的圆。注意:d、r、angle允许负数,意为反方向
(5).turtle角度坐标体系
turtle建立了一个空间坐标体系,那么在空间坐标中,海龟行进的方向也有一个角度,同样分为绝对角度和海龟角度。
1)绝对角度
对于绝对角度来讲,绝对坐标的x正轴表示0度或360度,y正轴表示90度或-270度,x负轴表示180度或-180度,y负轴表示270度或-90度。
与之相关的常用函数为turtle.seth(angle),用于改变海龟行进方向,只改变方向不行进。
2)海龟角度
对于海龟角度来讲,为了更好的改变海龟的行进方向,使用左右的方式来改变它的行进角度。
与之相关的函数有:turtle.left(angle)和turtle.right(angle),分别让海龟向左或向右改变行进方向。
(6).turtle的RGB色彩体系
turtle库中采用了计算机最常见的RGB色彩体系,取值范围可以是0-255的整数,也可以是0-1的小数。
常用的RGB色彩如下:
英文名称 | RGB整数值 | RGB小数值 | 中文名称 |
white | 255,255,255 | 1,1,1 | 白色 |
yellow | 255,255,0 | 1,1,0 | 黄色 |
magenta | 255,0,255 | 1,0,1 | 洋红 |
cyan | 0,255,255 | 0,1,1 | 青色 |
blue | 0,0,255 | 0,0,1 | 蓝色 |
black | 0,0,0 | 0,0,0 | 黑色 |
seashell | 255,245,238 | 1,0.96,0.93 | 海贝色 |
gold | 255,215,0 | 1,0.84,0 | 金色 |
pink | 255,192,203 | 1,0.75,0.80 | 粉红色 |
brown | 165,42,42 | 0.65,0.16,0.16 | 棕色 |
purple | 160,32,240 | 0.63,0.13,0.94 | 紫色 |
tomato | 255,99,71 | 1,0.39,0.28 | 番茄色 |
turtle库默认采用RGB的小数值来表示颜色,当然也可以使用函数turtle.colormode(mode)来切换RGB数值模式。当mode为1.0时表示采用小数值来表现RGB,当mode为255时表示采用整数值来表现RGB。
与颜色设置相关的函数:turtle.color()、turtle.pencolor()、turtle.fillcolor(),由于设置画笔颜色和填充色;还有turtle.bgcolor(),设置窗体背景色。
(7).turtle常用函数
注意:设置参数后,如果没有取消或重新设置,那么当前程序内一直有效。
1)画笔控制函数
turtle.penup()、turtle.pu()、turtle.up():抬笔,移动时不绘图
turtle.pendown()、turtle.pd()、turtle.down():落笔,移动时绘图
turtle.pensize(width)、turtle.width(width):画笔宽度
turtle.pencolor(*args):如果不给参数,则返回当前画笔颜色,给出参数则是设定画笔颜色。设置颜色有三种方式的参数,pencolor(colorstring)、pencolor((r,g,b))和pencolor(r,g,b)
2)运动控制函数
turtle.forward(distance)、turtle.fd(distance):前进distance像素
turtle.backward(distance)、turtle.bk(distance)、turtle.back(distance):后退distance像素
turtle.circle(r,angle):以画笔(海龟)左侧为圆心,半径为r像素,画angle度的圆形。注意:海龟方向同时发生angle度变化
turtle.goto(x,y)、setpos(x,y)、setposition(x,y):由当前坐标前往指定坐标,这里使用绝对坐标,但画笔方向不会改变
3)方向控制函数
turtle.setheading(angle)、turtle.seth(angle):以绝对角度改变方向
turtle.left(angle)、turtle.lt(angle):以海龟角度向左改变方向
turtle.right(angle)、turtle.rt(angle):以海龟角度向右改变方向
4)更多
更多函数请前往官方文档查看:https://docs.python.org/3/library/turtle.html
(8).实例
1)绘制一个正方形
1 2 3 4 5 6 | import turtle turtle.pensize( 2 ) for i in range ( 4 ): turtle.fd( 150 ) turtle.left( 90 ) turtle.done() |
效果图:
2)绘制一个正六边形
1 2 3 4 5 6 | import turtle turtle.pensize( 2 ) for i in range ( 6 ): turtle.fd( 150 ) turtle.left( 60 ) turtle.done() |
效果图
3)绘制一个如图所示的风轮
1 2 3 4 5 6 7 8 | import turtle turtle.pensize( 2 ) for i in range ( 4 ): turtle.fd( 150 ) turtle.left( 90 ) turtle.circle( 150 , - 45 ) turtle.goto( 0 , 0 ) turtle.left( 45 ) |
4)绘制一个如图所示的太阳花
1 2 3 4 5 6 7 8 9 10 | from turtle import * color( 'red' , 'yellow' ) #设置画笔颜色为红色,填充色为黄色 begin_fill() #开始填充,必须与end_fill()一起使用 while True : #循环,这里是死循环,通过下方if语句控制跳出循环 forward( 200 ) #前进200像素 left( 170 ) #海龟角度,左转170度 if abs (pos()) < 1 : #abs()返回绝对值,pos()返回当前坐标点,合起来是(0,0)到当前坐标的长度,用于判断是否回到(0,0) break #跳出循环 end_fill() #结束填充,运行到这里才会填充颜色 done() #结束后停留在当前窗口 |
5)绘制一个玫瑰花
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | import turtle turtle.speed( 5 ) # 设置初始位置 turtle.penup() turtle.goto( 0 , 200 ) turtle.pendown() # 花蕊 turtle.fillcolor( "red" ) turtle.begin_fill() turtle.circle( 10 , 180 ) turtle.circle( 25 , 110 ) turtle.left( 50 ) turtle.circle( 60 , 45 ) turtle.circle( 20 , 170 ) turtle.right( 24 ) turtle.fd( 30 ) turtle.left( 10 ) turtle.circle( 30 , 110 ) turtle.fd( 20 ) turtle.left( 40 ) turtle.circle( 90 , 70 ) turtle.circle( 30 , 150 ) turtle.right( 30 ) turtle.fd( 15 ) turtle.circle( 80 , 90 ) turtle.left( 15 ) turtle.fd( 45 ) turtle.right( 165 ) turtle.fd( 20 ) turtle.left( 155 ) turtle.circle( 150 , 80 ) turtle.left( 50 ) turtle.circle( 150 , 90 ) turtle.end_fill() # 花瓣1 turtle.left( 150 ) turtle.circle( - 90 , 70 ) turtle.left( 20 ) turtle.circle( 75 , 105 ) turtle.setheading( 60 ) turtle.circle( 80 , 98 ) turtle.circle( - 90 , 40 ) # 花瓣2 turtle.left( 180 ) turtle.circle( 90 , 40 ) turtle.circle( - 80 , 98 ) turtle.setheading( - 83 ) # 叶子1 turtle.fd( 30 ) turtle.left( 90 ) turtle.fd( 25 ) turtle.left( 45 ) turtle.fillcolor( "green" ) turtle.begin_fill() turtle.circle( - 80 , 90 ) turtle.right( 90 ) turtle.circle( - 80 , 90 ) turtle.end_fill() turtle.right( 135 ) turtle.fd( 60 ) turtle.left( 180 ) turtle.fd( 85 ) turtle.left( 90 ) turtle.fd( 80 ) # 叶子2 turtle.right( 90 ) turtle.right( 45 ) turtle.fillcolor( "green" ) turtle.begin_fill() turtle.circle( 80 , 90 ) turtle.left( 90 ) turtle.circle( 80 , 90 ) turtle.end_fill() turtle.left( 135 ) turtle.fd( 60 ) turtle.left( 180 ) turtle.fd( 60 ) turtle.right( 90 ) turtle.circle( 200 , 60 ) turtle.done() |
效果图如下:
6)樱花树(大佬NB!!)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, t): time.sleep( 0.0005 ) if branch > 3 : if 8 < = branch < = 12 : if random.randint( 0 , 2 ) = = 0 : t.color( 'snow' ) # 白 else : t.color( 'lightcoral' ) # 淡珊瑚色 t.pensize(branch / 3 ) elif branch < 8 : if random.randint( 0 , 1 ) = = 0 : t.color( 'snow' ) else : t.color( 'lightcoral' ) # 淡珊瑚色 t.pensize(branch / 2 ) else : t.color( 'sienna' ) # 赭(zhě)色 t.pensize(branch / 10 ) # 6 t.forward(branch) a = 1.5 * random.random() t.right( 20 * a) b = 1.5 * random.random() Tree(branch - 10 * b, t) t.left( 40 * a) Tree(branch - 10 * b, t) t.right( 20 * a) t.up() t.backward(branch) t.down() # 掉落的花瓣 def Petal(m, t): for i in range (m): a = 200 - 400 * random.random() b = 10 - 20 * random.random() t.up() t.forward(b) t.left( 90 ) t.forward(a) t.down() t.color( 'lightcoral' ) # 淡珊瑚色 t.circle( 1 ) t.up() t.backward(a) t.right( 90 ) t.backward(b) # 绘图区域 t = T.Turtle() # 画布大小 w = T.Screen() t.hideturtle() # 隐藏画笔 t.getscreen().tracer( 5 , 0 ) w.screensize(bg = 'wheat' ) # wheat小麦 t.left( 90 ) t.up() t.backward( 150 ) t.down() t.color( 'sienna' ) # 画樱花的躯干 Tree( 60 , t) # 掉落的花瓣 Petal( 200 , t) w.exitonclick() |
效果图如下:
参考:https://www.cnblogs.com/chen0307/articles/9645138.html
https://blog.csdn.net/as_csdn/article/details/93086075
https://blog.csdn.net/weixin_43943977/article/details/102691392
https://blog.csdn.net/sandalphon4869/article/details/99443949
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性