python 标准库 turtle 海龟制图
turtle n 海龟
vi. 捕海龟,捕鳖; (船等)翻没,倾覆;
源码: Lib/turtle.py
概述
海龟绘图很适合用来引导孩子学习编程。 最初来自于 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 于 1967 年所创造的 Logo 编程语言。
请想象绘图区有一只机器海龟,起始位置在 x-y 平面的 (0, 0) 点。先执行 import turtle
,再执行 turtle.forward(15)
,它将(在屏幕上)朝所面对的 x 轴正方向前进 15 像素,随着它的移动画出一条线段。再执行 turtle.right(25)
,它将原地右转 25 度。
通过组合使用此类命令,可以轻松地绘制出精美的形状和图案。
turtle
模块是基于 Python 标准发行版 2.5 以来的同名模块重新编写并进行了功能扩展。
新模块尽量保持了原模块的特点,并且(几乎)100%与其兼容。这就意味着初学编程者能够以交互方式使用模块的所有命令、类和方法——运行 IDLE 时注意加 -n
参数。
turtle 模块提供面向对象和面向过程两种形式的海龟绘图基本组件。由于它使用 tkinter
实现基本图形界面,因此需要安装了 Tk 支持的 Python 版本。
面向对象的接口主要使用“2+2”个类:
TurtleScreen
类定义图形窗口作为绘图海龟的运动场。它的构造器需要一个tkinter.Canvas
或ScrolledCanvas
作为参数。应在turtle
作为某个程序的一部分的时候使用。Screen()
函数返回一个TurtleScreen
子类的单例对象。此函数应在turtle
作为独立绘图工具时使用。作为一个单例对象,其所属的类是不可被继承的。TurtleScreen/Screen 的所有方法还存在对应的函数,即作为面向过程的接口组成部分。
RawTurtle
(别名:RawPen
) 类定义海龟对象在TurtleScreen
上绘图。它的构造器需要一个 Canvas, ScrolledCanvas 或 TurtleScreen 作为参数,以指定 RawTurtle 对象在哪里绘图。从 RawTurtle 派生出子类
Turtle
(别名:Pen
),该类对象在Screen
实例上绘图,如果实例不存在则会自动创建。RawTurtle/Turtle 的所有方法也存在对应的函数,即作为面向过程的接口组成部分。
过程式接口提供与 Screen
和 Turtle
类的方法相对应的函数。函数名与对应的方法名相同。当 Screen 类的方法对应函数被调用时会自动创建一个 Screen 对象。当 Turtle 类的方法对应函数被调用时会自动创建一个 (匿名的) Turtle 对象。
如果屏幕上需要有多个海龟,就必须使用面向对象的接口。
可用的 Turtle 和 Screen 方法概览
Turtle 方法
海龟动作
移动和绘制
backward()
|bk()
|back()
后退goto()
|setpos()
|setposition()
前往/定位setx()
设置x坐标sety()
设置y坐标setheading()
|seth()
设置朝向home()
返回原点circle()
画圆dot()
画点stamp()
印章clearstamp()
清除印章clearstamps()
清除多个印章undo()
撤消speed()
速度获取海龟的状态
position()
|pos()
位置towards()
目标方向xcor()
x坐标ycor()
y坐标heading()
朝向distance()
距离设置与度量单位
degrees()
角度radians()
弧度
画笔控制
绘图状态
pendown()
|pd()
|down()
画笔落下pen()
画笔isdown()
画笔是否落下颜色控制
color()
颜色pencolor()
画笔颜色fillcolor()
填充颜色填充
filling()
是否填充begin_fill()
开始填充end_fill()
结束填充更多绘图控制
reset()
重置clear()
清空write()
书写
海龟状态
可见性
showturtle()
|st()
显示海龟hideturtle()
|ht()
隐藏海龟isvisible()
是否可见外观
shape()
形状resizemode()
大小调整模式shapesize()
|turtlesize()
形状大小shearfactor()
剪切因子settiltangle()
设置倾角tiltangle()
倾角tilt()
倾斜get_shapepoly()
获取形状多边形
使用事件
onclick()
当鼠标点击
onrelease()
当鼠标释放
ondrag()
当鼠标拖动
特殊海龟方法
begin_poly()
开始记录多边形
end_poly()
结束记录多边形
get_poly()
获取多边形
clone()
克隆
getturtle()
| getpen()
获取海龟画笔
getscreen()
获取屏幕
setundobuffer()
设置撤消缓冲区
undobufferentries()
撤消缓冲区条目数
TurtleScreen/Screen 方法
窗口控制
bgcolor()
背景颜色bgpic()
背景图片clear()
|clearscreen()
清屏reset()
|resetscreen()
重置screensize()
屏幕大小setworldcoordinates()
设置世界坐标系动画控制
delay()
延迟tracer()
追踪update()
更新使用屏幕事件
listen()
监听onkey()
|onkeyrelease()
当键盘按下并释放onkeypress()
当键盘按下onclick()
|onscreenclick()
当点击屏幕ontimer()
当达到定时mainloop()
|done()
主循环设置与特殊方法
mode()
模式colormode()
颜色模式getcanvas()
获取画布getshapes()
获取形状register_shape()
|addshape()
添加形状turtles()
所有海龟window_height()
窗口高度window_width()
窗口宽度输入方法
textinput()
文本输入numinput()
数字输入Screen 专有方法
bye()
退出exitonclick()
当点击时退出setup()
设置title()
标题
RawTurtle/Turtle 方法和对应函数
本节中的大部分示例都使用 Turtle 类的一个实例,命名为 turtle
。
海龟动作
turtle.forward
(distance)turtle.fd
(distance)参数distance – 一个数值 (整型或浮点型)海龟前进 distance 指定的距离,方向为海龟的朝向。
1
2
3
4
5
6
7
8turtle.position()
(0.00,0.00)
25) turtle.forward(
turtle.position()
(25.00,0.00)
-75) turtle.forward(
turtle.position()
(-50.00,0.00)
turtle.back
(distance)
turtle.bk
(distance)
turtle.backward
(distance)
- 参数 :distance – 一个数值
海龟后退 distance 指定的距离,方向与海龟的朝向相反。不改变海龟的朝向。
1 | turtle.position() |
turtle.right
(angle)
turtle.rt
(angle)
- 参数:angle – 一个数值 (整型或浮点型)
海龟右转 angle 个单位。(单位默认为角度,但可通过 degrees()
和 radians()
函数改变设置。) 角度的正负由海龟模式确定,参见 mode()
。
1 | turtle.heading() |
turtle.left
(angle)
turtle.lt
(angle)
- 参数:angle – 一个数值 (整型或浮点型)
海龟左转 angle 个单位。(单位默认为角度,但可通过 degrees()
和 radians()
函数改变设置。) 角度的正负由海龟模式确定,参见 mode()
。
1 | turtle.heading() |
turtle.goto
(x, y=None)
turtle.setpos
(x, y=None)
turtle.setposition
(x, y=None)
- 参数:x – 一个数值或数值对/向量y – 一个数值或
None
如果 y 为 None
,x 应为一个表示坐标的数值对或 Vec2D
类对象 (例如 pos()
返回的对象).
海龟移动到一个绝对坐标。如果画笔已落下将会画线。不改变海龟的朝向。
1 | tp = turtle.pos() |
turtle.setx
(x)
- 参数:x – 一个数值 (整型或浮点型)
设置海龟的横坐标为 x,纵坐标保持不变。
1 | turtle.position() |
turtle.sety
(y)
- 参数:y – 一个数值 (整型或浮点型)
设置海龟的纵坐标为 y,横坐标保持不变。
1 | turtle.position() |
turtle.setheading
(to_angle)
turtle.seth
(to_angle)
- 参数:to_angle – 一个数值 (整型或浮点型)
设置海龟的朝向为 to_angle。以下是以角度表示的几个常用方向:
标准模式 | logo 模式 |
---|---|
0 - 东 | 0 - 北 |
90 - 北 | 90 - 东 |
180 - 西 | 180 - 南 |
270 - 南 | 270 - 西 |
1 | 90) turtle.setheading( |
turtle.home
()
海龟移至初始坐标 (0,0),并设置朝向为初始方向 (由海龟模式确定,参见 mode()
)。
1 | turtle.heading() |
turtle.circle
(radius, extent=None, steps=None)
三个参数:
- radius – 一个数值
- extent – 一个数值 (或
None
) - steps – 一个整型数 (或
None
)
绘制一个 radius 指定半径的圆。圆心在海龟左边 radius 个单位;extent 为一个夹角,用来决定绘制圆的一部分。如未指定 extent\则绘制整个圆。如果 *extent 不是完整圆周,则以当前画笔位置为一个端点绘制圆弧。如果 radius 为正值则朝逆时针方向绘制圆弧,否则朝顺时针方向。最终海龟的朝向会依据 extent* 的值而改变。
圆实际是以其内切正多边形来近似表示的,其边的数量由 steps 指定。如果未指定边数则会自动确定。此方法也可用来绘制正多边形。
1 | turtle.home() |
turtle.dot
(size=None, *color)
参数
size – 一个整型数 >= 1 (如果指定)color – 一个颜色字符串或颜色数值元组
绘制一个直径为 size,颜色为 color 的圆点。如果 size 未指定,则直径取 pensize+4 和 2*pensize 中的较大值。
1 | turtle.home() |
turtle.stamp
()
在海龟当前位置印制一个海龟形状。返回该印章的 stamp_id,印章可以通过调用 clearstamp(stamp_id)
来删除。
1 | "blue") turtle.color( |
turtle.clearstamp
(stampid)
参数
stampid – 一个整型数,必须是之前
stamp()
调用的返回值
删除 stampid 指定的印章。
1 | turtle.position() |
turtle.clearstamps
(n=None)
参数
n – 一个整型数 (或
None
)
删除全部或前/后 n 个海龟印章。如果 n 为 None
则删除全部印章,如果 n > 0 则删除前 n 个印章,否则如果 n < 0 则删除后 n 个印章。
1 | for i in range(8): |
turtle.undo
()
撤消 (或连续撤消) 最近的一个 (或多个) 海龟动作。可撤消的次数由撤消缓冲区的大小决定。
1 | for i in range(4): |
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 将使海龟立即改变朝向。
1 | turtle.speed() |
获取海龟的状态
turtle.position
()
turtle.pos
()
返回海龟当前的坐标 (x,y) (为 Vec2D
矢量类对象)。
1 | turtle.pos() |
urtle.towards
(x, y=None)
参数
x – 一个数值或数值对/矢量,或一个海龟实例y – 一个数值——如果 x 是一个数值,否则为
None
从海龟位置到由 (x,y),矢量或另一海龟对应位置的连线的夹角。此数值依赖于海龟初始朝向 - 由 “standard”/“world” 或 “logo” 模式设置所决定)。
1 | 10, 10) turtle.goto( |
turtle.xcor
()
返回海龟的 x 坐标。
1 | turtle.home() |
turtle.ycor
()
返回海龟的 y 坐标。
1 | turtle.home() |
turtle.heading
()
返回海龟当前的朝向 (数值依赖于海龟模式参见 mode()
)。
1 | turtle.home() |
turtle.distance
(x, y=None)
参数
x – 一个数值或数值对/矢量,或一个海龟实例y – 一个数值——如果 x 是一个数值,否则为
None
返回从海龟位置到由 (x,y),适量或另一海龟对应位置的单位距离。
1 | turtle.home() |
度量单位设置
turtle.degrees
(fullcircle=360.0)
参数
fullcircle – 一个数值
设置角度的度量单位,即设置一个圆周为多少 “度”。默认值为 360 度。
1 | turtle.home() |
turtle.radians
()
设置角度的度量单位为弧度。其值等于 degrees(2*math.pi)
。
1 | turtle.home() |
画笔控制
绘图状态
turtle.pendown
()turtle.pd
()turtle.down
()画笔落下 – 移动时将画线。
turtle.penup
()turtle.pu
()turtle.up
()画笔抬起 – 移动时不画线。
turtle.pensize
(width=None)turtle.width
(width=None)¶参数
width – 一个正数值
设置线条的粗细为 width 或返回该值。如果 resizemode 设为 “auto” 并且 turtleshape 为多边形,该多边形也以同样组细的线条绘制。如未指定参数,则返回当前的 pensize。
1 | turtle.pensize() |
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()
时的参数,以恢复之前的画笔状态。另外还可将这些属性作为关键词参数提交。使用此方式可以用一条语句设置画笔的多个属性。
1 | "black", pencolor="red", pensize=10) turtle.pen(fillcolor= |
turtle.isdown
()
如果画笔落下返回 True
,如果画笔抬起返回 False
。
1 | turtle.penup() |
颜色控制
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 为多边形,该多边形轮廓也以新设置的画笔颜色绘制。
1 | colormode() |
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 为多边形,该多边形内部也以新设置的填充颜色填充。
1 | "violet") turtle.fillcolor( |
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 为多边形,该多边形轮廓与填充也使用新设置的颜色。
1 | "red", "green") turtle.color( |
另参见: Screen 方法 colormode()
。
填充
turtle.filling
()
返回填充状态 (填充为 True
,否则为 False
)。
1 | turtle.begin_fill() |
turtle.begin_fill
()¶在绘制要填充的形状之前调用。
turtle.end_fill
()填充上次调用
begin_fill()
之后绘制的形状。自相交多边形或多个形状间的重叠区域是否填充取决于操作系统的图形引擎、重叠的类型以及重叠的层数。 例如上面的 Turtle 多芒星可能会全部填充为黄色,也可能会有一些白色区域。1
2
3
4"black", "red") turtle.color(
turtle.begin_fill()
80) turtle.circle(
turtle.end_fill()
更多绘图控制
turtle.reset
()从屏幕中删除海龟的绘图,海龟回到原点并设置所有变量为默认值。
1
2
3
4
5
6
7
8
9
10
110,-22) turtle.goto(
100) turtle.left(
turtle.position()
(0.00,-22.00)
turtle.heading()
100.0
turtle.reset()
turtle.position()
(0.00,0.00)
turtle.heading()
0.0turtle.clear
()从屏幕中删除指定海龟的绘图。不移动海龟。海龟的状态和位置以及其他海龟的绘图不受影响。
turtle.clear
()从屏幕中删除指定海龟的绘图。不移动海龟。海龟的状态和位置以及其他海龟的绘图不受影响。
turtle.write
(arg, move=False, align=”left”, font=(“Arial”, 8, “normal”))参数arg – 要书写到 TurtleScreen 的对象move – True/Falsealign – 字符串 “left”, “center” 或 “right”font – 一个三元组 (fontname, fontsize, fonttype)书写文本 - arg 指定的字符串 - 到当前海龟位置,align 指定对齐方式 (“left”, “center” 或 right”),font 指定字体。如果 move 为 True,画笔会移动到文本的右下角。默认 move 为
False
。1
2turtle.write("Home = ", True, align="center")
turtle.write((0,0), True)
海龟状态
可见性
turtle.hideturtle
()turtle.ht
()使海龟不可见。当你绘制复杂图形时这是个好主意,因为隐藏海龟可显著加快绘制速度。
>>> turtle.hideturtle()
turtle.showturtle
()turtle.st
()使海龟可见。
1
turtle.showturtle()
turtle.isvisible
()如果海龟显示返回
True
,如果海龟隐藏返回False
。1
2
3
4
5
6turtle.hideturtle()
turtle.isvisible()
False
turtle.showturtle()
turtle.isvisible()
True
外观
turtle.shape
(name=None)- name – 一个有效的形状名字符串
设置海龟形状为 name 指定的形状名,如未指定形状名则返回当前的形状名。name 指定的形状名应存在于 TurtleScreen 的 shape 字典中。多边形的形状初始时有以下几种: “arrow”, “turtle”, “circle”, “square”, “triangle”, “classic”。要了解如何处理形状请参看 Screen 方法
register_shape()
。1
2
3
4
5turtle.shape()
'classic'
"turtle") turtle.shape(
turtle.shape()
'turtle'turtle.resizemode
(rmode=None)¶参数
rmode – 字符串 “auto”, “user”, “noresize” 其中之一
设置大小调整模式为以下值之一: “auto”, “user”, “noresize”。如未指定 rmode 则返回当前的大小调整模式。不同的大小调整模式的效果如下:
- “auto”: 根据画笔粗细值调整海龟的外观。
- “user”: 根据拉伸因子和轮廓宽度 (outline) 值调整海龟的外观,两者是由
shapesize()
设置的。 - “noresize”: 不调整海龟的外观大小。
大小调整模式 (“user”) 会在
shapesize()
带参数调用时生效。1
2
3
4
5turtle.resizemode()
'noresize'
"auto") turtle.resizemode(
turtle.resizemode()
'auto'
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 为平等于其朝向的长度拉伸因子,决定形状轮廓线的粗细。
1 | turtle.shapesize() |
turtle.shearfactor
(shear=None)
参数
shear – 数值 (可选)
设置或返回当前的剪切因子。根据 share 指定的剪切因子即剪切角度的切线来剪切海龟形状。不 改变海龟的朝向 (移动方向)。如未指定 shear 参数: 返回当前的剪切因子即剪切角度的切线,与海龟朝向平行的线条将被剪切。
1 | "circle") turtle.shape( |
turtle.tilt
(angle)
参数
angle – 一个数值
海龟形状自其当前的倾角转动 angle 指定的角度,但 不 改变海龟的朝向 (移动方向)。
1 | turtle.reset() |
turtle.settiltangle
(angle)
参数
angle – 一个数值
旋转海龟形状使其指向 angle 指定的方向,忽略其当前的倾角,不 改变海龟的朝向 (移动方向)。
1 | turtle.reset() |
3.1 版后已移除.
turtle.tiltangle
(angle=None)
参数
angle – 一个数值 (可选)
设置或返回当前的倾角。如果指定 angle 则旋转海龟形状使其指向 angle 指定的方向,忽略其当前的倾角。不 改变海龟的朝向 (移动方向)。如果未指定 angle: 返回当前的倾角,即海龟形状的方向和海龟朝向 (移动方向) 之间的夹角。
1 | turtle.reset() |
turtle.shapetransform
(t11=None, t12=None, t21=None, t22=None)
参数
t11 – 一个数值 (可选)t12 – 一个数值 (可选)t21 – 一个数值 (可选)t12 – 一个数值 (可选)
设置或返回海龟形状的当前变形矩阵。
如不指定任何矩阵元素,则返回以4元素元组表示的变形矩阵。否则使用指定元素设置变形矩阵改变海龟形状,矩阵第一排的值为 t11, t12,第二排的值为 t21, t22。行列式 t11 t22 - t12 t21 的值不能为零,否则会出错。根据指定的矩阵修改拉伸因子,剪切因子和倾角。
1 | turtle = Turtle() |
turtle.get_shapepoly
()
返回以坐标值对元组表示的当前形状多边形。这可以用于定义一个新形状或一个复合形状的多个组成部分。
1 | "square") turtle.shape( |