Python绘图模块 turtle案例代码
作者:十八岁讨厌编程 发布时间:2022-12-16 01:28:10
turtle模块概述
Python 标准库中有个 turtle 模块,俗称海龟绘图,它提供了一些简单的绘图工具,可以在标准的应用程序窗口中绘制各种图形。
turtle 的绘图方式非常简单直观,就像一只尾巴上蘸着颜料的小海龟在电脑屏幕上爬行,随着它的移动就能画出线条来。使用海龟绘图,我们只用几行代码就能够创建出令人印象深刻的视觉效果,而且还可以跟随海龟的移动轨迹,看到每行代码是如何影响它的移动的。
这能够帮助我们更好地理解代码的逻辑。所以海龟绘图也经常用作新手学习 Python 的一种工具。
Turtle
turtle 是 Python 中自带的绘图模块,最初来自于 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 于 1967 年所创造的 Logo 编程语言。
你可以使用 turtle 控制画笔在画板上画画。而这个画笔是有形状的,默认是一个小箭头,我们可以使用 turtle.shape(‘turtle’) 将其设成一个小海龟。除了变成小海龟外,还支持传入:
‘arrow’(箭头)
‘circle’(圆)
‘circle’(圆)
‘triangle’(三角形)
‘classic’(经典)
默认状态下,我们的画笔是落在画板最中间的,并以此为原点形成了一个坐标系,单位是像素。并且我们根据“上北下南左西右东”的惯例标注四个方向。实际上这个坐标系是不显示的,但我们要知道小海龟实际上是在坐标系内移动的。
小海 * 的朝向是前方(默认朝东),我们可以调用 turtle.forward(3) 让小海龟前进 3 像素,也就是小海龟移动到了坐标系中 (3, 0) 的位置。因为我们的画笔默认是落下的,因此在移动的过程中会留下一道轨迹,即一条长 3 像素的直线。
除了前进之外,当然也有后退。调用 turtle.backward(3) 即可让小海龟向后倒退 3 像素,移动到坐标系中 (-3, 0) 的位置,同样也会留下一条长 3 像素的直线。
注意:后退后小海龟的朝向是不变的。
画笔的颜色默认是黑色的,我们可以使用 turtle.color(‘red’) 改成红色的。当然,你也可以使用 turtle.color(‘yellow’) 改成黄色,使用 turtle.color(‘pink’) 改成粉色等等。
除了使用颜色的英文外,我们还能传入 16 进制的 RGB 色值。RGB 色值能表示出 1600 多万种颜色,比如 #000000 表示黑色,#FFFFFF 表示白色,#FF0000 表示红色等。
现在我们尝试用小乌龟画一个100像素长的直线
import turtle
turtle.shape('turtle')
turtle.color('brown')
turtle.backward(100)
# turtle.forward(100)
turtle.done()
结果:
注意点:
①这个地方前进后退都可以
②画完图之后一定记得要turtle.done(),否则程序在画完之后会立即退出,你会看不到结果,造成一种闪退的假象。
让小海龟转弯
转弯其实很简单,分为左转和右转。
左转是 turtle.left()
右转是 turtle.right()
它俩的参数是角度,比如 turtle.right(90) 表示右转 90 度。同理,turtle.left(90) 表示左转 90 度。
转向后,小海龟的朝向就变了。再调用 turtle.forward() 会朝着转向后小海 * 指着的方向前进。
我们可以试着画一个正方形:
import turtle
turtle.forward(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
turtle.forward(100)
turtle.right(90)
#简化一下
import turtle
for i in range(4):
turtle.forward(100)
turtle.right(90)
结果:
turtle.left() 和 turtle.right() 每次转向都是根据当前朝向来转的,当多次转向后你可能就不知道现在朝向哪了。因此,我们还可以使用 turtle.setheading()
来直接设置朝向。turtle.setheading() 的参数也是角度,只是这个角度对应的朝向是固定的。具体对应方式如下图所示:
因此,我们可以直接调用 turtle.setheading(0) 让小海龟朝东,调用 turtle.setheading(180) 让小海龟朝西。当然,0 到 360 度之间的角度都是可以的,调用 turtle.setheading(45) 可以让小海龟朝向东北方向。
之前显示小海龟是为了方便理解朝向,现在弄清楚了朝向我们就可以将小海龟隐藏了。隐藏小海龟可以加快绘图的速度,并且最后画出的图上也不会有个小海龟影响画风。
要隐藏小海龟非常的简单,只要调用 turtle.hideturtle()
即可。当你想再次显示小海龟时,调用 turtle.showturtle()
即可。
画一颗五角星
五角星每个角的度数都是 36 度,用 180 - 36 得到对应的补角为 144 度。如下图所示:
五角星的五条线的长度是一样的,并且角度也一样。那么,我们就可以用循环来画五角星。五角星要画 5 条线,因此要循环 5 次。每次循环都除了画一条线,还要旋转特定的角度。从上图可知,每次向右旋转 144 度即可。所以画五角星的代码如下:
import turtle
turtle.color('red')
turtle.hideturtle()
for i in range(5):
turtle.forward(100)
turtle.right(144)
结果:
在这个基础上我们还可以给五角星上色。
相关方法:
①turtle.color() 会将画笔颜色和填充颜色都设置成一个
②turtle.fillcolor() 能单独设置填充颜色
③turtle.pencolor() 单独设置画笔颜色
④turtle.begin_fill() 开始填充
⑤turtle.end_fill() 结束填充
我们只要在画五角星之前调用 turtle.begin_fill(),在画完五角星之后调用 turtle.end_fill(),我们画的五角星就会被填充上我们设置好的颜色了。
import turtle
turtle.color('red')
turtle.hideturtle()
turtle.begin_fill() # 开始填充
for i in range(5):
turtle.forward(100)
turtle.right(144)
turtle.end_fill() # 结束填充
结果:
移动五角星
你可能已经发现了,这颗五角星有些“歪”,不在画板的正中间。如果我们脑补出坐标系的话,我们的五角星处于的位置其实是下面这样的:
因此,我们需要将我们的五角星先左移再上移,让五角星处于坐标系的中间,就像下面这样:
我们做不到直接移动五角星,但我们可以移动画笔的初始位置。只要将画笔的初始位置往左上方移动一点,这样我们的五角星就处于坐标系的最中间了。上图中画笔的初始位置在坐标系中大概是 (-50 ,20),我们可以调用 turtle.goto(-50, 20) 来移动画笔的位置。
turtle.goto(x, y)
将画笔移动到指定位置
第一个参数是 x 轴的坐标,第二个参数是 y 轴的坐标。
但直接移动画笔位置是有问题的,因为我们的画笔一直处于落下的状态,移动的过程中也会画出一条直线。我们可以调用 turtle.penup()
将画笔抬起,这样移动的过程中就不会画线。等需要时再调用 turtle.pendown()
将画笔落下开始绘图。
turtle.penup() 将画笔抬起
turtle.pendown() 将画笔落下
所以,将边长为 100 像素的五角星移动坐标系中央的完整代码如下:
import turtle
turtle.color('red')
turtle.hideturtle()
turtle.penup()
turtle.goto(-50, 20)
turtle.pendown()
turtle.begin_fill()
for i in range(5):
turtle.forward(100)
turtle.right(144)
turtle.end_fill()
#一闪一闪亮晶晶
我们还可以画一堆星星,实现“一闪一闪亮晶晶,满天都是小星星”的效果~✨
因为画的星星比较多,我们先把之前画五角星的代码封装成一个函数:
import turtle
def draw_star():
turtle.color('white')
turtle.hideturtle()
turtle.begin_fill()
for i in range(5):
turtle.forward(10)
turtle.right(144)
turtle.end_fill()
星星的光是白色的,因此我将颜色设置成了白色(white)。并且,因为是小星星,我将边长设成了 10 像素。画一个小星星的方法搞定了,接下来是画满天星,就画 50 个吧!满天星的位置都是随机的,我们需要用到 random 模块生成随机位置。
随机画 50 颗小星星的代码如下:
import turtle
from random import randint
def draw_star():
turtle.color('white')
turtle.hideturtle()
turtle.begin_fill()
for i in range(5):
turtle.forward(10)
turtle.right(144)
turtle.end_fill()
for i in range(50):
turtle.speed(0) # 最快速
turtle.penup()
x = randint(-150, 150) # x 轴
y = randint(-100, 100) # y 轴
turtle.goto(x, y)
turtle.pendown()
draw_star()
上述代码涉及的方法:
①turtle.speed(x)
控制绘图速度
turtle.speed(x) 的参数是 0-10 的整数,其中 1-10 数字越大,绘图速度越快。1 最慢,10 最快,默认是 6。而 0 表示没有动画效果,因此 0 比 10 的速度还要快。
②turtle.write()
在画板上写字
参数为要写的内容。我们还能设置字的字体、大小等,比如turtle.write(‘By CSDN’, font = (‘SimHei’, 12, ‘bold’)),font 参数是个元组,其中第一个是字体,第二个是字体大小,最后一个是字重。
完整代码:
import turtle
from random import randint
def draw_star():
turtle.color('black')
turtle.hideturtle()
turtle.begin_fill()
for i in range(5):
turtle.forward(10)
turtle.right(144)
turtle.end_fill()
for i in range(50):
turtle.speed(0)
turtle.penup()
x = randint(-150, 150)
y = randint(-100, 100)
turtle.goto(x, y)
turtle.pendown()
draw_star()
turtle.penup()
turtle.goto(0, -130)
turtle.pendown()
turtle.write('By CSDN', font = ('SimHei', 12, 'bold'))
结果:
来源:https://blog.csdn.net/zyb18507175502/article/details/122691308
猜你喜欢
- CSS2.1 中规定了关于 CSS 规则 Specificity(特异性)的计算方式,用一个四位的数
- 阅读上一篇:微软建议的ASP性能优化28条守则(4)技巧 13:避免重新确定数组的维数 应尽量避免 Redim 数组。就性能而言,如果计算机
- 【人工智能项目】混合高斯模型运动目标检测本次工作主要对视频中运动中的人或物的边缘背景进行检测。那么走起来瓷!!!原视频高斯算法提取工作imp
- 1下载安装1.1打开官网http://www.jetbrains.com/pycharm/download/#section=windows
- python 与 C++ dlib人脸检测结果对比,供大家参考,具体内容如下说明:由于项目需求发现Linux下c++使用dlib进行人脸检测
- 我就废话不多说了,直接上代码吧!import matplotlibmatplotlib.use('Agg')import o
- 1. 引言使用Python进行图像处理,非常快捷方便,往往简短几行代码就可以实现功能强大的效果。在这篇文章中,我们将使用Python来将图像
- 本文实例分析了Python兔子毒药问题。分享给大家供大家参考。具体分析如下:问题大致是这样的:1000瓶无色无味的液体,其中一瓶为毒药,其它
- 编这个程序是想过节过年,一些重要的纪念日,给亲戚好友发祝福之类的,但要凌晨0点才显得比较有诚意,可我又比较贪睡,常常忘了,所以就有了编个微信
- 下面先来看一个例子:import requestsresult=requests.get("http://data.1
- 有时候需要把文件中的数据放入到数组中,这里提供了一种方法,可以根据文件结尾的标记进行数据拆分,然后再把拆分的文件放入数组中# -*-codi
- 图片太大了,上百张图用photoshop改太慢,就想到用python写个简单的批处理。功能简单就是把原图按比例缩小# -*- coding:
- 在一些情况下,MySQL可以直接使用索引来满足一个 ORDER BY 或 GROUP BY 子句而无需做额外的排序。尽管 ORDER BY
- 前言今天制作的这一款能在B站能指定直播间、自动发弹幕的功能的脚本,因为没做那么多的功能,所以代码很简单,适合刚入门的同学学习先打开一个直播间
- 懒加载是一种编程范式,它推迟加载操作,直到不得不这样做。通常,当操作开销很大,需要耗费大量时间或空间时,惰性求值是首选实现。例如,在 Pyt
- 前言本文紧接着前一篇的入门教程,会介绍一些关于pandas的进阶知识。建议读者在阅读本文之前先看完pandas入门教程。同样的,本文的测试数
- 点乘import torchx = torch.tensor([[3,3],[3,3]])y = x*x #x.dot(x)z = torc
- 内置方法 说明 __init__(self,...) 初始化对象,在创建新对象时调用 __del__(self) 释放对
- 本文实例讲述了Python实现的拟合二元一次函数功能。分享给大家供大家参考,具体如下:背景:使用scipy拟合一元二次函数。参考:HYRY
- return 语句用于退出函数,向调用方返回一个表达式。执行到 return 语句时,会退出函数,return 之后的语句不再执行。如:de