Turtle库详解

1. Turtle库详解

Python 标准库 - turtle — 海龟绘图 - 《Python 3.10.0 官方文档(全)》 - 书栈网 · BookStack

源码: Lib/turtle.py


1.1 概述

海龟绘图很适合用来引导孩子学习编程。 最初来自于 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 于 1967 年所创造的 Logo 编程语言。

请想象绘图区有一只机器海龟,起始位置在 x-y 平面的 (0, 0) 点。先执行 import turtle,再执行 turtle.forward(15),它将(在屏幕上)朝所面对的 x 轴正方向前进 15 像素,随着它的移动画出一条线段。再执行 turtle.right(25),它将原地右转 25 度。

1.1.1 Turtle star

使用海龟绘图可以编写重复执行简单动作的程序画出精细复杂的形状。

在这里插入图片描述

import turtle as t
color('red', 'yellow')
t.begin_fill()
while True:
    t.forward(200)
    t.left(170)
    if abs(pos()) < 1:
        break
t.end_fill()
t.done()

通过组合使用此类命令,可以轻松地绘制出精美的形状和图案。

turtle 模块是基于 Python 标准发行版 2.5 以来的同名模块重新编写并进行了功能扩展。

新模块尽量保持了原模块的特点,并且(几乎)100%与其兼容。这就意味着初学编程者能够以交互方式使用模块的所有命令、类和方法——运行 IDLE 时注意加 -n 参数。

turtle 模块提供面向对象和面向过程两种形式的海龟绘图基本组件。由于它使用 tkinter 实现基本图形界面,因此需要安装了 Tk 支持的 Python 版本。

面向对象的接口主要使用“2+2”个类:

  1. TurtleScreen 类定义图形窗口作为绘图海龟的运动场。它的构造器需要一个 tkinter.CanvasScrolledCanvas 作为参数。应在 turtle 作为某个程序的一部分的时候使用。

    Screen() 函数返回一个 TurtleScreen 子类的单例对象。此函数应在 turtle 作为独立绘图工具时使用。作为一个单例对象,其所属的类是不可被继承的。

    TurtleScreen/Screen 的所有方法还存在对应的函数,即作为面向过程的接口组成部分。

  2. RawTurtle (别名: RawPen) 类定义海龟对象在 TurtleScreen 上绘图。它的构造器需要一个 Canvas, ScrolledCanvasTurtleScreen 作为参数,以指定 RawTurtle 对象在哪里绘图。

    从 RawTurtle 派生出子类 Turtle (别名: Pen),该类对象在 Screen 实例上绘图,如果实例不存在则会自动创建。

    RawTurtle/Turtle 的所有方法也存在对应的函数,即作为面向过程的接口组成部分。

过程式接口提供与 ScreenTurtle 类的方法相对应的函数。函数名与对应的方法名相同。当 Screen 类的方法对应函数被调用时会自动创建一个 Screen 对象。当 Turtle 类的方法对应函数被调用时会自动创建一个 (匿名的) Turtle 对象。

如果屏幕上需要有多个海龟,就必须使用面向对象的接口。

注解

以下文档给出了函数的参数列表。对于方法来说当然还有额外的第一个参数 self,这里省略了。

1.2 可用的 Turtle 和 Screen 方法概览

1.2.1 Turtle 方法

1.2.1.1 海龟动作
1.2.1.2 画笔控制
1.2.1.3 海龟状态
1.2.1.4 使用事件

onclick() 当鼠标点击

onrelease() 当鼠标释放

ondrag() 当鼠标拖动

特殊海龟方法

begin_poly() 开始记录多边形

end_poly() 结束记录多边形

get_poly() 获取多边形

clone() 克隆

getturtle() | getpen() 获取海龟画笔

getscreen() 获取屏幕

setundobuffer() 设置撤消缓冲区

undobufferentries() 撤消缓冲区条目数

1.2.2 TurtleScreen/Screen 方法

1.2.2.1 窗口控制

bgcolor() 背景颜色

bgpic() 背景图片

clearscreen()

resetscreen()

screensize() 屏幕大小

setworldcoordinates() 设置世界坐标系

1.2.2.2 动画控制

delay() 延迟

tracer() 追踪

update() 更新

1.2.2.3 使用屏幕事件

listen() 监听

onkey() | onkeyrelease() 当键盘按下并释放

onkeypress() 当键盘按下

onclick() | onscreenclick() 当点击屏幕

ontimer() 当达到定时

mainloop() | done() 主循环

1.2.2.4 设置与特殊方法

mode()

colormode() 颜色模式

getcanvas() 获取画布

getshapes() 获取形状

register_shape() | addshape() 添加形状

turtles() 所有海龟

window_height() 窗口高度

window_width() 窗口宽度

1.2.2.5 输入方法

textinput() 文本输入

numinput() 数字输入

1.2.2.6 Screen 专有方法

bye() 退出

exitonclick() 当点击时退出

setup() 设置

title() 标题

1.3 RawTurtle/Turtle 方法和对应函数

本节中的大部分示例都使用 Turtle 类的一个实例,命名为 turtle

1.3.1 海龟动作

  1. turtle.forward(distance)

    turtle.fd(distance)

  • 参数

    distance — 一个数值 (整型或浮点型)

海龟前进 distance 指定的距离,方向为海龟的朝向。

>>> turtle.position()
(0.00,0.00)
>>> turtle.forward(25)
>>> turtle.position()
(25.00,0.00)
>>> turtle.forward(-75)
>>> turtle.position()
(-50.00,0.00)
  1. turtle.back(distance)

    turtle.bk(distance)

    turtle.backward(distance)

  • 参数

    distance — 一个数值

海龟后退 distance 指定的距离,方向与海龟的朝向相反。不改变海龟的朝向。

>>> turtle.position()
(0.00,0.00)
>>> turtle.backward(30)
>>> turtle.position()
(-30.00,0.00)

3. turtle.right(angle)

turtle.rt(angle)

  • 参数

    angle — 一个数值 (整型或浮点型)

海龟右转 angle 个单位。(单位默认为角度,但可通过 degrees()radians() 函数改变设置。) 角度的正负由海龟模式确定,参见 mode()

>>> turtle.heading()
0.0
>>> turtle.right(45)
>>> turtle.heading()
315.0
  1. turtle.left(angle)

turtle.lt(angle)

  • 参数

    angle — 一个数值 (整型或浮点型)

​ 海龟左转 angle 个单位。(单位默认为角度,但可通过 degrees()radians() 函数改变。) 角度的正负由海龟模式确定,参见 mode()

>>> turtle.heading()
315.0
>>> turtle.left(45)
>>> turtle.heading()
0.0
  1. turtle.goto(x, y=None)

​ - turtle.setpos(x, y=None)

​ - turtle.setposition(x, y=None)

  • 参数
    • x — 一个数值或数值对/向量
    • y — 一个数值或 None

如果 yNonex 应为一个表示坐标的数值对或 Vec2D 类对象 (例如 pos() 返回的对象).

海龟移动到一个绝对坐标。如果画笔已落下将会画线。不改变海龟的朝向。

 >>> tp = turtle.pos()
 >>> tp
 (0.00,0.00)
 >>> turtle.setpos(60,30)
 >>> turtle.pos()
 (60.00,30.00)
 >>> turtle.setpos((20,80))
 >>> turtle.pos()
 (20.00,80.00)
 >>> turtle.setpos(tp)
 >>> turtle.pos()
 (0.00,0.00)
  1. turtle.setx(x)
  • 参数

    x — 一个数值 (整型或浮点型)

设置海龟的横坐标为 x,纵坐标保持不变。

>>> turtle.position()
(0.00,240.00)
>>> turtle.setx(10)
>>> turtle.position()
(10.00,240.00)
  1. turtle.sety(y)
  • 参数

    y — 一个数值 (整型或浮点型)

设置海龟的纵坐标为 y,横坐标保持不变。

>>> turtle.position()
(0.00,40.00)
>>> turtle.sety(-10)
>>> turtle.position()
(0.00,-10.00)
  1. turtle.setheading(to_angle)

turtle.seth(to_angle)

  • 参数

    to_angle — 一个数值 (整型或浮点型)

设置海龟的朝向为 to_angle。以下是以角度表示的几个常用方向:

标准模式logo 模式
0 - 东0 - 北
90 - 北90 - 东
180 - 西180 - 南
270 - 南270 - 西
>>> turtle.setheading(90)
>>> turtle.heading()
90.0
  1. turtle.home()

海龟移至初始坐标 (0,0),并设置朝向为初始方向 (由海龟模式确定,参见 mode())。

>>> turtle.heading()
90.0
>>> turtle.position()
(0.00,-10.00)
>>> turtle.home()
>>> turtle.position()
(0.00,0.00)
>>> turtle.heading()
0.0
  1. turtle.circle(radius, extent=None, steps=None)
  • 参数
    • radius — 一个数值
    • extent — 一个角度数值 (或 None)
    • steps — 一个整型数 (或 None)

​ 绘制一个 radius 指定半径的圆。圆心在海龟左边 radius 个单位;extent 为一个夹角,用来决定绘制圆的一部分。如未指定 extent则绘制整个圆。如果 extent 不是完整圆周,则以当前画笔位置为一个端点绘制圆弧。如果 radius 为正值则朝逆时针方向绘制圆弧,否则朝顺时针方向。最终海龟的朝向会依据 extent 的值而改变。

圆实际是以其内切正多边形来近似表示的,边的数量由 steps 指定。如果未指定边数则会自动确定。此方法也可用来绘制正多边形。

>>> turtle.home()
>>> turtle.position()
(0.00,0.00)
>>> turtle.heading()
0.0
>>> turtle.circle(50)
>>> turtle.position()
(-0.00,0.00)
>>> turtle.heading()
0.0
>>> turtle.circle(120, 180)  # draw a semicircle
>>> turtle.position()
(0.00,240.00)
>>> turtle.heading()
180.0
  1. turtle.dot(size=None, *color)
  • 参数
    • size — 一个整型数 >= 1 (如果指定)
    • color — 一个颜色字符串或颜色数值元组

绘制一个直径为 size,颜色为 color 的圆点。如果 size 未指定,则直径取 pensize+4 和 2*pensize 中的较大值。

>>> turtle.home()
>>> turtle.dot()
>>> turtle.fd(50); turtle.dot(20, "blue"); turtle.fd(50)
>>> turtle.position()
(100.00,-0.00)
>>> turtle.heading()
0.0
  1. turtle.stamp()

在海龟当前位置印制一个海龟形状。返回该印章的 stamp_id,印章可以通过调用 clearstamp(stamp_id) 来删除。

>>> turtle.color("blue")
>>> turtle.stamp()
11
>>> turtle.fd(50)
  1. turtle.clearstamp(stampid)
  • 参数

    stampid — 一个整型数,必须是之前 stamp() 调用的返回值

删除 stampid 指定的印章。

>>> turtle.position()
(150.00,-0.00)
>>> turtle.color("blue")
>>> astamp = turtle.stamp()
>>> turtle.fd(50)
>>> turtle.position()
(200.00,-0.00)
>>> turtle.clearstamp(astamp)
>>> turtle.position()
(200.00,-0.00)
  1. turtle.clearstamps(n=None)
  • 参数

    n — 一个整型数 (或 None)

删除全部或前/后 n 个海龟印章。如果 nNone 则删除全部印章,如果 n > 0 则删除前 n 个印章,否则如果 n < 0 则删除后 n 个印章。

>>> for i in range(8):
...     turtle.stamp(); turtle.fd(30)
13
14
15
16
17
18
19
20
>>> turtle.clearstamps(2)
>>> turtle.clearstamps(-2)
>>> turtle.clearstamps()
  1. turtle.undo()

撤消 (或连续撤消) 最近的一个 (或多个) 海龟动作。可撤消的次数由撤消缓冲区的大小决定。

>>> for i in range(4):
...     turtle.fd(50); turtle.lt(80)
...
>>> for i in range(8):
...     turtle.undo()
  1. turtle.speed(speed=None)
  • 参数

    speed — 一个 0…10 范围内的整型数或速度字符串 (见下)

设置海龟移动的速度为 0…10 表示的整型数值。如未指定参数则返回当前速度。

如果输入数值大于 10 或小于 0.5 则速度设为 0。速度字符串与速度值的对应关系如下:

  • “fastest”: 0 最快
  • “fast”: 10 快
  • “normal”: 6 正常
  • “slow”: 3 慢
  • “slowest”: 1 最慢

速度值从 1 到 10,画线和海龟转向的动画效果逐级加快。

注意: speed = 0 表示 没有 动画效果。forward/back 将使海龟向前/向后跳跃,同样的 left/right 将使海龟立即改变朝向。

>>> turtle.speed()
3
>>> turtle.speed('normal')
>>> turtle.speed()
6
>>> turtle.speed(9)
>>> turtle.speed()
9

1.3.2 获取海龟的状态

  1. turtle.position()

  2. turtle.pos()

返回海龟当前的坐标 (x,y) (为 Vec2D 矢量类对象)。

>>> turtle.pos()
(440.00,-0.00)
  1. turtle.towards(x, y=None)
  • 参数
    • x — 一个数值或数值对/矢量,或一个海龟实例
    • y — 一个数值——如果 x 是一个数值,否则为 None

返回从海龟位置到由 (x,y)、矢量或另一海龟所确定位置的连线的夹角。 此数值依赖于海龟的初始朝向,这又取决于 “standard”/“world” 或 “logo” 模式设置。

>>> turtle.goto(10, 10)
>>> turtle.towards(0,0)
225.0
  1. turtle.xcor()

返回海龟的 x 坐标。

>>> turtle.home()
>>> turtle.left(50)
>>> turtle.forward(100)
>>> turtle.pos()
(64.28,76.60)
>>> print(round(turtle.xcor(), 5))
64.27876
  1. turtle.ycor()

返回海龟的 y 坐标。

>>> turtle.home()
>>> turtle.left(60)
>>> turtle.forward(100)
>>> print(turtle.pos())
(50.00,86.60)
>>> print(round(turtle.ycor(), 5))
86.60254
  1. turtle.heading()

返回海龟当前的朝向 (数值依赖于海龟模式参见 mode())。

>>> turtle.home()
>>> turtle.left(67)
>>> turtle.heading()
67.0
  1. turtle.distance(x, y=None)
  • 参数
    • x — 一个数值或数值对/矢量,或一个海龟实例
    • y — 一个数值——如果 x 是一个数值,否则为 None

返回从海龟位置到由 (x,y),适量或另一海龟对应位置的单位距离。

>>> turtle.home()
>>> turtle.distance(30,40)
50.0
>>> turtle.distance((30,40))
50.0
>>> joe = Turtle()
>>> joe.forward(77)
>>> turtle.distance(joe)
77.0

1.3.3 度量单位设置

  1. turtle.degrees(fullcircle=360.0)
  • 参数

    fullcircle — 一个数值

设置角度的度量单位,即设置一个圆周为多少 “度”。默认值为 360 度。

>>> turtle.home()
>>> turtle.left(90)
>>> turtle.heading()
90.0
Change angle measurement unit to grad (also known as gon,
grade, or gradian and equals 1/100-th of the right angle.)
>>> turtle.degrees(400.0)
>>> turtle.heading()
100.0
>>> turtle.degrees(360)
>>> turtle.heading()
90.0
  1. turtle.radians()

设置角度的度量单位为弧度。其值等于 degrees(2*math.pi)

>>> turtle.home()
>>> turtle.left(90)
>>> turtle.heading()
90.0
>>> turtle.radians()
>>> turtle.heading()
1.5707963267948966

1.3.4 画笔控制

1.3.4.1 绘图状态
  1. turtle.pendown()

turtle.pd()

turtle.down()

画笔落下 — 移动时将画线。

  1. turtle.penup()

turtle.pu()

turtle.up()

画笔抬起 — 移动时不画线。

  1. turtle.pensize(width=None)

turtle.width(width=None)

  • 参数

    width — 一个正数值

设置线条的粗细为 width 或返回该值。如果 resizemode 设为 “auto” 并且 turtleshape 为多边形,该多边形也以同样组细的线条绘制。如未指定参数,则返回当前的 pensize。

>>> turtle.pensize()
1
>>> turtle.pensize(10)   # from here on lines of width 10 are drawn
  1. turtle.pen(pen=None, **pendict)
  • 参数
    • pen — 一个包含部分或全部下列键的字典
    • pendict — 一个或多个以下列键为关键字的关键字参数

返回或设置画笔的属性,以一个包含以下键值对的 “画笔字典” 表示:

  • “shown”: True/False
  • “pendown”: True/False
  • “pencolor”: 颜色字符串或颜色元组
  • “fillcolor”: 颜色字符串或颜色元组
  • “pensize”: 正数值
  • “speed”: 0…10 范围内的数值
  • “resizemode”: “auto” 或 “user” 或 “noresize”
  • “stretchfactor”: (正数值, 正数值)
  • “outline”: 正数值
  • “tilt”: 数值

此字典可作为后续调用 pen() 时的参数,以恢复之前的画笔状态。另外还可将这些属性作为关键词参数提交。使用此方式可以用一条语句设置画笔的多个属性。

>>> turtle.pen(fillcolor="black", pencolor="red", pensize=10)
>>> sorted(turtle.pen().items())
[('fillcolor', 'black'), ('outline', 1), ('pencolor', 'red'),
 ('pendown', True), ('pensize', 10), ('resizemode', 'noresize'),
 ('shearfactor', 0.0), ('shown', True), ('speed', 9),
 ('stretchfactor', (1.0, 1.0)), ('tilt', 0.0)]
>>> penstate=turtle.pen()
>>> turtle.color("yellow", "")
>>> turtle.penup()
>>> sorted(turtle.pen().items())[:3]
[('fillcolor', ''), ('outline', 1), ('pencolor', 'yellow')]
>>> turtle.pen(penstate, fillcolor="green")
>>> sorted(turtle.pen().items())[:3]
[('fillcolor', 'green'), ('outline', 1), ('pencolor', 'red')]
  1. turtle.isdown()

如果画笔落下返回 True,如果画笔抬起返回 False

>>> turtle.penup()
>>> turtle.isdown()
False
>>> turtle.pendown()
>>> turtle.isdown()
True
1.3.4.2 颜色控制
  1. turtle.pencolor(*args)

返回或设置画笔颜色。

允许以下四种输入格式:

  • pencolor()

    返回以颜色描述字符串或元组 (见示例) 表示的当前画笔颜色。可用作其他 color/pencolor/fillcolor 调用的输入。

  • pencolor(colorstring)

    设置画笔颜色为 colorstring 指定的 Tk 颜色描述字符串,例如 "red""yellow""#33cc8c"

  • pencolor((r, g, b))

    设置画笔颜色为以 r, g, b 元组表示的 RGB 颜色。r, g, b 的取值范围应为 0…colormode,colormode 的值为 1.0 或 255 (参见 colormode())。

  • pencolor(r, g, b)

    设置画笔颜色为以 r, g, b 表示的 RGB 颜色。r, g, b 的取值范围应为 0…colormode。

如果 turtleshape 为多边形,该多边形轮廓也以新设置的画笔颜色绘制。

 >>> colormode()
 1.0
 >>> turtle.pencolor()
 'red'
 >>> turtle.pencolor("brown")
 >>> turtle.pencolor()
 'brown'
 >>> tup = (0.2, 0.8, 0.55)
 >>> turtle.pencolor(tup)
 >>> turtle.pencolor()
 (0.2, 0.8, 0.5490196078431373)
 >>> colormode(255)
 >>> turtle.pencolor()
 (51.0, 204.0, 140.0)
 >>> turtle.pencolor('#32c18f')
 >>> turtle.pencolor()
 (50.0, 193.0, 143.0)
  1. turtle.fillcolor(*args)

返回或设置填充颜色。

允许以下四种输入格式:

  • fillcolor()

    返回以颜色描述字符串或元组 (见示例) 表示的当前填充颜色。可用作其他 color/pencolor/fillcolor 调用的输入。

  • fillcolor(colorstring)

    设置填充颜色为 colorstring 指定的 Tk 颜色描述字符串,例如 "red""yellow""#33cc8c"

  • fillcolor((r, g, b))

    设置填充颜色为以 r, g, b 元组表示的 RGB 颜色。r, g, b 的取值范围应为 0…colormode,colormode 的值为 1.0 或 255 (参见 colormode())。

  • fillcolor(r, g, b)

    设置填充颜色为 r, g, b 表示的 RGB 颜色。r, g, b 的取值范围应为 0…colormode。

如果 turtleshape 为多边形,该多边形内部也以新设置的填充颜色填充。

 >>> turtle.fillcolor("violet")
 >>> turtle.fillcolor()
 'violet'
 >>> turtle.pencolor()
 (50.0, 193.0, 143.0)
 >>> turtle.fillcolor((50, 193, 143))  # Integers, not floats
 >>> turtle.fillcolor()
 (50.0, 193.0, 143.0)
 >>> turtle.fillcolor('#ffffff')
 >>> turtle.fillcolor()
 (255.0, 255.0, 255.0)
  1. turtle.color(*args)

返回或设置画笔颜色和填充颜色。

允许多种输入格式。使用如下 0 至 3 个参数:

  • color()

    返回以一对颜色描述字符串或元组表示的当前画笔颜色和填充颜色,两者可分别由 pencolor()fillcolor() 返回。

  • color(colorstring), color((r,g,b)), color(r,g,b)

    输入格式与 pencolor() 相同,同时设置填充颜色和画笔颜色为指定的值。

  • color(colorstring1, colorstring2), color((r1,g1,b1), (r2,g2,b2))

    相当于 pencolor(colorstring1)fillcolor(colorstring2),使用其他输入格式的方法也与之类似。

如果 turtleshape 为多边形,该多边形轮廓与填充也使用新设置的颜色。

 >>> turtle.color("red", "green")
 >>> turtle.color()
 ('red', 'green')
 >>> color("#285078", "#a0c8f0")
 >>> color()
 ((40.0, 80.0, 120.0), (160.0, 200.0, 240.0))

另参见: Screen 方法 colormode()

1.3.4.3 填充
  1. turtle.filling()

返回填充状态 (填充为 True,否则为 False)。

 >>> turtle.begin_fill()
 >>> if turtle.filling():
 ...    turtle.pensize(5)
 ... else:
 ...    turtle.pensize(3)
  1. turtle.begin_fill()

在绘制要填充的形状之前调用。

  1. turtle.end_fill()

填充上次调用 begin_fill() 之后绘制的形状。

自相交多边形或多个形状间的重叠区域是否填充取决于操作系统的图形引擎、重叠的类型以及重叠的层数。 例如上面的 Turtle 多芒星可能会全部填充为黄色,也可能会有一些白色区域。

>>> turtle.color("black", "red")
>>> turtle.begin_fill()
>>> turtle.circle(80)
>>> turtle.end_fill()
1.3.4.4 更多绘图控制
  1. turtle.reset()

从屏幕中删除海龟的绘图,海龟回到原点并设置所有变量为默认值。

>>> turtle.goto(0,-22)
>>> turtle.left(100)
>>> turtle.position()
(0.00,-22.00)
>>> turtle.heading()
100.0
>>> turtle.reset()
>>> turtle.position()
(0.00,0.00)
>>> turtle.heading()
0.0
  1. turtle.clear()

从屏幕中删除指定海龟的绘图。不移动海龟。海龟的状态和位置以及其他海龟的绘图不受影响。

  1. turtle.write(arg, move=False, align=’left’, font=’Arial’, 8, ‘normal’)
  • 参数
    • arg — 要书写到 TurtleScreen 的对象
    • move — True/False
    • align — 字符串 “left”, “center” 或 “right”
    • font — 一个三元组 (fontname, fontsize, fonttype)

基于 align (“left”, “center” 或 “right”) 并使用给定的字体将文本 —— arg 的字符串表示形式 —— 写到当前海龟位置。 如果 move 为真值,画笔会移至文本的右下角。 默认情况下 moveFalse

>>> turtle.write("Home = ", True, align="center")
>>> turtle.write((0,0), True)

1.3.5 海龟状态

1.3.5.1 可见性
  1. turtle.hideturtle()

turtle.ht()

使海龟不可见。当你绘制复杂图形时这是个好主意,因为隐藏海龟可显著加快绘制速度。

>>> turtle.hideturtle()
  1. turtle.showturtle()

turtle.st()

使海龟可见。

>>> turtle.showturtle()
  1. turtle.isvisible()

如果海龟显示返回 True,如果海龟隐藏返回 False

>>> turtle.hideturtle()
>>> turtle.isvisible()
False
>>> turtle.showturtle()
>>> turtle.isvisible()
True
1.3.5.2 外观
  1. turtle.shape(name=None)
  • 参数

    name — 一个有效的形状名字符串

设置海龟形状为 name 指定的形状名,如未指定形状名则返回当前的形状名。name 指定的形状名应存在于 TurtleScreen 的 shape 字典中。多边形的形状初始时有以下几种: “arrow”, “turtle”, “circle”, “square”, “triangle”, “classic”。要了解如何处理形状请参看 Screen 方法 register_shape()

>>> turtle.shape()
'classic'
>>> turtle.shape("turtle")
>>> turtle.shape()
'turtle'
  1. turtle.resizemode(rmode=None)
  • 参数

    rmode — 字符串 “auto”, “user”, “noresize” 其中之一

设置大小调整模式为以下值之一: “auto”, “user”, “noresize”。如未指定 rmode 则返回当前的大小调整模式。不同的大小调整模式的效果如下:

  • “auto”: 根据画笔粗细值调整海龟的外观。
  • “user”: 根据拉伸因子和轮廓宽度 (outline) 值调整海龟的外观,两者是由 shapesize() 设置的。
  • “noresize”: 不调整海龟的外观大小。

resizemode("user") 会由 shapesize() 带参数使用时被调用。

>>> turtle.resizemode()
'noresize'
>>> turtle.resizemode("auto")
>>> turtle.resizemode()
'auto'
  1. turtle.shapesize(stretch_wid=None, stretch_len=None, outline=None)

turtle.turtlesize(stretch_wid=None, stretch_len=None, outline=None)

  • 参数
    • stretch_wid — 正数值
    • stretch_len — 正数值
    • outline — 正数值

返回或设置画笔的属性 x/y-拉伸因子和/或轮廓。设置大小调整模式为 “user”。当且仅当大小调整模式设为 “user” 时海龟会基于其拉伸因子调整外观: stretch_wid 为垂直于其朝向的宽度拉伸因子,stretch_len 为平等于其朝向的长度拉伸因子,决定形状轮廓线的粗细。

>>> turtle.shapesize()
(1.0, 1.0, 1)
>>> turtle.resizemode("user")
>>> turtle.shapesize(5, 5, 12)
>>> turtle.shapesize()
(5, 5, 12)
>>> turtle.shapesize(outline=8)
>>> turtle.shapesize()
(5, 5, 8)
  1. turtle.shearfactor(shear=None)
  • 参数

    shear — 数值 (可选)

设置或返回当前的剪切因子。根据 share 指定的剪切因子即剪切角度的切线来剪切海龟形状。 改变海龟的朝向 (移动方向)。如未指定 shear 参数: 返回当前的剪切因子即剪切角度的切线,与海龟朝向平行的线条将被剪切。

 >>> turtle.shape("circle")
 >>> turtle.shapesize(5,2)
 >>> turtle.shearfactor(0.5)
 >>> turtle.shearfactor()
 0.5
  1. turtle.tilt(angle)
  • 参数

    angle — 一个数值

海龟形状自其当前的倾角转动 angle 指定的角度,但 改变海龟的朝向 (移动方向)。

>>> turtle.reset()
>>> turtle.shape("circle")
>>> turtle.shapesize(5,2)
>>> turtle.tilt(30)
>>> turtle.fd(50)
>>> turtle.tilt(30)
>>> turtle.fd(50)
  1. turtle.settiltangle(angle)
  • 参数

    angle — 一个数值

旋转海龟形状使其指向 angle 指定的方向,忽略其当前的倾角, 改变海龟的朝向 (移动方向)。

>>> turtle.reset()
>>> turtle.shape("circle")
>>> turtle.shapesize(5,2)
>>> turtle.settiltangle(45)
>>> turtle.fd(50)
>>> turtle.settiltangle(-45)
>>> turtle.fd(50)

3.1 版后已移除.

  1. turtle.tiltangle(angle=None)
  • 参数

    angle — 一个数值 (可选)

设置或返回当前的倾角。如果指定 angle 则旋转海龟形状使其指向 angle 指定的方向,忽略其当前的倾角。 改变海龟的朝向 (移动方向)。如果未指定 angle: 返回当前的倾角,即海龟形状的方向和海龟朝向 (移动方向) 之间的夹角。

>>> turtle.reset()
>>> turtle.shape("circle")
>>> turtle.shapesize(5,2)
>>> turtle.tilt(45)
>>> turtle.tiltangle()
45.0
  1. turtle.shapetransform(t11=None, t12=None, t21=None, t22=None)
  • 参数
    • t11 — 一个数值 (可选)
    • t12 — 一个数值 (可选)
    • t21 — 一个数值 (可选)
    • t12 — 一个数值 (可选)

设置或返回海龟形状的当前变形矩阵。

如未指定任何矩阵元素,则返回以 4 元素元组表示的变形矩阵。 否则就根据设置指定元素的矩阵来改变海龟形状,矩阵第一排的值为 t11, t12 而第二排的值为 t21, t22。 行列式 t11 t22 - t12 t21 必须不为零,否则会引发错误。 根据指定矩阵修改拉伸因子 stretchfactor, 剪切因子 shearfactor 和倾角 tiltangle。

>>> turtle = Turtle()
>>> turtle.shape("square")
>>> turtle.shapesize(4,2)
>>> turtle.shearfactor(-0.5)
>>> turtle.shapetransform()
(4.0, -1.0, -0.0, 2.0)
  1. turtle.get_shapepoly()

返回以坐标值对元组表示的当前形状多边形。这可以用于定义一个新形状或一个复合形状的多个组成部分。

>>> turtle.shape("square")
>>> turtle.shapetransform(4, -1, 0, 2)
>>> turtle.get_shapepoly()
((50, -20), (30, 20), (-50, 20), (-30, -20))

1.3.6 使用事件

  1. turtle.onclick(fun, btn=1, add=None)
  • 参数
    • fun — 一个函数,调用时将传入两个参数表示在画布上点击的坐标。
    • btn — 鼠标按钮编号,默认值为 1 (鼠标左键)
    • addTrueFalse — 如为 True 则将添加一个新绑定,否则将取代先前的绑定

fun 指定的函数绑定到鼠标点击此海龟事件。如果 fun 值为 None,则移除现有的绑定。以下为使用匿名海龟即过程式的示例:

>>> def turn(x, y):
...     left(180)
...
>>> onclick(turn)  # Now clicking into the turtle will turn it.
>>> onclick(None)  # event-binding will be removed
  1. turtle.onrelease(fun, btn=1, add=None)
  • 参数
    • fun — 一个函数,调用时将传入两个参数表示在画布上点击的坐标。
    • btn — 鼠标按钮编号,默认值为 1 (鼠标左键)
    • addTrueFalse — 如为 True 则将添加一个新绑定,否则将取代先前的绑定

fun 指定的函数绑定到在此海龟上释放鼠标按键事件。如果 fun 值为 None,则移除现有的绑定。

>>> class MyTurtle(Turtle):
...     def glow(self,x,y):
...         self.fillcolor("red")
...     def unglow(self,x,y):
...         self.fillcolor("")
...
>>> turtle = MyTurtle()
>>> turtle.onclick(turtle.glow)     # clicking on turtle turns fillcolor red,
>>> turtle.onrelease(turtle.unglow) # releasing turns it to transparent.
  1. turtle.ondrag(fun, btn=1, add=None)
  • 参数
    • fun — 一个函数,调用时将传入两个参数表示在画布上点击的坐标。
    • btn — 鼠标按钮编号,默认值为 1 (鼠标左键)
    • addTrueFalse — 如为 True 则将添加一个新绑定,否则将取代先前的绑定

fun 指定的函数绑定到在此海龟上移动鼠标事件。如果 fun 值为 None,则移除现有的绑定。

注: 在海龟上移动鼠标事件之前应先发生在此海龟上点击鼠标事件。

>>> turtle.ondrag(turtle.goto)

在此之后点击并拖动海龟可在屏幕上手绘线条 (如果画笔为落下)。

1.3.7 特殊海龟方法

  1. turtle.begin_poly()

开始记录多边形的顶点。当前海龟位置为多边形的第一个顶点。

  1. turtle.end_poly()

停止记录多边形的顶点。当前海龟位置为多边形的最后一个顶点。它将连线到第一个顶点。

  1. turtle.get_poly()

返回最新记录的多边形。

>>> turtle.home()
>>> turtle.begin_poly()
>>> turtle.fd(100)
>>> turtle.left(20)
>>> turtle.fd(30)
>>> turtle.left(60)
>>> turtle.fd(50)
>>> turtle.end_poly()
>>> p = turtle.get_poly()
>>> register_shape("myFavouriteShape", p)
  1. turtle.clone()

创建并返回海龟的克隆体,具有相同的位置、朝向和海龟属性。

>>> mick = Turtle()
>>> joe = mick.clone()
  1. turtle.getturtle()

turtle.getpen()

返回海龟对象自身。唯一合理的用法: 作为一个函数来返回 “匿名海龟”:

>>> pet = getturtle()
>>> pet.fd(50)
>>> pet
<turtle.Turtle object at 0x...>
  1. turtle.getscreen()

返回作为海龟绘图场所的 TurtleScreen 类对象。该对象将可调用 TurtleScreen 方法。

>>> ts = turtle.getscreen()
>>> ts
<turtle._Screen object at 0x...>
>>> ts.bgcolor("pink")
  1. turtle.setundobuffer(size)
  • 参数

    size — 一个整型数值或 None

设置或禁用撤销缓冲区。 如果 size 为整数,则开辟一个给定大小的空撤销缓冲区。 size 给出了可以通过 undo() 方法/函数撤销海龟动作的最大次数。 如果 sizeNone,则禁用撤销缓冲区。

>>> turtle.setundobuffer(42)
  1. turtle.undobufferentries()

返回撤销缓冲区里的条目数。

>>> while undobufferentries():
...     undo()

1.3.8 复合形状

要使用由多个不同颜色多边形构成的复合海龟形状,你必须明确地使用辅助类 Shape,具体步骤如下:

  1. 创建一个空 Shape 对象,类型为 “compound”。

  2. 按照需要使用 addcomponent() 方法向此对象添加多个部件。

    例如:

    >>> s = Shape("compound")
    >>> poly1 = ((0,0),(10,-5),(0,10),(-10,-5))
    >>> s.addcomponent(poly1, "red", "blue")
    >>> poly2 = ((0,0),(10,-5),(-10,-5))
    >>> s.addcomponent(poly2, "blue", "red")
    
  3. 接下来将 Shape 对象添加到 Screen 对象的形状列表并使用它:

    >>> register_shape("myshape", s)
    >>> shape("myshape")
    

注解

Shape 类在 register_shape() 方法的内部以多种方式使用。应用程序编写者 只有 在使用上述的复合形状时才需要处理 Shape 类。

1.4 TurtleScreen/Screen 方法及对应函数

本节中的大部分示例都使用 TurtleScreen 类的一个实例,命名为 screen

1.4.1 窗口控制

  1. turtle.bgcolor(*args)
  • 参数

    args — 一个颜色字符串或三个取值范围 0…colormode 内的数值或一个取值范围相同的数值3元组

设置或返回 TurtleScreen 的背景颜色。

>>> screen.bgcolor("orange")
>>> screen.bgcolor()
'orange'
>>> screen.bgcolor("#800080")
>>> screen.bgcolor()
(128.0, 0.0, 128.0)
  1. turtle.bgpic(picname=None)
  • 参数

    picname — 一个字符串, gif-文件名, "nopic", 或 None

设置背景图片或返回当前背景图片名称。如果 picname 为一个文件名,则将相应图片设为背景。如果 picname"nopic",则删除当前背景图片。如果 picnameNone,则返回当前背景图片文件名。:

>>> screen.bgpic()
'nopic'
>>> screen.bgpic("landscape.gif")
>>> screen.bgpic()
"landscape.gif"
  1. turtle.clear()

注解

此 TurtleScreen 方法作为全局函数时只有一个名字 clearscreen。全局函数 clear 所对应的是 Turtle 方法 clear

  1. turtle.clearscreen()

从中删除所有海龟的全部绘图。将已清空的 TurtleScreen 重置为初始状态: 白色背景,无背景片,无事件绑定并启用追踪。

  1. turtle.reset()

注解

此 TurtleScreen 方法作为全局函数时只有一个名字 resetscreen。全局函数 reset 所对应的是 Turtle 方法 reset

  1. turtle.resetscreen()

重置屏幕上的所有海龟为其初始状态。

  1. turtle.screensize(canvwidth=None, canvheight=None, bg=None)
  • 参数
    • canvwidth — 正整型数,以像素表示画布的新宽度值
    • canvheight — 正整型数,以像素表示画面的新高度值
    • bg — 颜色字符串或颜色元组,新的背景颜色

如未指定任何参数,则返回当前的 (canvaswidth, canvasheight)。否则改变作为海龟绘图场所的画布大小。不改变绘图窗口。要观察画布的隐藏区域,可以使用滚动条。通过此方法可以令之前绘制于画布之外的图形变为可见。

>>> screen.screensize()
(400, 300)
>>> screen.screensize(2000,1500)
>>> screen.screensize()
(2000, 1500)

也可以用来寻找意外逃走的海龟 😉

  1. turtle.setworldcoordinates(llx, lly, urx, ury)
  • 参数
    • llx — 一个数值, 画布左下角的 x-坐标
    • lly — 一个数值, 画布左下角的 y-坐标
    • urx — 一个数值, 画面右上角的 x-坐标
    • ury — 一个数值, 画布右上角的 y-坐标

设置用户自定义坐标系并在必要时切换模式为 “world”。这会执行一次 screen.reset()。如果 “world” 模式已激活,则所有图形将根据新的坐标系重绘。

注意: 在用户自定义坐标系中,角度可能显得扭曲。

>>> screen.reset()
>>> screen.setworldcoordinates(-50,-7.5,50,7.5)
>>> for _ in range(72):
...     left(10)
...
>>> for _ in range(8):
...     left(45); fd(2)   # a regular octagon

1.4.2 动画控制

  1. turtle.delay(delay=None)
  • 参数

    delay — 正整型数

设置或返回以毫秒数表示的延迟值 delay。(这约等于连续两次画布刷新的间隔时间。) 绘图延迟越长,动画速度越慢。

可选参数:

>>> screen.delay()
10
>>> screen.delay(5)
>>> screen.delay()
5
  1. turtle.tracer(n=None, delay=None)
  • 参数
    • n — 非负整型数
    • delay — 非负整型数

启用/禁用海龟动画并设置刷新图形的延迟时间。如果指定 n 值,则只有每第 n 次屏幕刷新会实际执行。(可被用来加速复杂图形的绘制。) 如果调用时不带参数,则返回当前保存的 n 值。第二个参数设置延迟值 (参见 delay())。

>>> screen.tracer(8, 25)
>>> dist = 2
>>> for i in range(200):
...     fd(dist)
...     rt(90)
...     dist += 2
  1. turtle.update()

执行一次 TurtleScreen 刷新。在禁用追踪时使用。

另参见 RawTurtle/Turtle 方法 speed()

1.4.3 使用屏幕事件

  1. turtle.listen(xdummy=None, ydummy=None)

设置焦点到 TurtleScreen (以便接收按键事件)。使用两个 Dummy 参数以便能够传递 listen() 给 onclick 方法。

  1. turtle.onkey(fun, key)

turtle.onkeyrelease(fun, key)

  • 参数
    • fun — 一个无参数的函数或 None
    • key — 一个字符串: 键 (例如 “a”) 或键标 (例如 “space”)

绑定 fun 指定的函数到按键释放事件。如果 fun 值为 None,则移除事件绑定。注: 为了能够注册按键事件,TurtleScreen 必须得到焦点。(参见 method listen() 方法。)

>>> def f():
...     fd(50)
...     lt(60)
...
>>> screen.onkey(f, "Up")
>>> screen.listen()
  1. turtle.onkeypress(fun, key=None)
  • 参数
    • fun — 一个无参数的函数或 None
    • key — 一个字符串: 键 (例如 “a”) 或键标 (例如 “space”)

绑定 fun 指定的函数到指定键的按下事件。如未指定键则绑定到任意键的按下事件。注: 为了能够注册按键事件,必须得到焦点。(参见 listen() 方法。)

>>> def f():
...     fd(50)
...
>>> screen.onkey(f, "Up")
>>> screen.listen()
  1. turtle.onclick(fun, btn=1, add=None)

turtle.onscreenclick(fun, btn=1, add=None)

  • 参数
    • fun — 一个函数,调用时将传入两个参数表示在画布上点击的坐标。
    • btn — 鼠标按钮编号,默认值为 1 (鼠标左键)
    • addTrueFalse — 如为 True 则将添加一个新绑定,否则将取代先前的绑定

绑定 fun 指定的函数到鼠标点击屏幕事件。如果 fun 值为 None,则移除现有的绑定。

以下示例使用一个 TurtleScreen 实例 screen 和一个 Turtle 实例 turtle:

>>> screen.onclick(turtle.goto) # Subsequently clicking into the TurtleScreen will
>>>                             # make the turtle move to the clicked point.
>>> screen.onclick(None)        # remove event binding again

注解

此 TurtleScreen 方法作为全局函数时只有一个名字 onscreenclick。全局函数 onclick 所对应的是 Turtle 方法 onclick

  1. turtle.ontimer(fun, t=0)
  • 参数
    • fun — 一个无参数的函数
    • t — 一个数值 >= 0

安装一个计时器,在 t 毫秒后调用 fun 函数。

>>> running = True
>>> def f():
...     if running:
...         fd(50)
...         lt(60)
...         screen.ontimer(f, 250)
>>> f()   ### makes the turtle march around
>>> running = False
  1. turtle.mainloop()

turtle.done()

开始事件循环 - 调用 Tkinter 的 mainloop 函数。必须作为一个海龟绘图程序的结束语句。如果一个脚本是在以 -n 模式 (无子进程) 启动的 IDLE 中运行时 不可 使用 - 用于实现海龟绘图的交互功能。:

>>> screen.mainloop()

1.4.4 输入方法

  1. turtle.textinput(title, prompt)
  • 参数
    • title — string
    • prompt — string

弹出一个对话框窗口用来输入一个字符串。形参 title 为对话框窗口的标题,prompt 为一条文本,通常用来提示要输入什么信息。返回输入的字符串。如果对话框被取消则返回 None。:

>>> screen.textinput("NIM", "Name of first player:")
  1. turtle.numinput(title, prompt, default=None, minval=None, maxval=None)
  • 参数
    • title — string
    • prompt — string
    • default — 数值 (可选)
    • minval — 数值 (可选)
    • maxval — 数值 (可选)

弹出一个对话框窗口用来输入一个数值。title 为对话框窗口的标题,prompt 为一条文本,通常用来描述要输入的数值信息。default: 默认值, minval: 可输入的最小值, maxval: 可输入的最大值。输入数值的必须在指定的 minval … maxval 范围之内,否则将给出一条提示,对话框保持打开等待修改。返回输入的数值。如果对话框被取消则返回 None。:

>>> screen.numinput("Poker", "Your stakes:", 1000, minval=10, maxval=10000)

1.4.5 设置与特殊方法

  1. turtle.mode(mode=None)
  • 参数

    mode — 字符串 “standard”, “logo” 或 “world” 其中之一

设置海龟模式 (“standard”, “logo” 或 “world”) 并执行重置。如未指定模式则返回当前的模式。

“standard” 模式与旧的 turtle 兼容。”logo” 模式与大部分 Logo 海龟绘图兼容。”world” 模式使用用户自定义的 “世界坐标系”。注意: 在此模式下,如果 x/y 单位比率不等于 1 则角度会显得扭曲。

模式初始海龟朝向正数角度
“standard”朝右 (东)逆时针
“logo”朝上 (北)顺时针
>>> mode("logo")   # resets turtle heading to north
>>> mode()
'logo'
  1. turtle.colormode(cmode=None)
  • 参数

    cmode — 数值 1.0 或 255 其中之一

返回颜色模式或将其设为 1.0 或 255。构成颜色三元组的 r, g, b 数值必须在 0…cmode 范围之内。

>>> screen.colormode(1)
>>> turtle.pencolor(240, 160, 80)
Traceback (most recent call last):
     ...
TurtleGraphicsError: bad color sequence: (240, 160, 80)
>>> screen.colormode()
1.0
>>> screen.colormode(255)
>>> screen.colormode()
255
>>> turtle.pencolor(240,160,80)
  1. turtle.getcanvas()

返回此 TurtleScreen 的 Canvas 对象。供了解 Tkinter 的 Canvas 对象内部机理的人士使用。

>>> cv = screen.getcanvas()
>>> cv
<turtle.ScrolledCanvas object ...>
  1. turtle.getshapes()

返回所有当前可用海龟形状的列表。

>>> screen.getshapes()
['arrow', 'blank', 'circle', ..., 'turtle']
  1. turtle.register_shape(name, shape=None)

turtle.addshape(name, shape=None)

调用此函数有三种不同方式:

  • name 为一个 gif 文件的文件名, shapeNone: 安装相应的图像形状。:
>>> screen.register_shape("turtle.gif")

注解

当海龟转向时图像形状 不会 转动,因此无法显示海龟的朝向!

  • name 为指定的字符串,shape 为由坐标值对构成的元组: 安装相应的多边形形状。
>>> screen.register_shape("triangle", ((5,-3), (0,5), (-5,-3)))
  • name 为指定的字符串, 为一个 (复合) Shape 类对象: 安装相应的复合形状。

将一个海龟形状加入 TurtleScreen 的形状列表。只有这样注册过的形状才能通过执行 shape(shapename) 命令来使用。

  1. turtle.turtles()

返回屏幕上的海龟列表。

>>> for turtle in screen.turtles():
...     turtle.color("red")
  1. turtle.window_height()

返回海龟窗口的高度。:

>>> screen.window_height()
480
  1. turtle.window_width()

返回海龟窗口的宽度。:

>>> screen.window_width()
640

1.4.6 Screen 专有方法, 而非继承自 TurtleScreen

  1. turtle.bye()

关闭海龟绘图窗口。

  1. turtle.exitonclick()

bye() 方法绑定到 Screen 上的鼠标点击事件。

如果配置字典中 “using_IDLE” 的值为 False (默认值) 则同时进入主事件循环。注: 如果启动 IDLE 时使用了 -n 开关 (无子进程),turtle.cfg 中此数值应设为 True。在此情况下 IDLE 本身的主事件循环同样会作用于客户脚本。

  1. turtle.setup(width=_CFG[‘width’], height=_CFG[‘height’], startx=_CFG[‘leftright’], starty=_CFG[‘topbottom’])

设置主窗口的大小和位置。默认参数值保存在配置字典中,可通过 turtle.cfg 文件进行修改。

  • 参数
    • width — 如为一个整型数值,表示大小为多少像素,如为一个浮点数值,则表示屏幕的占比;默认为屏幕的 50%
    • height — 如为一个整型数值,表示高度为多少像素,如为一个浮点数值,则表示屏幕的占比;默认为屏幕的 75%
    • startx — 如为正值,表示初始位置距离屏幕左边缘多少像素,负值表示距离右边缘,None 表示窗口水平居中
    • starty — 如为正值,表示初始位置距离屏幕上边缘多少像素,负值表示距离下边缘,None 表示窗口垂直居中
>>> screen.setup (width=200, height=200, startx=0, starty=0)
>>>              # sets window to 200x200 pixels, in upper left of screen
>>> screen.setup(width=.75, height=0.5, startx=None, starty=None)
>>>              # sets window to 75% of screen by 50% of screen and centers
  1. turtle.title(titlestring)
  • 参数

    titlestring — 一个字符串,显示为海龟绘图窗口的标题栏文本

设置海龟窗口标题为 titlestring 指定的文本。

>>> screen.title("Welcome to the turtle zoo!")

1.5 公共类

  1. class turtle.RawTurtle(canvas)

class turtle.RawPen(canvas)

创建一个海龟。海龟对象具有 “Turtle/RawTurtle 方法” 一节所述的全部方法。

  1. class turtle.Turtle

RawTurtle 的子类,具有相同的接口,但其绘图场所为默认的 Screen 类对象,在首次使用时自动创建。

  1. class turtle.TurtleScreen(cv)
  • 参数

    cv — 一个 tkinter.Canvas 类对象

提供面向屏幕的方法例如 setbg() 等。说明见上文。

  1. class turtle.Screen

TurtleScreen 的子类,增加了四个方法.

  1. class turtle.ScrolledCanvas(master)
  • 参数

    master — 可容纳 ScrolledCanvas 的 Tkinter 部件,即添加了滚动条的 Tkinter-canvas

由 Screen 类使用,使其能够自动提供一个 ScrolledCanvas 作为海龟的绘图场所。

  1. class turtle.Shape(type_, data)
  • 参数

    type_ — 字符串 “polygon”, “image”, “compound” 其中之一

实现形状的数据结构。(type_, data) 必须遵循以下定义:

type_data
“polygon”一个多边形元组,即由坐标值对构成的元组
“image”一个图片 (此形式仅限内部使用!)
“compound”None (复合形状必须使用 addcomponent() 方法来构建)
  • addcomponent(poly, fill, outline=None)

    • 参数
      • poly — 一个多边形,即由数值对构成的元组
      • fill — 一种颜色,将用来填充 poly 指定的多边形
      • outline — 一种颜色,用于多边形的轮廓 (如有指定)

    示例:

    >>> poly = ((0,0),(10,-5),(0,10),(-10,-5))
    >>> s = Shape("compound")
    >>> s.addcomponent(poly, "red", "blue")
    >>> # ... add more components and then use register_shape()
    

    参见 复合形状

  1. class turtle.Vec2D(x, y)

一个二维矢量类,用来作为实现海龟绘图的辅助类。也可能在海龟绘图程序中使用。派生自元组,因此矢量也属于元组!

提供的运算 (a, b 为矢量, k 为数值):

  • a + b 矢量加法
  • a - b 矢量减法
  • a * b 内积
  • k * aa * k 与标量相乘
  • abs(a) a 的绝对值
  • a.rotate(angle) 旋转

1.6 帮助与配置

1.6.1 如何使用帮助

Screen 和 Turtle 类的公用方法以文档字符串提供了详细的文档。因此可以利用 Python 帮助工具获取这些在线帮助信息:

  • 当使用 IDLE 时,输入函数/方法调用将弹出工具提示显示其签名和文档字符串的头几行。

  • 对文法或函数调用 help() 将显示其文档字符串:

  help(Screen.bgcolor) Help on method bgcolor in module turtle:
  
bgcolor(self, *args)unbound turtle.Screen method
  
  Set or return backgroundcolor of the TurtleScreen.Arguments (if given): a color string or three numbersin the range 0..colormode or a 3-tuple of such numbers.
  >>> screen.bgcolor("orange")
  >>> screen.bgcolor()
  "orange"
  >>> screen.bgcolor(0.5,0,0.5)
  >>> screen.bgcolor()
  "#800080"
  >>> help(Turtle.penup)
  Help on method penup in module turtle:
  penup(self) unbound turtle.Turtle method
      Pull the pen up -- no drawing when moving.
      Aliases: penup | pu | up
      No argument
  >>> turtle.penup()
  • 方法对应函数的文档字符串的形式会有一些修改:
  >>> help(bgcolor)
  Help on function bgcolor in module turtle:
  bgcolor(*args)
      Set or return backgroundcolor of the TurtleScreen.
      Arguments (if given): a color string or three numbers
      in the range 0..colormode or a 3-tuple of such numbers.
      Example::
        >>> bgcolor("orange")
        >>> bgcolor()
        "orange"
        >>> bgcolor(0.5,0,0.5)
        >>> bgcolor()
        "#800080"
  >>> help(penup)
  Help on function penup in module turtle:
  penup()
      Pull the pen up -- no drawing when moving.
      Aliases: penup | pu | up
      No argument
      Example:
      >>> penup()

这些修改版文档字符串是在导入时与方法对应函数的定义一起自动生成的。

1.6.2 文档字符串翻译为不同的语言

可使用工具创建一个字典,键为方法名,值为 Screen 和 Turtle 类公共方法的文档字符串。

  1. turtle.write_docstringdict(filename=’turtle_docstringdict’)
  • 参数

    filename — 一个字符串,表示文件名

创建文档字符串字典并将其写入 filename 指定的 Python 脚本文件。此函数必须显示地调用 (海龟绘图类并不使用此函数)。文档字符串字典将被写入到 Python 脚本文件 *filename*.py。该文件可作为模板用来将文档字符串翻译为不同语言。

如果你 (或你的学生) 想使用本国语言版本的 turtle 在线帮助,你必须翻译文档字符串并保存结果文件,例如 turtle_docstringdict_german.py.

如果你在 turtle.cfg 文件中加入了相应的条目,此字典将在导入模块时被读取并替代原有的英文版文档字符串。

在撰写本文档时已经有了德语和意大利语版的文档字符串字典。(更多需求请联系 glingl@aon.at)

1.6.3 如何配置 Screen 和 Turtle

内置的默认配置是模仿旧 turtle 模块的外观和行为,以便尽可能地与其保持兼容。

如果你想使用不同的配置,以便更好地反映此模块的特性或是更适合你的需求,例如在课堂中使用,你可以准备一个配置文件 turtle.cfg,该文件将在导入模块时被读取并根据其中的设定修改模块配置。

内置的配置对应以下的 turtle.cfg:

width = 0.5
height = 0.75
leftright = None
topbottom = None
canvwidth = 400
canvheight = 300
mode = standard
colormode = 1.0
delay = 10
undobuffersize = 1000
shape = classic
pencolor = black
fillcolor = black
resizemode = noresize
visible = True
language = english
exampleturtle = turtle
examplescreen = screen
title = Python Turtle Graphics
using_IDLE = False

选定条目的简短说明:

  • 开头的四行对应 Screen.setup() 方法的参数。
  • 第 5 和 6 行对应 Screen.screensize() 方法的参数。
  • shape 可以是任何内置形状,即: arrow, turtle 等。更多信息可用 help(shape) 查看。
  • 如果你想使用无填充色 (即令海龟变透明),你必须写 fillcolor = "" (但 cfg 文件中所有非空字符串都不可加引号)。
  • 如果你想令海龟反映其状态,你必须使用 resizemode = auto
  • 如果你设置语言例如 language = italian 则文档字符串字典 turtle_docstringdict_italian.py 将在导入模块时被加载 (如果导入路径即 turtle 的目录中存在此文件。
  • exampleturtleexamplescreen 条目定义了相应对象在文档字符串中显示的名称。方法文档字符串转换为函数文档字符串时将从文档字符串中删去这些名称。
  • using_IDLE: 如果你经常使用 IDLE 并启用其 -n 开关 (“无子进程”) 则应将此项设为 True,这将阻止 exitonclick() 进入主事件循环。

turtle.cfg 文件可以保存于 turtle 所在目录,当前工作目录也可以有一个同名文件。后者会重载覆盖前者的设置。

Lib/turtledemo 目录中也有一个 turtle.cfg 文件。你可以将其作为示例进行研究,并在运行演示时查看其作用效果 (但最好不要在演示查看器中运行)。

1.7 turtledemo —- 演示脚本集

turtledemo 包汇集了一组演示脚本。这些脚本可以通过以下命令打开所提供的演示查看器运行和查看:

python -m turtledemo

此外,你也可以单独运行其中的演示脚本。例如,:

python -m turtledemo.bytedesign

turtledemo 包目录中的内容:

  • 一个演示查看器 __main__.py,可用来查看脚本的源码并即时运行。
  • 多个脚本文件,演示 turtle 模块的不同特性。所有示例可通过 Examples 菜单打开。也可以单独运行每个脚本。
  • 一个 turtle.cfg 文件,作为说明如何编写并使用模块配置文件的示例模板。

演示脚本清单如下:

名称描述相关特性
bytedesign复杂的传统海龟绘图模式tracer(), delay, update()
chaos绘制 Verhulst 动态模型,演示通过计算机的运算可能会生成令人惊叹的结果世界坐标系
clock绘制模拟时钟显示本机的当前时间海龟作为表针, ontimer
colormixer试验 r, g, b 颜色模式ondrag() 当鼠标拖动
forest绘制 3 棵广度优先树随机化
fractalcurves绘制 Hilbert & Koch 曲线递归
lindenmayer文化数学 (印度装饰艺术)L-系统
minimal_hanoi汉诺塔矩形海龟作为汉诺盘 (shape, shapesize)
nim玩经典的“尼姆”游戏,开始时有三堆小棒,与电脑对战。海龟作为小棒,事件驱动 (鼠标, 键盘)
paint超极简主义绘画程序onclick() 当鼠标点击
peace初级技巧海龟: 外观与动画
penrose非周期性地使用风筝和飞镖形状铺满平面stamp() 印章
planet_and_moon模拟引力系统复合开关, Vec2D
round_dance两两相对并不断旋转舞蹈的海龟复合形状, clone shapesize, tilt, get_shapepoly, update
sorting_animate动态演示不同的排序方法简单对齐, 随机化
tree一棵 (图形化的) 广度优先树 (使用生成器)clone() 克隆
two_canvases简单设计两块画布上的海龟
wikipedia一个来自介绍海龟绘图的维基百科文章的图案clone(), undo()
yinyang另一个初级示例circle() 画圆

祝你玩得开心!

1.8 Python 2.6 之后的变化

  • Turtle.tracer(), Turtle.window_width()Turtle.window_height() 方法已被去除。具有这些名称和功能的方法现在只限于 Screen 类的方法。但其对应的函数仍然可用。(实际上在 Python 2.6 中这些方法就已经只是从对应的 TurtleScreen/Screen 类的方法复制而来。)
  • Turtle.fill() 方法已被去除。begin_fill()end_fill() 的行为则有细微改变: 现在每个填充过程必须以一个 end_fill() 调用来结束。
  • 新增了一个 Turtle.filling() 方法。该方法返回一个布尔值: 如果填充过程正在进行为 True,否则为 False。此行为相当于 Python 2.6 中不带参数的 fill() 调用。

1.9 Python 3.0 之后的变化

  • 新增了 Turtle.shearfactor(), Turtle.shapetransform()Turtle.get_shapepoly() 方法。这样就可以使用所有标准线性变换来调整海龟形状。Turtle.tiltangle() 的功能已被加强: 现在可被用来获取或设置倾角。Turtle.settiltangle() 已弃用。
  • 新增了 Screen.onkeypress() 方法作为对 Screen.onkey() 的补充,实际就是将行为绑定到 keyrelease 事件。后者相应增加了一个别名: Screen.onkeyrelease()
  • 新增了 Screen.mainloop() 方法。这样当仅需使用 Screen 和 Turtle 对象时不需要再额外导入 mainloop()
  • 新增了两个方法 Screen.textinput()Screen.numinput()。用来弹出对话框接受输入并分别返回字符串和数值。
  • 两个新的示例脚本 tdemo_nim.pytdemo_round_dance.py 被加入到 Lib/turtledemo 目录中。

1.10 turtle绘图实例

1.10.1、太阳花

img

# coding=utf-8

import turtle
import time
# 同时设置pencolor=color1, fillcolor=color2

turtle.color("red", "yellow")

turtle.begin_fill()
for _ in range(50):
	turtle.forward(200)
	turtle.left(170)
turtle.end_fill()

turtle.mainloop()

1.10.2、五角星

img

# coding=utf-8

import turtle
import time

turtle.pensize(5)
turtle.pencolor("yellow")
turtle.fillcolor("red")

turtle.begin_fill()
for _ in range(5):
  turtle.forward(200)
  turtle.right(144)
turtle.end_fill()
time.sleep(2)

turtle.penup()
turtle.goto(-150,-120)
turtle.color("violet")
turtle.write("Done", font=('Arial', 40, 'normal'))

turtle.mainloop()

1.10.3、时钟程序

img

# coding=utf-8
 
import turtle
from datetime import *
 
# 抬起画笔,向前运动一段距离放下
def Skip(step):
    turtle.penup()
    turtle.forward(step)
    turtle.pendown()
 
def mkHand(name, length):
    # 注册Turtle形状,建立表针Turtle
    turtle.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)
   
    # 建立输出文字Turtle
    printer = 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.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.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后继续调用tick
    turtle.ontimer(Tick, 100)
 
def main():
    # 打开/关闭龟动画,并为更新图纸设置延迟。
    turtle.tracer(False)
    Init()
    SetupClock(160)
    turtle.tracer(True)
    Tick()
    turtle.mainloop()
 
if __name__ == "__main__":
    main()

1.10.4小猪佩奇

from turtle import*

def nose(x,y):#鼻子
    penup()#提起笔
    goto(x,y)#定位
    pendown()#落笔,开始画
    setheading(-30)#将乌龟的方向设置为to_angle/为数字(0-东、90-北、180-西、270-南)
    begin_fill()#准备开始填充图形
    a=0.4
    for i in range(120):
        if 0<=i<30 or 60<=i<90:
            a=a+0.08
            left(3) #向左转3度
            forward(a) #向前走a的步长
        else:
            a=a-0.08
            left(3)
            forward(a)
    end_fill()#填充完成

    penup()
    setheading(90)
    forward(25)
    setheading(0)
    forward(10)
    pendown()
    pencolor(255,155,192)#画笔颜色
    setheading(10)
    begin_fill()
    circle(5)
    color(160,82,45)#返回或设置pencolor和fillcolor
    end_fill()

    penup()
    setheading(0)
    forward(20)
    pendown()
    pencolor(255,155,192)
    setheading(10)
    begin_fill()
    circle(5)
    color(160,82,45)
    end_fill()

def head(x,y):#头
    color((255,155,192),"pink")
    penup()
    goto(x,y)
    setheading(0)
    pendown()
    begin_fill()
    setheading(180)
    circle(300,-30)
    circle(100,-60)
    circle(80,-100)
    circle(150,-20)
    circle(60,-95)
    setheading(161)
    circle(-300,15)
    penup()
    goto(-100,100)
    pendown()
    setheading(-30)
    a=0.4
    for i in range(60):
        if 0<=i<30 or 60<=i<90:
            a=a+0.08
            lt(3) #向左转3度
            fd(a) #向前走a的步长
        else:
            a=a-0.08
            lt(3)
            fd(a)
    end_fill()

def ears(x,y): #耳朵
    color((255,155,192),"pink")
    penup()
    goto(x,y)
    pendown()
    begin_fill()
    setheading(100)
    circle(-50,50)
    circle(-10,120)
    circle(-50,54)
    end_fill()

    penup()
    setheading(90)
    forward(-12)
    setheading(0)
    forward(30)
    pendown()
    begin_fill()
    setheading(100)
    circle(-50,50)
    circle(-10,120)
    circle(-50,56)
    end_fill()

def eyes(x,y):#眼睛
    color((255,155,192),"white")
    penup()
    setheading(90)
    forward(-20)
    setheading(0)
    forward(-95)
    pendown()
    begin_fill()
    circle(15)
    end_fill()

    color("black")
    penup()
    setheading(90)
    forward(12)
    setheading(0)
    forward(-3)
    pendown()
    begin_fill()
    circle(3)
    end_fill()

    color((255,155,192),"white")
    penup()
    seth(90)
    forward(-25)
    seth(0)
    forward(40)
    pendown()
    begin_fill()
    circle(15)
    end_fill()

    color("black")
    penup()
    setheading(90)
    forward(12)
    setheading(0)
    forward(-3)
    pendown()
    begin_fill()
    circle(3)
    end_fill()

def cheek(x,y):#腮
    color((255,155,192))
    penup()
    goto(x,y)
    pendown()
    setheading(0)
    begin_fill()
    circle(30)
    end_fill()

def mouth(x,y): #嘴
    color(239,69,19)
    penup()
    goto(x,y)
    pendown()
    setheading(-80)
    circle(30,40)
    circle(40,80)

def body(x,y):#身体
    color("red",(255,99,71))
    penup()
    goto(x,y)
    pendown()
    begin_fill()
    setheading(-130)
    circle(100,10)
    circle(300,30)
    setheading(0)
    forward(230)
    setheading(90)
    circle(300,30)
    circle(100,3)
    color((255,155,192),(255,100,100))
    setheading(-135)
    circle(-80,63)
    circle(-150,24)
    end_fill()

def hands(x,y):#手
    color((255,155,192))
    penup()
    goto(x,y)
    pendown()
    setheading(-160)
    circle(300,15)
    penup()
    setheading(90)
    forward(15)
    setheading(0)
    forward(0)
    pendown()
    setheading(-10)
    circle(-20,90)

    penup()
    setheading(90)
    forward(30)
    setheading(0)
    forward(237)
    pendown()
    setheading(-20)
    circle(-300,15)
    penup()
    setheading(90)
    forward(20)
    setheading(0)
    forward(0)
    pendown()
    setheading(-170)
    circle(20,90)

def foot(x,y):#脚
    pensize(10)
    color((240,128,128))
    penup()
    goto(x,y)
    pendown()
    setheading(-90)
    forward(40)
    setheading(-180)
    color("black")
    pensize(15)
    fd(20)

    pensize(10)
    color((240,128,128))
    penup()
    setheading(90)
    forward(40)
    setheading(0)
    forward(90)
    pendown()
    setheading(-90)
    forward(40)
    setheading(-180)
    color("black")
    pensize(15)
    fd(20)

def tail(x,y):#尾巴
    pensize(4)
    color((255,155,192))
    penup()
    goto(x,y)
    pendown()
    seth(0)
    circle(70,20)
    circle(10,330)
    circle(70,30)

def setting():          #参数设置
    pensize(4)
    hideturtle()        #使乌龟无形(隐藏)
    colormode(255)      #将其设置为1.0或255.随后 颜色三元组的r,g,b值必须在0 .. cmode范围内
    color((255,155,192),"pink")
    setup(840,500)
    speed(10)

def main():
    setting()           #画布、画笔设置
    nose(-100,100)      #鼻子
    head(-69,167)       #头
    ears(0,160)         #耳朵
    eyes(0,140)         #眼睛
    cheek(80,10)        #腮
    mouth(-20,30)       #嘴
    body(-32,-8)        #身体
    hands(-56,-45)      #手
    foot(2,-177)        #脚
    tail(148,-155)      #尾巴
    done()

if __name__ == '__main__':
    main()

img

1.10.5 老虎

# coding=utf-8
from turtle import *
import time

COLOR = '#B2814D'

def set_start(x, y, w, c=COLOR):
    penup()
    setx(x)
    sety(y)
    setheading(towards(0, 0))
    width(w)
    pencolor(c)
    pendown()
    speed(0)

def left_rotate(time, angle, length):
    for i in range(time):
        left(angle)
        forward(length)

def right_rotate(time, angle, length):
    for i in range(time):
        right(angle)
        forward(length)

def draw_circle(radius, color, color2=''):
    if color2 == '':
        color2 = color
    penup()
    setheading(towards(0, 0))
    right(90)
    pencolor(color)
    pendown()
    begin_fill()
    circle(radius)
    fillcolor(color2)
    end_fill()

def fill_color(color):
    def decorator_all(func):
        def wrapper(*args, **kwargs):
            begin_fill()
            func(*args, **kwargs)
            fillcolor(color)
            end_fill()
        return wrapper
    return decorator_all

def fill_color_patch(x, y, c='#fffffb'):
    set_start(x, y, 1, c=c)
    forward(1)

def head_outline():
    set_start(0, -40, 2.5)
    right(90)
    left_rotate(5, 3, 14)
    left_rotate(5, 8, 8)
    left_rotate(10, 5, 6.5)
    left_rotate(5, 5.5, 10)
    left_rotate(25, 4, 10)
    left_rotate(6, 5.5, 5)
    left_rotate(7, 3, 7)
    left_rotate(5, 10, 8)
    left_rotate(5, 3, 14)

@fill_color('#fdb933')
def draw_head():
    head_outline()
    pencolor('#CDCDCD')
    goto(0, -40)

@fill_color('#fffffb')
def draw_face():
    set_start(0, -40, 2.5)
    right(90)
    left_rotate(5, 3, 14)
    left_rotate(1, 80, 2.5)
    pencolor('#fffffb')
    left_rotate(12, 5, 6.5)
    left_rotate(5, 6, 15)
    left_rotate(5, 5, 10)
    left_rotate(5, 12, 10)
    backward(0.5)
    left(65)
    pencolor(COLOR)
    backward(3)
    left_rotate(5, 3, 14)
    forward(5)

def draw_moustache():
    fill_color_patch(-41, -31)
    begin_fill()
    set_start(-41, -31, 2.5)
    right(180)
    left_rotate(4, 20, 4)
    left_rotate(1, 90, 8)
    right(150)
    left_rotate(4, 25, 3)
    forward(6)
    left_rotate(1, 110, 5.5)
    right(165)
    left_rotate(4, 15, 3.2)
    left(150)
    right_rotate(3, 30, 2.2)
    right_rotate(1, 105, 5)
    left(130)
    right_rotate(6, 5, 1.8)
    right_rotate(1, 130, 2)
    left(60)
    left_rotate(2, 30, 1)
    left_rotate(4, 28, 4)
    fillcolor('#fffffb')
    end_fill()
    set_start(-45, -28, 2.5)
    right(70)
    left_rotate(5, 2.5, 4)
    left_rotate(4, 9, 3)
    left_rotate(5, 3, 4.5)

def draw_mouth():
    set_start(-17, 22, 2.5)
    right_rotate(1, 45, 14)
    left_rotate(1, 85, 35)
    left_rotate(1, 70, 7)
    set_start(-17, 22, 2.5)
    right_rotate(1, 45, 14)
    right_rotate(1, 78, 36)
    right_rotate(1, 65, 6)
    set_start(-17, 22, 2.5)
    right_rotate(1, 45, 14)
    left_rotate(1, 85, 30)
    right_rotate(1, 108, 12)
    right_rotate(1, 140, 5)
    set_start(-17, 22, 2.5)
    right_rotate(1, 45, 14)
    right_rotate(1, 75, 28)
    left_rotate(1, 85, 10)
    left_rotate(1, 130, 8)
    set_start(3, 0, 2.5)
    left(90)
    right_rotate(5, 5, 4.8)
    right_rotate(4, 18, 1.8)
    left_rotate(1, 3, 27)
    right_rotate(4, 18, 1)
    right_rotate(1, 15, 22)
    right(88)
    right_rotate(9, 1, 4.5)
    begin_fill()
    set_start(3, 0, 2.5)
    left(90)
    right_rotate(4, 5, 4.8)
    right_rotate(1, 5, 2)
    right_rotate(1, 67, 37)
    right_rotate(1, 86, 18)
    fillcolor('#f15a22')
    end_fill()
    begin_fill()
    set_start(3, 0, 2.5)
    pencolor('#aa2116')
    left(90)
    right_rotate(2, 5, 6)
    right(120)
    left_rotate(10, 6, 2)
    right(55)
    left_rotate(11, 5.5, 1.8)
    right_rotate(1, 110, 10)
    right(100)
    right_rotate(9, 1, 4.5)
    fillcolor('#aa2116')
    end_fill()
    set_start(3, 0, 2.5)
    left(90)
    right_rotate(5, 5, 4.8)
    right_rotate(4, 18, 1.8)
    left_rotate(1, 3, 27)
    right_rotate(4, 18, 1)
    right_rotate(1, 15, 22)
    right(88)
    right_rotate(9, 1, 4.5)
    set_start(21, 10, 1, c='#fdb933')
    draw_circle(2.3, '#fdb933')
    set_start(10, 16, 1, c='#fdb933')
    draw_circle(2.3, '#fdb933')
    set_start(21, 19, 1, c='#fdb933')
    draw_circle(2.3, '#fdb933')
    set_start(-57, 16, 1, c='#fdb933')
    draw_circle(2.3, '#fdb933')
    set_start(-51, 24, 1, c='#fdb933')
    draw_circle(2.3, '#fdb933')
    set_start(-64, 24, 1, c='#fdb933')
    draw_circle(2.3, '#fdb933')

def draw_nose():
    set_start(6, 37, 1)
    pencolor('#e0861a')
    right(150)
    begin_fill()
    left_rotate(6, 3, 4)
    left_rotate(6, 15, 3)
    left_rotate(6, 3, 4)
    fillcolor('#e0861a')
    end_fill()
    set_start(6, 37, 1.5)
    right(120)
    begin_fill()
    left_rotate(5, 4, 4)
    left_rotate(3, 10, 3)
    left_rotate(5, 4, 4)
    left_rotate(7, 15, 0.8)
    left_rotate(5, 4, 4)
    left_rotate(5, 8, 2)
    left_rotate(5, 4, 4)
    left_rotate(7, 15, 0.8)
    fillcolor('#b4532a')
    end_fill()
    set_start(-16, 36, 1)
    pencolor('#d1923f')
    right(75)
    begin_fill()
    right_rotate(4, 15, 2)
    right_rotate(5, 26, 1)
    right_rotate(4, 15, 2)
    right_rotate(5, 26, 1)
    fillcolor('#d1923f')
    end_fill()
    set_start(-25, 25, 1)
    pencolor('#130c0e')
    left(110)
    begin_fill()
    left_rotate(6, 15, 1.5)
    left_rotate(5, 15, 1)
    fillcolor('#130c0e')
    end_fill()
    set_start(-10, 24, 1)
    pencolor('#130c0e')
    left(175)
    begin_fill()
    right_rotate(6, 15, 1.2)
    right_rotate(5, 15, 1)
    fillcolor('#130c0e')
    end_fill()

def draw_eye():
    set_start(-50, 34, 1, c='#130c0e')
    left(115)
    begin_fill()
    left_rotate(8, 6.5, 7)
    left_rotate(5, 15, 7)
    left_rotate(5, 10, 5.5)
    left_rotate(5, 15, 6)
    left_rotate(5, 5, 9.5)
    left_rotate(4, 30, 2)
    fillcolor('#130c0e')
    end_fill()
    set_start(-57, 40, 1, c='#fffffb')
    left(112)
    begin_fill()
    left_rotate(8, 6.5, 5)
    left_rotate(5, 15, 6)
    left_rotate(5, 10, 4.5)
    left_rotate(5, 15, 5)
    left_rotate(5, 6.5, 7)
    left_rotate(4, 15, 2)
    fillcolor('#fffffb')
    end_fill()
    set_start(-90, 62, 1, c='#563624')
    draw_circle(15, '#563624')
    set_start(-84, 59, 1, c='#130c0e')
    draw_circle(9, '#130c0e')
    set_start(-90, 63, 1, c='#fffffb')
    draw_circle(3.5, '#fffffb')
    set_start(16, 25, 1, c='#130c0e')
    right(150)
    begin_fill()
    right_rotate(8, 6.5, 7)
    right_rotate(5, 15, 7)
    right_rotate(5, 10, 5.5)
    right_rotate(5, 15, 6)
    right_rotate(5, 5, 9.5)
    right_rotate(4, 30, 2)
    fillcolor('#130c0e')
    end_fill()
    set_start(24, 28, 1, c='#fffffb')
    right(135)
    begin_fill()
    right_rotate(8, 7, 5)
    right_rotate(5, 15, 5.5)
    right_rotate(5, 10, 4.5)
    right_rotate(5, 15, 4.5)
    right_rotate(5, 6.5, 6.5)
    right_rotate(4, 13, 2)
    fillcolor('#fffffb')
    end_fill()
    set_start(57, 48, 1, c='#563624')
    draw_circle(15, '#563624')
    set_start(53, 44, 1, c='#130c0e')
    draw_circle(9, '#130c0e')
    set_start(38, 47, 1, c='#fffffb')
    draw_circle(3.5, '#fffffb')

def draw_brow():
    set_start(12, 88, 1, c='#130c0e')
    right(82)
    begin_fill()
    left_rotate(3, 3, 5)
    right_rotate(5, 4, 6)
    right_rotate(7, 24, 2.3)
    right_rotate(3, 5, 4.5)
    left_rotate(1, 90, 8)
    left(95)
    left_rotate(3, 8, 5)
    right_rotate(3, 25, 1.2)
    right_rotate(3, 11, 1.5)
    right_rotate(3, 25, 1.2)
    right_rotate(3, 3, 4.5)
    left_rotate(1, 85, 7)
    left_rotate(1, 90, 15)
    right_rotate(5, 30, 2.2)
    right_rotate(3, 9, 6)
    right_rotate(6, 3, 5)
    right_rotate(8, 18, 1.3)
    right_rotate(3, 10, 5.3)
    left_rotate(1, 90, 8)
    left(112)
    right_rotate(3, 3, 4.5)
    right_rotate(3, 25, 1)
    right_rotate(3, 10, 1.5)
    right_rotate(3, 28, 1)
    left_rotate(3, 5, 3)
    left_rotate(3, 25, 1)
    left_rotate(3, 5, 1.8)
    left_rotate(1, 90, 17)
    right_rotate(3, 35, 0.8)
    right_rotate(3, 10, 3)
    fillcolor('#130c0e')
    end_fill()
    set_start(88, -16, 1, c='#130c0e')
    begin_fill()
    right_rotate(5, 15, 3)
    right_rotate(4, 5.5, 3)
    right_rotate(3, 28, 1)
    right_rotate(5, 6, 4)
    fillcolor('#130c0e')
    end_fill()
    set_start(106, 9, 1, c='#130c0e')
    right(15)
    begin_fill()
    right_rotate(5, 5, 5.5)
    right_rotate(5, 29, 3)
    right_rotate(5, 5, 4.5)
    fillcolor('#130c0e')
    end_fill()
    set_start(110, 36, 1, c='#130c0e')
    left(20)
    begin_fill()
    right_rotate(3, 10, 2)
    right_rotate(3, 10, 6)
    right_rotate(5, 29, 2)
    forward(20)
    fillcolor('#130c0e')
    end_fill()
    set_start(75, 76, 1, c='#130c0e')
    right(105)
    begin_fill()
    left_rotate(5, 10, 4)
    right_rotate(6, 28, 2)
    right_rotate(5, 10, 5)
    right_rotate(6, 25, 2)
    fillcolor('#130c0e')
    end_fill()
    set_start(-75, 100, 1, c='#130c0e')
    right(108)
    begin_fill()
    right_rotate(3, 3, 8)
    right_rotate(4, 35, 2)
    right_rotate(8, 9, 3.2)
    fillcolor('#130c0e')
    end_fill()
    set_start(-145, 58, 1, c='#130c0e')
    right(30)
    begin_fill()
    left_rotate(5, 15, 5)
    left_rotate(3, 18, 3)
    left(92)
    right_rotate(4, 5, 6)
    right_rotate(1, 5, 4)
    fillcolor('#130c0e')
    end_fill()
    set_start(-148, 46, 1, c='#130c0e')
    left(40)
    begin_fill()
    right_rotate(5, 10, 6.5)
    right_rotate(4, 32, 2)
    right_rotate(4, 10, 6.5)
    fillcolor('#130c0e')
    end_fill()
    set_start(-138, 7, 1, c='#130c0e')
    left(10)
    begin_fill()
    left_rotate(5, 8, 4)
    left_rotate(6, 20, 1.5)
    left_rotate(4, 8, 4.5)
    fillcolor('#130c0e')
    end_fill()
    head_outline()

def draw_ear():
    set_start(101, 74, 2.5)
    left(150)
    begin_fill()
    left_rotate(5, 6, 3)
    left_rotate(5, 12, 5)
    left_rotate(3, 13, 12)
    left_rotate(5, 12, 7)
    left_rotate(4, 16, 5)
    fillcolor('#fdb933')
    end_fill()
    set_start(94, 89, 1, c='#f3715c')
    right(168)
    begin_fill()
    left_rotate(5, 17, 6)
    left_rotate(4, 20, 5)
    goto(94, 89)
    fillcolor('#f3715c')
    end_fill()
    set_start(-125, 98, 2.5)
    right(165)
    begin_fill()
    right_rotate(5, 6, 3)
    right_rotate(5, 12, 5)
    right_rotate(3, 13, 12)
    right_rotate(5, 12, 7)
    right_rotate(4, 16, 4.5)
    fillcolor('#fdb933')
    end_fill()
    set_start(-115, 110, 1, c='#f3715c')
    left(160)
    begin_fill()
    right_rotate(5, 17, 6)
    right_rotate(4, 20, 5.5)
    goto(-115, 110)
    fillcolor('#f3715c')
    end_fill()
    head_outline()

def draw_cap():
    set_start(55, 123, 2.5)
    right(150)
    left_rotate(13, 11, 12)
    set_start(18, 170, 2.5)
    right(180)
    begin_fill()
    left_rotate(10, 16, 4)
    fillcolor('#130c0e')
    end_fill()
    set_start(55, 123, 2.5)
    right(150)
    begin_fill()
    left_rotate(13, 11, 12)
    fillcolor('#FF0000')
    end_fill()
    set_start(55, 123, 2.5)
    right(113)
    begin_fill()
    left_rotate(15, 5, 8.6)
    fillcolor('#228B22')
    end_fill()
    set_start(30, 142, 2.5)
    right(170)
    left_rotate(18, 8.9, 5)
    set_start(-2, 150, 2.5)
    left(178)
    right_rotate(4, 5, 6)
    set_start(55, 123, 2.5)
    begin_fill()
    goto(50.13, 124.56)
    setheading(148.5)
    left_rotate(12, 4, 10)
    fillcolor('#fdb933')
    end_fill()

def draw_shadow():
    fill_color_patch(75, -155)
    _draw_shadow()

@fill_color('#fab27b')
def _draw_shadow():
    set_start(75, -155, 1, c='#fab27b')
    left_rotate(5, 8, 5)
    left_rotate(10, 4, 10)
    left_rotate(5, 6, 9)
    left_rotate(4, 30, 4.5)
    left_rotate(5, 3.5, 16)
    left_rotate(3, 3.5, 18)
    left_rotate(3, 8, 5)
    left_rotate(4, 20, 1.5)
    goto(75, -155)

def draw_body():
    fill_color_patch(0, -40)
    set_start(0, -40, 2.5)
    right(90)
    begin_fill()
    left_rotate(2, 3, 14)
    width(2.4)
    goto(53, -74)
    pencolor('#87481f')
    left(20)
    right_rotate(5, 16, 1.3)
    right_rotate(4, 8, 8)
    right_rotate(1, 15, 2)
    right_rotate(1, 30, 7)
    right_rotate(3, 28, 2)
    right_rotate(1, 5, 4)
    right_rotate(1, 90, 6)
    right_rotate(1, 180, 10)
    right_rotate(3, 5, 8)
    right_rotate(3, 10, 6.5)
    right_rotate(2, 15, 2)
    right_rotate(4, 7, 4.5)
    left_rotate(2, 18, 1)
    left_rotate(4, 12, 5)
    left_rotate(4, 15, 3)
    left_rotate(4, 7, 4)
    right_rotate(1, 82, 2)
    right_rotate(4, 8, 7)
    right_rotate(2, 12, 2)
    right_rotate(4, 28, 1.5)
    right_rotate(1, 10, 6)
    right_rotate(1, 60, 4.5)
    right(170)
    right_rotate(5, 10, 5)
    right_rotate(10, 2.5, 5)
    goto(-71.81, -32.68)
    setheading(345.5)
    width(2.5)
    pencolor(COLOR)
    left_rotate(2, 3, 14)
    fillcolor('#fdb933')
    end_fill()
    set_start(0, -42, 1)
    right(90)
    pencolor('#fffffb')
    begin_fill()
    right_rotate(5, 12, 5)
    right_rotate(3, 13, 15)
    right_rotate(3, 25, 12)
    backward(1)
    right(23)
    left_rotate(3, 15, 6)
    right(5)
    right_rotate(3, 20, 11)
    right_rotate(3, 15, 12)
    right_rotate(3, 15, 10)
    right_rotate(1, 15, 20)
    fillcolor('#fffffb')
    end_fill()
    set_start(37, -125, 1)
    pencolor('#130c0e')
    begin_fill()
    right_rotate(1, 5, 8)
    right_rotate(4, 30, 1.5)
    right_rotate(1, 20, 6)
    fillcolor('#130c0e')
    end_fill()
    set_start(29, -130, 1)
    pencolor('#130c0e')
    begin_fill()
    left(20)
    right_rotate(2, 5, 5)
    left_rotate(4, 30, 1.5)
    left_rotate(2, 10, 4)
    right_rotate(3, 20, 2)
    left(155)
    left_rotate(3, 8, 5)
    fillcolor('#130c0e')
    end_fill()
    set_start(-62, -139, 1)
    pencolor('#130c0e')
    begin_fill()
    right(65)
    left_rotate(2, 10, 4)
    left_rotate(3, 25, 1.5)
    left_rotate(1, 10, 2)
    left_rotate(3, 28, 1.5)
    right_rotate(3, 10, 3.5)
    fillcolor('#130c0e')
    end_fill()
    set_start(-71, -118, 1)
    pencolor('#130c0e')
    begin_fill()
    right(50)
    left_rotate(4, 10, 2.5)
    left_rotate(5, 28, 1.5)
    right_rotate(3, 10, 2.5)
    fillcolor('#130c0e')
    end_fill()
    set_start(-75, -94, 1)
    pencolor('#130c0e')
    begin_fill()
    right(30)
    left_rotate(4, 10, 2.5)
    left_rotate(5, 28, 1.5)
    right_rotate(3, 10, 2.5)
    fillcolor('#130c0e')
    end_fill()

def draw_left_hand():
    set_start(0, -40, 2.5)
    right(90)
    left_rotate(4, 3, 14)
    left_rotate(1, 3, 8)
    right_rotate(1, 33, 3)
    begin_fill()
    left_rotate(1, 0, 4)
    left_rotate(3, 7, 7)
    left_rotate(4, 18, 3.8)
    set_start(103, -26, 2.5)
    right_rotate(3, 20, 4.5)
    right_rotate(3, 20, 2.5)
    right_rotate(2, 20, 2)
    right_rotate(2, 18, 5)
    right_rotate(5, 30, 1.5)
    right_rotate(1, 5, 8)
    right_rotate(1, 180, 2)
    right_rotate(2, 40, 3.5)
    set_start(106, -8, 2.5)
    right(90)
    right_rotate(2, 10, 4)
    right_rotate(4, 24, 3)
    right_rotate(2, 10, 4)
    right_rotate(2, 20, 5)
    right_rotate(5, 26, 1.2)
    right_rotate(2, 10, 4)
    right_rotate(1, 190, 4)
    right_rotate(1, 90, 3)
    set_start(128, -12, 2.5)
    left(155)
    right_rotate(3, 20, 5.5)
    right_rotate(2, 25, 1.5)
    right_rotate(1, 25, 4)
    right_rotate(3, 25, 2)
    right_rotate(2, 10, 3)
    set_start(124, -30, 2.5)
    left(150)
    right_rotate(8, 25, 2)
    right_rotate(1, 15, 3)
    right_rotate(2, 28, 2)
    set_start(115, -35, 2.5)
    left(100)
    right_rotate(5, 26, 1.8)
    right_rotate(1, 25, 5)
    set_start(103, -31, 2.5)
    left(135)
    right_rotate(5, 10, 5)
    right_rotate(4, 15, 6)
    left_rotate(1, 100, 7)
    right(120)
    right_rotate(3, 12, 2.5)
    left(170)
    right_rotate(3, 15, 3)
    right(110)
    right_rotate(3, 12, 3)
    left(140)
    right_rotate(3, 12, 3)
    right(120)
    right_rotate(3, 10, 3.5)
    left_rotate(1, 125, 10)
    right_rotate(3, 23, 3)
    right_rotate(3, 9, 9.5)
    fillcolor('#fdb933')
    end_fill()
    set_start(115, -35, 2.5)
    left(100)
    begin_fill()
    right_rotate(5, 26, 1.8)
    right_rotate(1, 25, 5)
    pencolor('#fffffb')
    width(1)
    left(90)
    right_rotate(4, 40, 2)
    left(90)
    right_rotate(4, 40, 1)
    left_rotate(1, 135, 5)
    right(80)
    right_rotate(3, 26, 4.5)
    right(130)
    left_rotate(3, 28, 3)
    fillcolor('#fffffb')
    end_fill()
    set_start(61, -33, 1)
    left(118)
    pencolor('#130c0e')
    begin_fill()
    right_rotate(3, 5, 3.5)
    right_rotate(4, 32, 1.5)
    right_rotate(3, 12, 2.7)
    fillcolor('#130c0e')
    end_fill()
    set_start(78, -36, 1)
    left(110)
    pencolor('#130c0e')
    begin_fill()
    left_rotate(3, 5, 3.5)
    right(50)
    right_rotate(4, 20, 1)
    right_rotate(5, 10, 3)
    fillcolor('#130c0e')
    end_fill()
    set_start(94, -35, 1)
    left(125)
    pencolor('#130c0e')
    begin_fill()
    left_rotate(3, 5, 2)
    right(50)
    right_rotate(4, 25, 2)
    right_rotate(3, 10, 2.2)
    fillcolor('#130c0e')
    end_fill()

def draw_right_hand():
    fill_color_patch(-44.24, -37.54)
    set_start(-44.24, -37.54, 2.5)
    setheading(351.5)
    begin_fill()
    right(177)
    right_rotate(4, 3, 14)
    right(3)
    goto(-106, -22)
    set_start(-106, -22, 2.5)
    right(175)
    right_rotate(3, 5, 5.5)
    right_rotate(3, 22, 4)
    right(80)
    left_rotate(2, 25, 4)
    left_rotate(4, 35, 5.5)
    left_rotate(3, 30, 1.5)
    left_rotate(3, 20, 2)
    left_rotate(1, 10, 2.5)
    right(120)
    left_rotate(3, 20, 2.5)
    set_start(-143, -2, 2.5)
    left(120)
    left_rotate(4, 25, 3.5)
    left_rotate(1, 35, 3)
    left_rotate(2, 15, 3)
    left_rotate(5, 22, 3.5)
    left_rotate(2, 20, 2.5)
    set_start(-155, -7, 2.5)
    left(170)
    left_rotate(2, 35, 3.5)
    left_rotate(2, 12, 4.5)
    left_rotate(3, 28, 4)
    left_rotate(3, 10, 3)
    left_rotate(3, 28, 3.5)
    set_start(-158, -27, 2.5)
    right(130)
    left_rotate(3, 30, 2.5)
    left_rotate(4, 13, 4)
    left_rotate(4, 35, 2.5)
    set_start(-135, -25, 2.5)
    right(95)
    left_rotate(3, 12, 9)
    left_rotate(4, 12, 4)
    right_rotate(1, 90, 8)
    left(120)
    left_rotate(3, 12, 3)
    right(160)
    left_rotate(3, 10, 4)
    left(120)
    left_rotate(3, 12, 3.5)
    right(145)
    left_rotate(3, 10, 3.5)
    left(125)
    left_rotate(3, 10, 3.5)
    right_rotate(1, 135, 10)
    fillcolor('#fdb933')
    end_fill()
    fill_color_patch(-107, -23)
    begin_fill()
    set_start(-107, -23, 1)
    pencolor('#130c0e')
    right(90)
    right_rotate(3, 3, 3.5)
    left_rotate(5, 25, 1)
    left_rotate(3, 15, 3.2)
    fillcolor('#130c0e')
    end_fill()
    fill_color_patch(-122, -25)
    begin_fill()
    set_start(-122, -25, 1)
    pencolor('#130c0e')
    right(120)
    left_rotate(3, 5, 2)
    left_rotate(4, 30, 1.4)
    left_rotate(3, 15, 3)
    fillcolor('#130c0e')
    end_fill()

def draw_clothes():
    set_start(0, -40, 2.5)
    right(90)
    begin_fill()
    left_rotate(3, 3, 14)
    goto(47.57, -36.43)
    setheading(94.25)
    left(171)
    left_rotate(3, 9, 9.5)
    left_rotate(1, 9, 3)
    left_rotate(2, 23, 2.5)
    right(150)
    left_rotate(3, 10, 5)
    right_rotate(3, 10, 10)
    right_rotate(1, 20, 4)
    right_rotate(2, 10, 4)
    right(90)
    left_rotate(5, 5, 10)
    fillcolor('#FF0000')
    end_fill()
    set_start(0, -40, 2.5)
    right(90)
    begin_fill()
    left_rotate(1, 3, 14)
    left_rotate(1, 3, 13)
    right(88)
    right_rotate(5, 5, 10)
    goto(21.85, -91.11)
    setheading(197.25)
    right_rotate(1, 20, 4)
    right_rotate(2, 10, 4)
    right(90)
    left_rotate(5, 5, 10)
    fillcolor('#228B22')
    end_fill()
    set_start(-44.24, -37.54, 2.5)
    setheading(351.5)
    begin_fill()
    right(177)
    right_rotate(2, 3, 14)
    right_rotate(1, 3, 7)
    left(65)
    left_rotate(4, 7, 10)
    left_rotate(3, 6, 10)
    left_rotate(1, 0, 2)
    left(128)
    right_rotate(6, 7, 6.1)
    right_rotate(2, 7, 6.1)
    left(125)
    right_rotate(5, 4, 11)
    fillcolor('#FF0000')
    end_fill()
    set_start(-44.24, -37.54, 2.5)
    setheading(351.5)
    begin_fill()
    right(177)
    right_rotate(1, 3, 14)
    right_rotate(1, 3, 8)
    left(92)
    left_rotate(4, 8, 7)
    right(10)
    right_rotate(4, 3, 6)
    goto(-59.29, -87.30)
    setheading(2.5)
    right_rotate(2, 7, 6.1)
    left(125)
    right_rotate(5, 4, 11)
    fillcolor('#228B22')
    end_fill()

def draw_tail():
    set_start(53, -74, 2.4, c='#87481f')
    begin_fill()
    setheading(26)
    right_rotate(5, 16, 1.3)
    right_rotate(1, 8, 8)
    right_rotate(1, 8, 4)
    left(60)
    right_rotate(1, 3, 3)
    pencolor(COLOR)
    forward(5)
    right_rotate(4, 3, 8)
    left_rotate(3, 3, 7)
    left_rotate(2, 5, 3)
    left_rotate(5, 6, 6)
    left_rotate(3, 8, 7)
    left_rotate(5, 12, 6)
    left_rotate(5, 10, 6)
    left_rotate(5, 15, 2)
    left_rotate(2, 20, 2)
    left_rotate(3, 10, 3)
    right_rotate(2, 13, 5)
    right_rotate(2, 20, 6)
    right_rotate(2, 12, 6)
    right_rotate(5, 7.5, 5)
    right_rotate(6, 3, 4)
    left_rotate(4, 2, 8.5)
    fillcolor('#fdb933')
    end_fill()
    set_start(53, -74, 2.4, c='#87481f')
    begin_fill()
    setheading(26)
    right_rotate(5, 16, 1.3)
    right_rotate(1, 8, 8)
    right_rotate(1, 8, 3)
    left(60)
    right_rotate(1, 3, 2)
    pencolor('#130c0e')
    left_rotate(3, 25, 2)
    left_rotate(3, 5, 1.8)
    left_rotate(1, 78, 8.5)
    fillcolor('#130c0e')
    end_fill()
    set_start(83, -81, 1, c='#130c0e')
    begin_fill()
    left(140)
    right_rotate(5, 8, 2)
    left_rotate(1, 105, 5)
    right_rotate(2, 3, 5.5)
    left(50)
    left_rotate(3, 15, 4.1)
    fillcolor('#130c0e')
    end_fill()
    set_start(109, -89, 1, c='#130c0e')
    begin_fill()
    left(150)
    right_rotate(3, 5, 2)
    right_rotate(4, 15, 2)
    left_rotate(1, 125, 6)
    left_rotate(2, 3, 7)
    left(85)
    left_rotate(3, 15, 6.05)
    left(68)
    right_rotate(3, 5, 5)
    fillcolor('#130c0e')
    end_fill()
    set_start(132, -88, 1, c='#130c0e')
    begin_fill()
    left(180)
    right_rotate(5, 10, 4.1)
    left_rotate(1, 100, 6)
    left_rotate(2, 5, 7)
    left(75)
    left_rotate(5, 10, 5)
    left(75)
    right_rotate(3, 8, 4.5)
    fillcolor('#130c0e')
    end_fill()
    set_start(150, -71, 1, c='#130c0e')
    begin_fill()
    right(140)
    right_rotate(5, 15, 5.8)
    left_rotate(1, 130, 6)
    left_rotate(2, 10, 5)
    left(30)
    left_rotate(5, 15, 5.6)
    left(81)
    right_rotate(3, 8, 3)
    fillcolor('#130c0e')
    end_fill()
    set_start(147, -51, 1, c='#130c0e')
    begin_fill()
    right(125)
    right_rotate(5, 10, 4)
    left(145)
    left_rotate(2, 10, 6.5)
    left_rotate(6, 14, 2)
    left_rotate(4, 22, 2)
    fillcolor('#130c0e')
    end_fill()

def draw_drum():
    set_start(-136, -12, 2, c='#87481f')
    begin_fill()
    right_rotate(1, 78, 17)
    right_rotate(5, 30, 1.2)
    right_rotate(1, 30, 17)
    fillcolor('#FF0000')
    end_fill()
    set_start(-140, -2, 2, c='#87481f')
    begin_fill()
    left_rotate(1, 108, 10)
    right_rotate(1, 90, 4)
    left_rotate(5, 16, 7)
    left_rotate(5, 19, 6.5)
    forward(4)
    left_rotate(5, 18, 7.5)
    left_rotate(5, 18, 6.1)
    left_rotate(1, 180, 3)
    left_rotate(1, 95, 10)
    fillcolor('#FF0000')
    end_fill()
    set_start(-156.34, 48.19, 1, c='#87481f')
    setheading(199)
    left(12)
    left_rotate(10, 14.5, 5.8)
    set_start(-140, 12, 1, c='#87481f')
    setheading(20)
    begin_fill()
    left_rotate(5, 14, 5.2)
    left_rotate(3, 15, 4.5)
    left_rotate(5, 18, 5)
    left_rotate(5, 16, 5.5)
    left_rotate(3, 18, 5)
    fillcolor('#fffffb')
    end_fill()
    set_start(-143, 14, 2.5, c='#FF0000')
    left_rotate(1, 117, 17)
    left_rotate(1, 90, 9)
    left(90)
    left_rotate(3, 5, 3.5)
    set_start(-146.8, 14, 2.5, c='#FF0000')
    left_rotate(1, 120, 14)
    set_start(-150, 34, 2.5, c='#FF0000')
    left_rotate(1, 120, 8.5)
    left(100)
    left_rotate(3, 17, 4)
    set_start(-140, 16, 2.5, c='#FF0000')
    left_rotate(1, 115, 14)
    right_rotate(1, 90, 13)
    right(90)
    right_rotate(4, 16, 4.5)
    set_start(-136, 18, 2.4, c='#FF0000')
    left_rotate(1, 112, 12)
    set_start(-142, 24, 2.5, c='#FF0000')
    left_rotate(1, 35, 10)
    set_start(-145, 32, 2.5, c='#FF0000')
    left_rotate(1, 115, 6)
    right_rotate(1, 85, 10)
    right(40)
    right_rotate(3, 18, 2)
    right_rotate(1, 95, 10)
    set_start(-149, 44, 2.5, c='#FF0000')
    left(60)
    right_rotate(3, 22, 3)
    set_start(-166, 20, 2.4)
    right(100)
    right_rotate(4, 32, 3)
    right_rotate(2, 12, 3.5)
    left_rotate(2, 10, 4)
    left_rotate(4, 25, 2.5)
    set_start(-196, 35, 2.4)
    draw_circle(3.5, COLOR, '#FF0000')
    set_start(-127, 38, 2.4)
    left(60)
    right_rotate(4, 32, 3)
    right_rotate(2, 12, 3.5)
    left_rotate(6, 28, 2)
    left_rotate(3, 15, 2)
    set_start(-115, 33, 2.4)
    draw_circle(3.5, COLOR, '#FF0000')

if __name__ == '__main__':
    title('小老虎')
    setup(420, 400, 150, 150)
    screensize(400, 380, '#FFE4E1')
    time.sleep(3)
    draw_head()
    draw_face()
    draw_eye()
    draw_nose()
    draw_mouth()
    draw_ear()
    draw_cap()
    draw_brow()
    draw_shadow()
    draw_body()
    draw_moustache()
    draw_left_hand()
    draw_right_hand()
    draw_clothes()
    draw_tail()
    draw_drum()
    set_start(1000, 1000, 2.5)
    done()

img

至此,你学会使用Python-Turtle库了吗?

  • 30
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
TurtlePython语言中一个很流行的绘制图像的函数。它提供了一系列的函数可以通过控制一个虚拟的海龟来进行图形绘制。其中一些常用的函数包括: - turtle.forward(distance): 向当前画笔方向移动distance像素长度。 - turtle.backward(distance): 向当前画笔相反方向移动distance像素长度。 - turtle.right(degree): 顺时针移动degree°。 - turtle.left(degree): 逆时针移动degree°。 - turtle.pendown(): 移动时绘制图形,缺省时也为绘制。 - turtle.goto(x,y): 将画笔移动到指定的坐标(x,y)处。 下面是一个使用Turtle绘制艺术图的例子: ```python import turtle as tur import colorsys as cs tur.speed(0) # 设置绘制速度 tur.width(1) # 设置线条宽度 tur.bgcolor('black') # 设置背景颜色 h = 0.0 for j in range(4): for i in range(100): tur.color(cs.hsv_to_rgb(h,1,1)) # 根据HSV颜色模型设置颜色 tur.circle(10 * (i+1)) # 绘制圆形 h += 0.01 tur.right(90) tur.hideturtle() # 隐藏画笔 tur.done() # 结束绘制 ``` 这段代码将绘制一个四彩虹的图形,具体的绘制过程是循环绘制100个不同大小的圆形,并根据HSV颜色模型设置每个圆形的颜色。最后,通过调用`tur.hideturtle()`隐藏画笔并调用`tur.done()`结束绘制。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [详解Python绘图Turtle](https://download.csdn.net/download/weixin_38722184/12858850)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Python绘图Turtle详解](https://blog.csdn.net/gongdiwudu/article/details/122594403)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔚蓝慕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值