turtle
— 海龟绘图¶
源代码: Lib/turtle.py
简介¶
海龟绘图是 Logo 中引入的流行几何绘图工具 的一种实现,由 Wally Feurzeig、Seymour Papert 和 Cynthia Solomon 于 1967 年开发。
开始使用¶
想象一下一个机器海龟从 x-y 平面上的 (0, 0) 开始。在 import turtle
之后,给它命令 turtle.forward(15)
,它会在屏幕上沿其面向的方向移动 15 个像素,并在移动时绘制一条线。给它命令 turtle.right(25)
,它会在原地顺时针旋转 25 度。
在 Python 中,海龟绘图提供了物理“海龟”(一个带有画笔的小机器人)的表示,该海龟在地面上的一张纸上绘图。
这是一种有效且经过验证的方法,供学习者接触编程概念并与软件进行交互,因为它提供了即时、可见的反馈。它还提供了对图形输出的便捷访问。
海龟绘图最初是作为一种教育工具创建的,供教师在课堂上使用。对于需要生成一些图形输出的程序员来说,这可能是一种在不增加将更复杂或外部库引入其工作的情况下执行此操作的方法。
教程¶
新用户应该从这里开始。在本教程中,我们将探索一些海龟绘图的基础知识。
启动海龟环境¶
在 Python shell 中,导入 turtle
模块的所有对象
from turtle import *
如果您遇到 No module named '_tkinter'
错误,您需要在系统上安装 Tk 接口 包
。
基本绘图¶
让海龟向前移动 100 步
forward(100)
您应该看到(很可能在显示器上的新窗口中)海龟绘制的一条线,向东移动。更改海龟的方向,使其向左(逆时针)旋转 120 度
left(120)
让我们继续绘制一个三角形
forward(100)
left(120)
forward(100)
请注意,当您引导它时,由箭头表示的海龟会指向不同的方向。
尝试使用这些命令,以及 backward()
和 right()
。
画笔控制¶
尝试更改颜色 - 例如,color('blue')
- 和线条的宽度 - 例如,width(3)
- 然后再次绘制。
您还可以通过抬起笔来移动海龟而不进行绘制:在移动之前使用 up()
。要再次开始绘制,请使用 down()
。
海龟的位置¶
将您的海龟送回其起点(如果它已从屏幕上消失,则很有用)
home()
起始位置位于海龟屏幕的中心。如果您需要知道它们,请使用以下命令获取海龟的 x-y 坐标
pos()
起始位置为 (0, 0)
。
过一段时间后,清除窗口可能会有所帮助,以便我们可以重新开始
clearscreen()
制作算法图案¶
使用循环,可以构建几何图案
for steps in range(100):
for c in ('blue', 'red', 'green'):
color(c)
forward(steps)
right(30)
- 当然,这仅受想象力的限制!
让我们绘制此页面顶部的星形。我们想要红色的线条,用黄色填充
color('red')
fillcolor('yellow')
正如 up()
和 down()
确定是否绘制线条一样,可以打开和关闭填充
begin_fill()
接下来,我们将创建一个循环
while True:
forward(200)
left(170)
if abs(pos()) < 1:
break
abs(pos()) < 1
是知道海龟何时回到其起始位置的好方法。
最后,完成填充
end_fill()
(请注意,只有在您发出 end_fill()
命令时,才会真正进行填充。)
如何…¶
本节介绍一些典型的海龟用例和方法。
尽可能快速上手¶
海龟绘图的乐趣之一是简单命令可以提供的即时、视觉反馈 - 这是向孩子们介绍编程思想的绝佳方法,开销最小(当然,不仅限于儿童)。
海龟模块通过将其所有基本功能公开为函数来实现这一点,这些函数可以通过 from turtle import *
使用。海龟绘图教程 介绍了这种方法。
值得注意的是,许多海龟命令也有更简洁的等效命令,例如 forward()
的 fd()
。当与打字不是一种技能的学习者一起工作时,这些尤其有用。
您需要在系统上安装
Tk 接口 包
,以便海龟绘图正常工作。请注意,这并非总是简单明了的,因此如果您计划与学习者一起使用海龟绘图,请提前检查。
使用 turtle
模块命名空间¶
使用 from turtle import *
很方便 - 但请注意,它会导入大量对象,如果你不只是进行海龟绘图,你可能会遇到名称冲突的风险(如果你在可能导入其他模块的脚本中使用海龟绘图,这个问题会更加突出)。
解决方案是使用 import turtle
- fd()
变为 turtle.fd()
,width()
变为 turtle.width()
,等等。(如果重复输入 “turtle” 变得乏味,可以使用例如 import turtle as t
来代替。)
在脚本中使用海龟绘图¶
建议使用上面立即描述的 turtle
模块命名空间,例如
import turtle as t
from random import random
for i in range(100):
steps = int(random() * 100)
angle = int(random() * 360)
t.right(angle)
t.fd(steps)
不过,还需要另外一个步骤 - 一旦脚本结束,Python 也会关闭海龟的窗口。在脚本末尾添加
t.mainloop()
到脚本末尾。脚本现在会等待被关闭,并且在终止之前不会退出,例如通过关闭海龟绘图窗口。
使用面向对象的海龟绘图¶
另请参阅
除了非常基本的入门目的,或者为了尽可能快地尝试一些东西之外,使用面向对象的方法进行海龟绘图更为常见,而且功能更强大。例如,这允许在屏幕上同时显示多个海龟。
在这种方法中,各种海龟命令是对象的方法(主要是 Turtle
对象)。你可以在 shell 中使用面向对象的方法,但它在 Python 脚本中更为典型。
上面的示例变为
from turtle import Turtle
from random import random
t = Turtle()
for i in range(100):
steps = int(random() * 100)
angle = int(random() * 360)
t.right(angle)
t.fd(steps)
t.screen.mainloop()
请注意最后一行。t.screen
是 Screen
的实例,一个 Turtle 实例存在于其上;它是与海龟一起自动创建的。
海龟的屏幕可以自定义,例如
t.screen.title('Object-oriented turtle demo')
t.screen.bgcolor("orange")
海龟绘图参考¶
注意
在以下文档中,给出了函数的参数列表。当然,方法还有额外的第一个参数 self,这里省略了。
海龟方法¶
- 海龟运动
- 移动和绘制
- 获取海龟的状态
- 设置和测量
- 画笔控制
- 绘图状态
- 颜色控制
- 填充
- 更多绘图控制
- 海龟状态
- 可见性
- 外观
- 使用事件
- 特殊的海龟方法
TurtleScreen/Screen 的方法¶
- 窗口控制
- 动画控制
- 使用屏幕事件
- 设置和特殊方法
- 输入方法
- Screen 特有的方法
RawTurtle/Turtle 的方法和相应的函数¶
本节中的大多数示例都引用一个名为 turtle
的 Turtle 实例。
海龟运动¶
- 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)
- 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)
- turtle.right(angle)¶
- turtle.rt(angle)¶
- 参数:
angle – 一个数字(整数或浮点数)
让海龟向右转动 angle 个单位。(单位默认为度,但可以通过
degrees()
和radians()
函数设置。)角度方向取决于海龟模式,请参见mode()
。>>> turtle.heading() 22.0 >>> turtle.right(45) >>> turtle.heading() 337.0
- turtle.left(angle)¶
- turtle.lt(angle)¶
- 参数:
angle – 一个数字(整数或浮点数)
将海龟向左转动 angle 个单位。(单位默认为度,但可以通过
degrees()
和radians()
函数进行设置。)角度方向取决于海龟模式,请参阅mode()
。>>> turtle.heading() 22.0 >>> turtle.left(45) >>> turtle.heading() 67.0
- turtle.goto(x, y=None)¶
- turtle.setpos(x, y=None)¶
- turtle.setposition(x, y=None)¶
- 参数:
x – 一个数字或一对/一组数字
y – 一个数字或
None
如果 y 是
None
,则 x 必须是一对坐标或一个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)
- turtle.teleport(x, y=None, *, fill_gap=False)¶
- 参数:
x – 一个数字或
None
y – 一个数字或
None
fill_gap – 一个布尔值
将海龟移动到绝对位置。与 goto(x, y) 不同,不会绘制线条。海龟的方向不会改变。如果当前正在填充,则传送离开的多边形将在离开后被填充,并在传送后重新开始填充。可以使用 fill_gap=True 禁用此功能,这将使传送过程中行进的虚线像 goto(x, y) 中一样充当填充屏障。
>>> tp = turtle.pos() >>> tp (0.00,0.00) >>> turtle.teleport(60) >>> turtle.pos() (60.00,0.00) >>> turtle.teleport(y=10) >>> turtle.pos() (60.00,10.00) >>> turtle.teleport(20, 30) >>> turtle.pos() (20.00,30.00)
在 3.12 版本中添加。
- turtle.setx(x)¶
- 参数:
x – 一个数字(整数或浮点数)
将海龟的第一个坐标设置为 x,保持第二个坐标不变。
>>> turtle.position() (0.00,240.00) >>> turtle.setx(10) >>> turtle.position() (10.00,240.00)
- turtle.sety(y)¶
- 参数:
y – 一个数字(整数或浮点数)
将海龟的第二个坐标设置为 y,保持第一个坐标不变。
>>> turtle.position() (0.00,40.00) >>> turtle.sety(-10) >>> turtle.position() (0.00,-10.00)
- 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
- 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
- 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
- turtle.dot(size=None, *color)¶
- 参数:
size – 一个整数 >= 1(如果给出)
color – 一个颜色字符串或数字颜色元组
使用 color 绘制一个直径为 size 的圆形点。如果未给出 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
- turtle.stamp()¶
在当前海龟位置将海龟形状的副本印在画布上。返回该印章的 stamp_id,可以通过调用
clearstamp(stamp_id)
来删除它。>>> turtle.color("blue") >>> stamp_id = turtle.stamp() >>> turtle.fd(50)
- 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)
- turtle.clearstamps(n=None)¶
- 参数:
n – 一个整数(或
None
)
删除海龟的所有或第一个/最后一个 n 个印章。如果 n 为
None
,则删除所有印章;如果 n > 0,则删除前 n 个印章;如果 n < 0,则删除最后 n 个印章。>>> for i in range(8): ... unused_stamp_id = turtle.stamp() ... turtle.fd(30) >>> turtle.clearstamps(2) >>> turtle.clearstamps(-2) >>> turtle.clearstamps()
- turtle.undo()¶
(重复)撤消最后一个海龟操作。可用的撤消操作数由撤消缓冲区的大小决定。
>>> for i in range(4): ... turtle.fd(50); turtle.lt(80) ... >>> for i in range(8): ... turtle.undo()
- 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
告知海龟的状态¶
- turtle.towards(x, y=None)¶
- 参数:
x – 一个数字或一对/一组数字或一个海龟实例
y – 如果 x 是一个数字,则为数字,否则为
None
返回海龟位置到 (x,y) 指定的位置、向量或另一只海龟之间的线条的角度。这取决于海龟的起始方向,而起始方向取决于模式 - “standard”/”world” 或 “logo”。
>>> turtle.goto(10, 10) >>> turtle.towards(0,0) 225.0
- turtle.xcor()¶
返回海龟的 x 坐标。
>>> turtle.home() >>> turtle.left(50) >>> turtle.forward(100) >>> turtle.pos() (64.28,76.60) >>> print(round(turtle.xcor(), 5)) 64.27876
- 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
- turtle.heading()¶
返回海龟当前的朝向(值取决于海龟模式,请参阅
mode()
)。>>> turtle.home() >>> turtle.left(67) >>> turtle.heading() 67.0
- 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
测量设置¶
- 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
- turtle.radians()¶
将角度测量单位设置为弧度。等同于
degrees(2*math.pi)
。>>> turtle.home() >>> turtle.left(90) >>> turtle.heading() 90.0 >>> turtle.radians() >>> turtle.heading() 1.5707963267948966
画笔控制¶
绘图状态¶
- turtle.pensize(width=None)¶
- turtle.width(width=None)¶
- 参数:
width – 一个正数
将线条粗细设置为 *width* 或返回它。如果 resizemode 设置为“auto”并且 turtleshape 是一个多边形,则该多边形将以相同的线条粗细绘制。如果没有给出参数,则返回当前画笔大小。
>>> turtle.pensize() 1 >>> turtle.pensize(10) # from here on lines of width 10 are drawn
- 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')]
- turtle.isdown()¶
如果画笔已放下,则返回
True
,如果已抬起,则返回False
。>>> turtle.penup() >>> turtle.isdown() False >>> turtle.pendown() >>> turtle.isdown() True
颜色控制¶
- 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)
- 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)
- 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()
。
填充¶
- turtle.filling()¶
返回填充状态(如果正在填充,则为
True
,否则为False
)。>>> turtle.begin_fill() >>> if turtle.filling(): ... turtle.pensize(5) ... else: ... turtle.pensize(3)
- turtle.begin_fill()¶
在绘制要填充的形状之前调用。
- turtle.end_fill()¶
填充在上次调用
begin_fill()
后绘制的形状。对于自相交的多边形或多个形状,重叠区域是否填充取决于操作系统的图形、重叠类型和重叠数量。例如,上面的海龟星形可以是全部黄色,也可以有一些白色区域。
>>> turtle.color("black", "red") >>> turtle.begin_fill() >>> turtle.circle(80) >>> turtle.end_fill()
更多绘图控制¶
- 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
- turtle.clear()¶
删除屏幕上海龟的绘图。不要移动海龟。海龟的状态和位置以及其他海龟的绘图不受影响。
- turtle.write(arg, move=False, align='left', font=('Arial', 8, 'normal'))¶
- 参数:
arg – 要写入 TurtleScreen 的对象
move – True/False
align – 字符串“left”、“center”或“right”之一
font – 三元组 (字体名称、字体大小、字体类型)
根据给定的字体,按照*align*(“left”、“center”或“right”)在当前海龟位置写入文本 - *arg* 的字符串表示形式。如果 *move* 为 true,则笔会移动到文本的右下角。默认情况下,*move* 为
False
。>>> turtle.write("Home = ", True, align="center") >>> turtle.write((0,0), True)
海龟状态¶
可见性¶
- turtle.hideturtle()¶
- turtle.ht()¶
使海龟不可见。在进行一些复杂的绘图时,这样做是个好主意,因为隐藏海龟会显著加快绘图速度。
>>> turtle.hideturtle()
- turtle.isvisible()¶
如果海龟显示为
True
,如果海龟隐藏为False
,则返回。>>> turtle.hideturtle() >>> turtle.isvisible() False >>> turtle.showturtle() >>> turtle.isvisible() True
外观¶
- turtle.shape(name=None)¶
- 参数:
name – 一个有效的形状名称字符串
将海龟形状设置为具有给定 *name* 的形状,或者,如果未给出名称,则返回当前形状的名称。具有 *name* 的形状必须存在于 TurtleScreen 的形状字典中。最初有以下多边形形状:“arrow”、“turtle”、“circle”、“square”、“triangle”、“classic”。要了解如何处理形状,请参阅 Screen 方法
register_shape()
。>>> turtle.shape() 'classic' >>> turtle.shape("turtle") >>> turtle.shape() 'turtle'
- turtle.resizemode(rmode=None)¶
- 参数:
rmode – 字符串“auto”、“user”、“noresize”之一
将 resizemode 设置为以下值之一:“auto”、“user”、“noresize”。如果未给出 *rmode*,则返回当前 resizemode。不同的 resizemode 具有以下效果
“auto”:根据笔大小的值调整海龟的外观。
“user”:根据拉伸因子和轮廓线宽度(轮廓)的值调整海龟的外观,这些值由
shapesize()
设置。“noresize”:不进行海龟外观的调整。
resizemode("user")
由shapesize()
在使用参数时调用。>>> turtle.resizemode() 'noresize' >>> turtle.resizemode("auto") >>> 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 拉伸因子和/或轮廓。将 resizemode 设置为“user”。当且仅当 resizemode 设置为“user”时,海龟才会根据其拉伸因子进行拉伸显示:*stretch_wid* 是垂直于其方向的拉伸因子,*stretch_len* 是沿其方向的拉伸因子,*outline* 确定形状轮廓的宽度。
>>> 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)
- turtle.shearfactor(shear=None)¶
- 参数:
shear – 数字(可选)
设置或返回当前剪切因子。根据给定的剪切因子 *shear* 剪切海龟形状,该剪切因子是剪切角的正切值。不 更改海龟的航向(移动方向)。如果未给出 *shear*:返回当前剪切因子,即与海龟航向平行的线被剪切的剪切角的正切值。
>>> turtle.shape("circle") >>> turtle.shapesize(5,2) >>> turtle.shearfactor(0.5) >>> turtle.shearfactor() 0.5
- 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)
- turtle.tiltangle(angle=None)¶
- 参数:
angle – 数字(可选)
设置或返回当前倾斜角度。如果给出了角度,则旋转海龟形状以指向 *angle* 指定的方向,而不管其当前的倾斜角度如何。不 更改海龟的航向(移动方向)。如果未给出角度:返回当前倾斜角度,即海龟形状的方向与海龟航向(其移动方向)之间的角度。
>>> turtle.reset() >>> turtle.shape("circle") >>> turtle.shapesize(5,2) >>> turtle.tilt(45) >>> turtle.tiltangle() 45.0
- turtle.shapetransform(t11=None, t12=None, t21=None, t22=None)¶
- 参数:
t11 – 数字(可选)
t12 – 数字(可选)
t21 – 数字(可选)
t12 – 数字(可选)
设置或返回海龟形状的当前变换矩阵。
如果未给出任何矩阵元素,则返回由 4 个元素组成的元组形式的变换矩阵。否则,设置给定的元素并根据由第一行 t11、t12 和第二行 t21、t22 组成的矩阵转换海龟形状。行列式 t11 * t22 - t12 * t21 不得为零,否则会引发错误。根据给定的矩阵修改拉伸因子、剪切因子和倾斜角度。
>>> turtle = Turtle() >>> turtle.shape("square") >>> turtle.shapesize(4,2) >>> turtle.shearfactor(-0.5) >>> turtle.shapetransform() (4.0, -1.0, -0.0, 2.0)
- turtle.get_shapepoly()¶
以坐标对的元组形式返回当前形状多边形。这可用于定义新形状或复合形状的组成部分。
>>> turtle.shape("square") >>> turtle.shapetransform(4, -1, 0, 2) >>> turtle.get_shapepoly() ((50, -20), (30, 20), (-50, 20), (-30, -20))
使用事件¶
- turtle.onclick(fun, btn=1, add=None)
- 参数:
fun – 具有两个参数的函数,它将使用画布上单击点的坐标来调用
btn – 鼠标按钮的编号,默认为 1(鼠标左键)
add –
True
或False
– 如果为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
- turtle.onrelease(fun, btn=1, add=None)¶
- 参数:
fun – 具有两个参数的函数,它将使用画布上单击点的坐标来调用
btn – 鼠标按钮的编号,默认为 1(鼠标左键)
add –
True
或False
– 如果为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.
- turtle.ondrag(fun, btn=1, add=None)¶
- 参数:
fun – 具有两个参数的函数,它将使用画布上单击点的坐标来调用
btn – 鼠标按钮的编号,默认为 1(鼠标左键)
add –
True
或False
– 如果为True
,将添加一个新绑定,否则将替换以前的绑定
将fun绑定到此海龟上的鼠标移动事件。如果fun为
None
,则删除现有绑定。备注:海龟上的每个鼠标移动事件序列都以该海龟上的鼠标点击事件开头。
>>> turtle.ondrag(turtle.goto)
随后,点击并拖动海龟将使其在屏幕上移动,从而产生手绘(如果笔已放下)。
特殊海龟方法¶
- turtle.begin_poly()¶
开始记录多边形的顶点。当前海龟位置是多边形的第一个顶点。
- turtle.end_poly()¶
停止记录多边形的顶点。当前海龟位置是多边形的最后一个顶点。这将与第一个顶点相连。
- 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)
- turtle.clone()¶
创建并返回一个海龟的克隆,具有相同的位置、朝向和海龟属性。
>>> mick = Turtle() >>> joe = mick.clone()
- turtle.getturtle()¶
- turtle.getpen()¶
返回海龟对象本身。唯一合理的用法:作为返回“匿名海龟”的函数
>>> pet = getturtle() >>> pet.fd(50) >>> pet <turtle.Turtle object at 0x...>
- turtle.getscreen()¶
返回海龟正在其上绘图的
TurtleScreen
对象。然后可以为该对象调用TurtleScreen方法。>>> ts = turtle.getscreen() >>> ts <turtle._Screen object at 0x...> >>> ts.bgcolor("pink")
- turtle.setundobuffer(size)¶
- 参数:
size – 一个整数或
None
设置或禁用撤消缓冲区。如果size是一个整数,则安装一个给定大小的空撤消缓冲区。size给出了可以通过
undo()
方法/函数撤消的最大海龟操作数。如果size为None
,则禁用撤消缓冲区。>>> turtle.setundobuffer(42)
- turtle.undobufferentries()¶
返回撤消缓冲区中的条目数。
>>> while undobufferentries(): ... undo()
复合形状¶
要使用由多个不同颜色的多边形组成的复合海龟形状,您必须显式使用辅助类Shape
,如下所述
创建一个类型为“compound”的空Shape对象。
使用
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")
现在将形状添加到屏幕的形状列表并使用它
>>> register_shape("myshape", s) >>> shape("myshape")
注意
Shape
类在内部以不同的方式被register_shape()
方法使用。应用程序程序员只有在使用如上所示的复合形状时才需要处理Shape类!
TurtleScreen/Screen的方法和相应的函数¶
本节中的大多数示例都引用一个名为screen
的TurtleScreen实例。
窗口控制¶
- 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)
- turtle.bgpic(picname=None)¶
- 参数:
picname – 一个字符串,gif文件的名称或
"nopic"
,或None
设置背景图像或返回当前背景图像的名称。如果picname是一个文件名,则将相应的图像设置为背景。如果picname是
"nopic"
,则删除背景图像(如果存在)。如果picname为None
,则返回当前背景图像的文件名。>>> screen.bgpic() 'nopic' >>> screen.bgpic("landscape.gif") >>> screen.bgpic() "landscape.gif"
- turtle.clear()
注意
此TurtleScreen方法仅在全局函数下以名称
clearscreen
可用。全局函数clear
是另一个从海龟方法clear
派生的函数。
- turtle.clearscreen()¶
从TurtleScreen删除所有绘图和所有海龟。将现在为空的TurtleScreen重置为其初始状态:白色背景,无背景图像,无事件绑定并启用跟踪。
- turtle.reset()
注意
此TurtleScreen方法仅在全局函数下以名称
resetscreen
可用。全局函数reset
是另一个从海龟方法reset
派生的函数。
- turtle.resetscreen()¶
将屏幕上的所有海龟重置为其初始状态。
- turtle.screensize(canvwidth=None, canvheight=None, bg=None)¶
- 参数:
canvwidth – 正整数,画布的新宽度(以像素为单位)
canvheight – 正整数,画布的新高度(以像素为单位)
bg – 颜色字符串或颜色元组,新的背景颜色
如果没有给出任何参数,则返回当前(画布宽度,画布高度)。否则,调整海龟在其上绘图的画布的大小。不要更改绘图窗口。要观察画布的隐藏部分,请使用滚动条。使用此方法,可以使先前在画布之外的绘图部分可见。
>>> screen.screensize() (400, 300) >>> screen.screensize(2000,1500) >>> screen.screensize() (2000, 1500)
例如,搜索错误逃脱的海龟 ;-)
- turtle.setworldcoordinates(llx, lly, urx, ury)¶
- 参数:
llx – 一个数字,画布左下角的x坐标
lly – 一个数字,画布左下角的y坐标
urx – 一个数字,画布右上角的x坐标
ury – 一个数字,画布右上角的y坐标
设置用户自定义坐标系,如有必要,切换到“世界”模式。这将执行
screen.reset()
。如果“世界”模式已激活,则所有绘图将根据新坐标重新绘制。注意:在用户自定义坐标系中,角度可能会出现失真。
>>> 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
动画控制¶
- turtle.delay(delay=None)¶
- 参数:
delay – 正整数
设置或返回以毫秒为单位的绘图延迟。(这大约是两个连续画布更新之间的时间间隔。)绘图延迟越长,动画速度越慢。
可选参数
>>> screen.delay() 10 >>> screen.delay(5) >>> screen.delay() 5
- 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
- turtle.update()¶
执行 TurtleScreen 更新。在关闭跟踪器时使用。
另请参见 RawTurtle/Turtle 方法 speed()
。
使用屏幕事件¶
- turtle.listen(xdummy=None, ydummy=None)¶
将焦点设置在 TurtleScreen 上(以便收集按键事件)。提供虚拟参数是为了能够将
listen()
传递给 onclick 方法。
- turtle.onkey(fun, key)¶
- turtle.onkeyrelease(fun, key)¶
- 参数:
fun – 无参数的函数或
None
key – 字符串:键(例如“a”)或键符号(例如“space”)
将 fun 绑定到键的按键释放事件。如果 fun 为
None
,则删除事件绑定。注意:为了能够注册按键事件,TurtleScreen 必须具有焦点。(参见方法listen()
。)>>> def f(): ... fd(50) ... lt(60) ... >>> screen.onkey(f, "Up") >>> screen.listen()
- turtle.onkeypress(fun, key=None)¶
- 参数:
fun – 无参数的函数或
None
key – 字符串:键(例如“a”)或键符号(例如“space”)
如果给出了 key,则将 fun 绑定到 key 的按键按下事件,如果没有给出 key,则绑定到任何按键按下事件。注意:为了能够注册按键事件,TurtleScreen 必须具有焦点。(参见方法
listen()
。)>>> def f(): ... fd(50) ... >>> screen.onkey(f, "Up") >>> screen.listen()
- turtle.onclick(fun, btn=1, add=None)¶
- turtle.onscreenclick(fun, btn=1, add=None)¶
- 参数:
fun – 具有两个参数的函数,它将使用画布上单击点的坐标来调用
btn – 鼠标按钮的编号,默认为 1(鼠标左键)
add –
True
或False
– 如果为True
,将添加一个新绑定,否则将替换以前的绑定
将 fun 绑定到此屏幕上的鼠标点击事件。如果 fun 为
None
,则删除现有绑定。名为
screen
的 TurtleScreen 实例和名为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
派生出来的函数。
- 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
输入方法¶
- turtle.textinput(title, prompt)¶
- 参数:
title – 字符串
prompt – 字符串
弹出一个对话框窗口,用于输入字符串。参数 title 是对话框窗口的标题,prompt 是一个文本,主要描述要输入的信息。返回输入的字符串。如果取消对话框,则返回
None
。>>> screen.textinput("NIM", "Name of first player:")
- turtle.numinput(title, prompt, default=None, minval=None, maxval=None)¶
- 参数:
title – 字符串
prompt – 字符串
default – 数字(可选)
minval – 数字(可选)
maxval – 数字(可选)
弹出一个对话框窗口,用于输入数字。title 是对话框窗口的标题,prompt 是一个文本,主要描述要输入的数值信息。default:默认值,minval:输入的最小值,maxval:输入的最大值。如果给出了这些值,则输入的数字必须在 minval .. maxval 范围内。如果不是,则会发出提示,对话框将保持打开状态以进行更正。返回输入的数字。如果取消对话框,则返回
None
。>>> screen.numinput("Poker", "Your stakes:", 1000, minval=10, maxval=10000)
设置和特殊方法¶
- turtle.mode(mode=None)¶
- 参数:
mode – 字符串 “standard”、“logo” 或 “world” 之一
设置海龟模式 (“standard”, “logo” 或 “world”) 并执行重置。如果未提供 mode,则返回当前模式。
“standard” 模式与旧版
turtle
兼容。“logo” 模式与大多数 Logo 海龟图形兼容。“world” 模式使用用户定义的“世界坐标”。注意:在此模式下,如果x/y
单位比率不等于 1,则角度会失真。模式
海龟的初始朝向
正角度
“standard”
向右 (东)
逆时针
“logo”
向上 (北)
顺时针
>>> mode("logo") # resets turtle heading to north >>> mode() 'logo'
- 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)
- turtle.getcanvas()¶
返回此 TurtleScreen 的画布。对了解如何使用 Tkinter Canvas 的内部人员很有用。
>>> cv = screen.getcanvas() >>> cv <turtle.ScrolledCanvas object ...>
- turtle.getshapes()¶
返回当前所有可用海龟形状的名称列表。
>>> screen.getshapes() ['arrow', 'blank', 'circle', ..., 'turtle']
- turtle.register_shape(name, shape=None)¶
- turtle.addshape(name, shape=None)¶
有三种不同的方式来调用此函数
name 是 gif 文件的名称,而 shape 是
None
:安装相应的图像形状。>>> screen.register_shape("turtle.gif")
注意
图像形状在海龟转向时不会旋转,因此它们不会显示海龟的朝向!
name 是任意字符串,而 shape 是一对坐标的元组:安装相应的多边形形状。
>>> screen.register_shape("triangle", ((5,-3), (0,5), (-5,-3)))
name 是任意字符串,而 shape 是一个(复合)
Shape
对象:安装相应的复合形状。
将海龟形状添加到 TurtleScreen 的形状列表。只有这样注册的形状才能通过发出命令
shape(shapename)
来使用。
- turtle.turtles()¶
返回屏幕上的海龟列表。
>>> for turtle in screen.turtles(): ... turtle.color("red")
- turtle.window_height()¶
返回海龟窗口的高度。
>>> screen.window_height() 480
- turtle.window_width()¶
返回海龟窗口的宽度。
>>> screen.window_width() 640
特定于 Screen 的方法,不继承自 TurtleScreen¶
- turtle.bye()¶
关闭海龟图形窗口。
- turtle.exitonclick()¶
将
bye()
方法绑定到屏幕上的鼠标单击事件。如果配置字典中的值 “using_IDLE” 为
False
(默认值),则也进入主循环。注意:如果使用带有-n
开关(无子进程)的 IDLE,则应在turtle.cfg
中将此值设置为True
。在这种情况下,IDLE 自己的主循环也对客户端脚本有效。
- 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
- turtle.title(titlestring)¶
- 参数:
titlestring – 在海龟图形窗口的标题栏中显示的字符串
将海龟窗口的标题设置为 *titlestring*。
>>> screen.title("Welcome to the turtle zoo!")
公共类¶
- class turtle.RawTurtle(canvas)¶
- class turtle.RawPen(canvas)¶
- 参数:
canvas – 一个
tkinter.Canvas
, 一个ScrolledCanvas
或一个TurtleScreen
创建一个海龟。海龟具有上述描述的所有 “海龟/RawTurtle 的方法”。
- class turtle.ScrolledCanvas(master)¶
- 参数:
master – 一些包含 ScrolledCanvas 的 Tkinter 小部件,即添加了滚动条的 Tkinter 画布
由 Screen 类使用,因此自动提供 ScrolledCanvas 作为海龟的活动区域。
- class turtle.Shape(type_, data)¶
- 参数:
type_ – 字符串 “polygon”、“image”、“compound” 之一
数据结构建模形状。元组
(type_, data)
必须遵循以下规范:type_
data
“polygon”(多边形)
一个多边形元组,即一个坐标对的元组
“image”(图像)
一个图像(此形式仅在内部使用!)
“compound”(复合)
None
(复合形状必须使用addcomponent()
方法构造)
- class turtle.Vec2D(x, y)¶
一个二维向量类,用作实现海龟图形的辅助类。 对于海龟图形程序也可能有用。 从元组派生,所以向量是一个元组!
提供(对于a,b 向量,k 数字)
a + b
向量加法a - b
向量减法a * b
内积k * a
和a * k
与标量的乘法abs(a)
a 的绝对值a.rotate(angle)
旋转
说明¶
一个海龟对象在屏幕对象上绘制,并且海龟面向对象的界面中有许多关键类可以用来创建它们并将它们相互关联。
如果不存在 Screen
实例,Turtle
实例将自动创建一个。
Turtle
是 RawTurtle
的子类,它不会自动创建绘图表面 - 需要为其提供或创建画布。画布可以是 tkinter.Canvas
、ScrolledCanvas
或 TurtleScreen
。
TurtleScreen
是海龟的基本绘图表面。Screen
是 TurtleScreen
的子类,并且包括一些额外的管理其外观(包括大小和标题)和行为的方法。TurtleScreen
的构造函数需要 tkinter.Canvas
或 ScrolledCanvas
作为参数。
海龟图形的功能界面使用 Turtle
和 TurtleScreen
/ Screen
的各种方法。在幕后,每当调用派生自 Screen
方法的函数时,都会自动创建一个屏幕对象。 类似地,每当调用任何派生自 Turtle 方法的函数时,都会自动创建一个海龟对象。
要在屏幕上使用多个海龟,必须使用面向对象的界面。
帮助和配置¶
如何使用帮助¶
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 numbers in 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()
这些修改后的文档字符串与导入时从方法派生的函数定义一起自动创建。
将文档字符串翻译成不同的语言¶
有一个实用程序可以创建一个字典,其键是方法名称,值是 Screen 和 Turtle 类的公共方法的文档字符串。
- turtle.write_docstringdict(filename='turtle_docstringdict')¶
- 参数:
filename – 一个字符串,用作文件名
创建并将文档字符串字典写入具有给定文件名的 Python 脚本。此函数必须显式调用(海龟图形类不使用它)。文档字符串字典将被写入 Python 脚本
filename.py
。它旨在用作将文档字符串翻译成不同语言的模板。
如果您(或您的学生)想用您母语的在线帮助使用 turtle
,您必须翻译文档字符串并将生成的文件另存为例如 turtle_docstringdict_german.py
。
如果您的 turtle.cfg
文件中有相应的条目,则此字典将在导入时被读取并替换原始的英文文档字符串。
在撰写本文时,有德语和意大利语的文档字符串字典。(请将请求发送至 glingl@aon.at。)
如何配置屏幕和海龟¶
内置的默认配置模仿旧海龟模块的外观和行为,以便尽可能保持与它的兼容性。
如果您想使用更好的反映此模块功能的其他配置,或者更适合您需求的配置,例如在教室中使用,您可以准备一个配置文件 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 可以是任何内置的形状,例如:箭头、海龟等。有关更多信息,请尝试
help(shape)
。如果要使用无填充颜色(即让海龟透明),则必须写入
fillcolor = ""
(但所有非空字符串都不能在 cfg 文件中包含引号)。如果要反映海龟的状态,则必须使用
resizemode = auto
。例如,如果您设置
language = italian
,则会在导入时加载 docstringdictturtle_docstringdict_italian.py
(如果它存在于导入路径上,例如与turtle
相同的目录中)。条目 *exampleturtle* 和 *examplescreen* 定义了这些对象在文档字符串中出现的名称。将方法文档字符串转换为函数文档字符串时,将从文档字符串中删除这些名称。
*using_IDLE*:如果您经常使用 IDLE 及其
-n
开关(“无子进程”),请将其设置为True
。这将阻止exitonclick()
进入主循环。
在存储 turtle
的目录中,以及当前工作目录中,可以存在 turtle.cfg
文件。后者将覆盖前者的设置。
Lib/turtledemo
目录包含一个 turtle.cfg
文件。您可以将其作为示例进行研究,并在运行演示时查看其效果(最好不要在演示查看器中运行)。
turtledemo
— 演示脚本¶
turtledemo
包包含一组演示脚本。这些脚本可以使用提供的演示查看器运行和查看,如下所示:
python -m turtledemo
或者,您可以单独运行演示脚本。例如:
python -m turtledemo.bytedesign
turtledemo
包目录包含:
一个演示查看器
__main__.py
,可用于查看脚本的源代码并同时运行它们。多个脚本演示了
turtle
模块的不同功能。可以通过“示例”菜单访问示例。它们也可以独立运行。一个
turtle.cfg
文件,用作如何编写和使用此类文件的示例。
演示脚本为:
名称 |
描述 |
特点 |
---|---|---|
bytedesign |
复杂的经典 turtle 图形图案 |
|
chaos |
绘制 Verhulst 动态图,表明计算机的计算有时会产生与常识预期相反的结果 |
世界坐标 |
clock |
显示计算机时间的模拟时钟 |
乌龟作为时钟的指针,ontimer |
colormixer |
使用 r, g, b 进行实验 |
|
forest |
3 个广度优先树 |
随机化 |
fractalcurves |
Hilbert 和 Koch 曲线 |
递归 |
lindenmayer |
民族数学(印度 kolams) |
L 系统 |
minimal_hanoi |
汉诺塔 |
矩形乌龟作为汉诺塔盘(shape,shapesize) |
nim |
与计算机玩经典的 Nim 游戏,使用三堆棍子。 |
乌龟作为 Nim 棍子,事件驱动(鼠标,键盘) |
paint |
超级简约的绘图程序 |
|
peace |
基本 |
乌龟:外观和动画 |
penrose |
使用风筝和飞镖的非周期性平铺 |
|
planet_and_moon |
引力系统模拟 |
复合形状, |
rosette |
来自维基百科关于 turtle 图形文章的图案 |
|
round_dance |
成对向相反方向旋转的跳舞乌龟 |
复合形状,克隆 shapesize,倾斜,get_shapepoly,更新 |
sorting_animate |
不同排序方法的视觉演示 |
简单对齐,随机化 |
tree |
一个(图形化的)广度优先树(使用生成器) |
|
two_canvases |
简单设计 |
两个画布上的乌龟 |
yinyang |
另一个基本示例 |
玩得开心!
自 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()
调用。
自 Python 3.0 以来的更改¶
已添加
Turtle
方法shearfactor()
、shapetransform()
和get_shapepoly()
。因此,现在可以使用全范围的常规线性变换来变换乌龟形状。tiltangle()
的功能已得到增强:现在可以用于获取或设置倾斜角度。已添加
Screen
方法onkeypress()
,作为onkey()
的补充。由于后者将操作绑定到按键释放事件,因此还为其添加了别名:onkeyrelease()
。已添加方法
Screen.mainloop
,因此在使用Screen
和Turtle
对象时,不再需要使用独立的mainloop()
函数。已添加两种输入方法:
Screen.textinput
和Screen.numinput
。这些会弹出输入对话框,并分别返回字符串和数字。已将两个示例脚本
tdemo_nim.py
和tdemo_round_dance.py
添加到Lib/turtledemo
目录中。