海龟绘图简易教程|Turtle for Python

turtle 是 python 内置的一个比较有趣味的模块,俗称 海龟绘图,它是基于 tkinter 模块打造,提供一些简单的绘图工具,海龟作图最初源自 20 世纪 60 年代的 Logo 编程语言,之后一些很酷的 Python 程序员构建了 turtle 库,让其他程序员只需要 import turtle,就可以在 Python 中使用海龟作图。

原文链接|海龟绘图简易教程

1. 基本功能介绍

在海龟作图中,我们可以编写指令让一个虚拟的(想象中的)海龟在屏幕上来回移动。这个海龟带着一只钢笔,我们可以让海龟无论移动到哪都使用这只钢笔来绘制线条。通过编写代码,以各种很酷的模式移动海龟,我们可以绘制出令人惊奇的图片。使用海龟作图,我们不仅能够只用几行代码就创建出令人印象深刻的视觉效果,而且还可以跟随海龟看看每行代码如何影响到它的移动。这能够帮助我们理解代码的逻辑。所以海龟作图也常被用作新手学习 Python 的一种方式。

1.1 Turtle motion 运动控制)

本节中包含了 运动控制 中常用的一些函数

turtle.gotox,y)

画笔定位到坐标x,y)

turtle.forwarddistance)
向正方向运动 distance 长的距离

turtle.backwarddistance)
向负方向运动 distance 长的距离

turtle.rightangle)
向右偏 angle 度

turtle.leftangle)
向左偏 angle 度

turtle.home)
回到原点

turtle.circleradius, extent=None, steps=None)
画圆形 radius 为半径,extent 为圆的角度

turtle.speedspeed)
以 speed 速度运动

看到这么多函数肯定已经头大了,我们以例题来讲解。
首先画一个边长为100的正方形,然后再以半径为50画出其3/4圆。

# 控制画笔的速度
turtle.speed5)
# 将画笔定位到原点
turtle.goto0,0)
# 从原点开始,画出一个边长为100的正方形
for i in range4):
    # 正向运动 100 的距离
    turtle.forward100)
    # 向右偏 90 度
    turtle.right90)

# 将画笔定位到原点
turtle.home)
# 画出一个半径为100,占3/4的圆
turtle.circle50,270)

最后得到以下结果:

这里写图片描述这里写图片描述

1.2 Pen control 画笔控制)

本节包含了对画笔的控制函数,常用的如下:

turtle.pendown)
落笔,在此状态下会画出运动的轨迹
turtle.penup)
起笔,在此状态下不会画出运动的轨迹
turtle.pensizewidth=None
画笔粗细
turtle.pencolor*args)
画笔颜色
turtle.fillcolor*args)
填充颜色
turtle.begin_fill)
开始填充
turtle.end_fill)
结束填充
turtle.writearg, move=False, align=”left”, font=“Arial”, 8, “normal”))
写文字

同样,我们以一个例题来讲解。
画一个正方形并填充,最后写一些文字

# 控制画笔颜色
turtle.pencolor'red')
# 落笔
turtle.pendown)
# 设置填充颜色
turtle.fillcolor'blue')
# 开始填充
turtle.begin_fill)
# 从原点开始,画出一个边长为100的正方形
for i in range4):
    # 正向运动 100 的距离
    turtle.forward200)
    # 向右偏 90 度
    turtle.right90)
# 结束填充
turtle.end_fill)
turtle.penup)
turtle.goto100,-100)
turtle.write'Crossin编程教室')

最后的结果是这样
这里写图片描述这里写图片描述

同时,我们还可以设置画笔打粗细、画笔的速度等属性,

1.3 Window control 视窗控制)

这里有两个常用的函数

turtle.bgcolor*args)
设置背景颜色
turtle.bgpicpicname=None)
背景图片填充
设置代码如下

turtle.bgcolor'red')
turtle.bgpicr'yourpic.png')

2. 海龟绘图实例

我们用几个简单的例子讲解海龟绘图的用法。

2.1 用正方形画圆

import turtle
for i in range360):
    turtle.setheadingi)
    for i in range4):
        turtle.forward100)
        turtle.left90)

360 个正方形每隔 1 度排列,短短几行代码可以生成一个漂亮规则的图形。

这里写图片描述这里写图片描述

2.2 红色的五角星

使用填充功能画出一个大红星

import turtle
turtle.color'red','red')
turtle.begin_fill)
for i in range5):
    turtle.forward100)
    turtle.right144)
turtle.end_fill)

结果如图:

这里写图片描述这里写图片描述

2.3练习题

讲的再多也不如自己动手做一做,我们在网上挑选了几张使用 turtle 做的有意思的图片,自己动手试试吧

这里写图片描述这里写图片描述

这里写图片描述这里写图片描述

这里写图片描述这里写图片描述

这里写图片描述这里写图片描述

这里写图片描述这里写图片描述

这里写图片描述这里写图片描述

彩蛋

# coding=utf-8
import turtle
from datetime import *
# 抬起画笔,向前运动一段距离放下
def Skipstep):
turtle.penup)
turtle.forwardstep)
turtle.pendown)
def mkHandname, length):
# 注册Turtle形状,建立表针Turtle
turtle.reset)
Skip-length * 0.1)
# 开始记录多边形的顶点。当前的乌龟位置是多边形的第一个顶点。
turtle.begin_poly)
turtle.forwardlength * 1.1)
# 停止记录多边形的顶点。当前的乌龟位置是多边形的最后一个顶点。将与第一个顶点相连。
turtle.end_poly)
# 返回最后记录的多边形。
handForm = turtle.get_poly)
turtle.register_shapename, 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.shapesize1, 1, 3)
hand.speed0)
# 建立输出文字Turtle
printer = turtle.Turtle)
# 隐藏画笔的turtle形状
printer.hideturtle)
printer.penup)
def SetupClockradius):
# 建立表的外框
turtle.reset)
turtle.pensize7)
for i in range60):
Skipradius)
if i % 5 == 0:
turtle.forward20)
Skip-radius - 20)
Skipradius + 20)
if i == 0:
turtle.writeint12), align="center", font="Courier", 14, "bold"))
elif i == 30:
Skip25)
turtle.writeinti/5), align="center", font="Courier", 14, "bold"))
Skip-25)
elif i == 25 or i == 35):
Skip20)
turtle.writeinti/5), align="center", font="Courier", 14, "bold"))
Skip-20)
else:
turtle.writeinti/5), align="center", font="Courier", 14, "bold"))
Skip-radius - 20)
else:
turtle.dot5)
Skip-radius)
turtle.right6)
def Weekt):   
week = ["星期一", "星期二", "星期三",
"星期四", "星期五", "星期六", "星期日"]
return week[t.weekday)]
def Datet):
y = t.year
m = t.month
d = t.day
return "%s %d%d" % y, m, d)
def Tick):
# 绘制表针的动态显示
t = datetime.today)
second = t.second + t.microsecond * 0.000001
minute = t.minute + second / 60.0
hour = t.hour + minute / 60.0
secHand.setheading6 * second)
minHand.setheading6 * minute)
hurHand.setheading30 * hour)
turtle.tracerFalse) 
printer.forward65)
printer.writeWeekt), align="center",
font="Courier", 14, "bold"))
printer.back130)
printer.writeDatet), align="center",
font="Courier", 14, "bold"))
printer.home)
turtle.tracerTrue)
# 100ms后继续调用tick
turtle.ontimerTick, 100)
def main):
# 打开/关闭龟动画,并为更新图纸设置延迟。
turtle.tracerFalse)
Init)
SetupClock160)
turtle.tracerTrue)
Tick)
turtle.mainloop)
if __name__ == "__main__":
main)

这里写图片描述这里写图片描述

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注