turtle 是 python 内置的一个比较有趣味的模块,俗称 海龟绘图,它是基于 tkinter 模块打造,提供一些简单的绘图工具,海龟作图最初源自 20 世纪 60 年代的 Logo 编程语言,之后一些很酷的 Python 程序员构建了 turtle 库,让其他程序员只需要 import turtle,就可以在 Python 中使用海龟作图。
原文链接|海龟绘图简易教程
1. 基本功能介绍
在海龟作图中,我们可以编写指令让一个虚拟的(想象中的)海龟在屏幕上来回移动。这个海龟带着一只钢笔,我们可以让海龟无论移动到哪都使用这只钢笔来绘制线条。通过编写代码,以各种很酷的模式移动海龟,我们可以绘制出令人惊奇的图片。使用海龟作图,我们不仅能够只用几行代码就创建出令人印象深刻的视觉效果,而且还可以跟随海龟看看每行代码如何影响到它的移动。这能够帮助我们理解代码的逻辑。所以海龟作图也常被用作新手学习 Python 的一种方式。
1.1 Turtle motion (运动控制)
本节中包含了 运动控制 中常用的一些函数
turtle.goto(x,y)
画笔定位到坐标(x,y)
turtle.forward(distance)
向正方向运动 distance 长的距离
turtle.backward(distance)
向负方向运动 distance 长的距离
turtle.right(angle)
向右偏 angle 度
turtle.left(angle)
向左偏 angle 度
turtle.home()
回到原点
turtle.circle(radius, extent=None, steps=None)
画圆形 radius 为半径,extent 为圆的角度
turtle.speed(speed)
以 speed 速度运动
看到这么多函数肯定已经头大了,我们以例题来讲解。
首先画一个边长为100的正方形,然后再以半径为50画出其3/4圆。
# 控制画笔的速度turtle.speed(5)# 将画笔定位到原点turtle.goto(0,0)# 从原点开始,画出一个边长为100的正方形for i in range(4):# 正向运动 100 的距离turtle.forward(100)# 向右偏 90 度turtle.right(90)# 将画笔定位到原点turtle.home()# 画出一个半径为100,占3/4的圆turtle.circle(50,270)
最后得到以下结果:
1.2 Pen control (画笔控制)
本节包含了对画笔的控制函数,常用的如下:
turtle.pendown()
落笔,在此状态下会画出运动的轨迹
turtle.penup()
起笔,在此状态下不会画出运动的轨迹
turtle.pensize(width=None
画笔粗细
turtle.pencolor(*args)
画笔颜色
turtle.fillcolor(*args)
填充颜色
turtle.begin_fill()
开始填充
turtle.end_fill()
结束填充
turtle.write(arg, move=False, align=”left”, font=(“Arial”, 8, “normal”))
写文字
同样,我们以一个例题来讲解。
画一个正方形并填充,最后写一些文字
# 控制画笔颜色turtle.pencolor('red')# 落笔turtle.pendown()# 设置填充颜色turtle.fillcolor('blue')# 开始填充turtle.begin_fill()# 从原点开始,画出一个边长为100的正方形for i in range(4):# 正向运动 100 的距离turtle.forward(200)# 向右偏 90 度turtle.right(90)# 结束填充turtle.end_fill()turtle.penup()turtle.goto(100,-100)turtle.write('Crossin编程教室')
最后的结果是这样
同时,我们还可以设置画笔打粗细、画笔的速度等属性,
1.3 Window control (视窗控制)
这里有两个常用的函数
turtle.bgcolor(*args)
设置背景颜色
turtle.bgpic(picname=None)
背景图片填充
设置代码如下
turtle.bgcolor('red')turtle.bgpic(r'yourpic.png')
2. 海龟绘图实例
我们用几个简单的例子讲解海龟绘图的用法。
2.1 用正方形画圆
import turtlefor i in range(360):turtle.setheading(i)for i in range(4):turtle.forward(100)turtle.left(90)
360 个正方形每隔 1 度排列,短短几行代码可以生成一个漂亮规则的图形。
2.2 红色的五角星
使用填充功能画出一个大红星
import turtleturtle.color('red','red')turtle.begin_fill()for i in range(5):turtle.forward(100)turtle.right(144)turtle.end_fill()
结果如图:
2.3练习题
讲的再多也不如自己动手做一做,我们在网上挑选了几张使用 turtle 做的有意思的图片,自己动手试试吧
彩蛋
# coding=utf-8import turtlefrom datetime import *# 抬起画笔,向前运动一段距离放下def Skip(step):turtle.penup()turtle.forward(step)turtle.pendown()def mkHand(name, length):# 注册Turtle形状,建立表针Turtleturtle.reset()Skip(-length * 0.1)# 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。turtle.begin_poly()turtle.forward(length * 1.1)# 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。turtle.end_poly()# 返回最后记录的多边形。handForm = turtle.get_poly()turtle.register_shape(name, handForm)def Init():global secHand, minHand, hurHand, printer# 重置Turtle指向北turtle.mode("logo")# 建立三个表针Turtle并初始化mkHand("secHand", 135)mkHand("minHand", 125)mkHand("hurHand", 90)secHand = turtle.Turtle()secHand.shape("secHand")minHand = turtle.Turtle()minHand.shape("minHand")hurHand = turtle.Turtle()hurHand.shape("hurHand")for hand in secHand, minHand, hurHand:hand.shapesize(1, 1, 3)hand.speed(0)# 建立输出文字Turtleprinter = turtle.Turtle()# 隐藏画笔的turtle形状printer.hideturtle()printer.penup()def SetupClock(radius):# 建立表的外框turtle.reset()turtle.pensize(7)for i in range(60):Skip(radius)if i % 5 == 0:turtle.forward(20)Skip(-radius - 20)Skip(radius + 20)if i == 0:turtle.write(int(12), align="center", font=("Courier", 14, "bold"))elif i == 30:Skip(25)turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))Skip(-25)elif (i == 25 or i == 35):Skip(20)turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))Skip(-20)else:turtle.write(int(i/5), align="center", font=("Courier", 14, "bold"))Skip(-radius - 20)else:turtle.dot(5)Skip(-radius)turtle.right(6)def Week(t): week = ["星期一", "星期二", "星期三","星期四", "星期五", "星期六", "星期日"]return week[t.weekday()]def Date(t):y = t.yearm = t.monthd = t.dayreturn "%s %d%d" % (y, m, d)def Tick():# 绘制表针的动态显示t = datetime.today()second = t.second + t.microsecond * 0.000001minute = t.minute + second / 60.0hour = t.hour + minute / 60.0secHand.setheading(6 * second)minHand.setheading(6 * minute)hurHand.setheading(30 * hour)turtle.tracer(False) printer.forward(65)printer.write(Week(t), align="center",font=("Courier", 14, "bold"))printer.back(130)printer.write(Date(t), align="center",font=("Courier", 14, "bold"))printer.home()turtle.tracer(True)# 100ms后继续调用tickturtle.ontimer(Tick, 100)def main():# 打开/关闭龟动画,并为更新图纸设置延迟。turtle.tracer(False)Init()SetupClock(160)turtle.tracer(True)Tick()turtle.mainloop()if __name__ == "__main__":main()
如果觉得《海龟绘图简易教程|Turtle for Python》对你有帮助,请点赞、收藏,并留下你的观点哦!