海龟绘图很适合用来引导孩子学习编程。
turtle 模块提供面向对象和面向过程两种形式的海龟绘图基本组件。由于它使用 tkinter 实现基本图形界面,因此需要安装了 Tk 支持的 Python 版本。
面向对象的接口主要使用“2+2”个类:
-
TurtleScreen 类定义图形窗口作为绘图海龟的运动场。
Screen() 函数返回一个 TurtleScreen 子类的单例对象。
TurtleScreen/Screen 的所有方法还存在对应的函数,即作为面向过程的接口组成部分。
-
RawTurtle (别名: RawPen) 类定义海龟对象在 TurtleScreen 上绘图。
从 RawTurtle 派生出子类 Turtle (别名:
Pen
),该类对象在 Screen 实例上绘图,如果实例不存在则会自动创建。RawTurtle/Turtle 的所有方法也存在对应的函数,即作为面向过程的接口组成部分
过程式接口提供与 Screen 和 Turtle 类的方法相对应的函数。函数名与对应的方法名相同。
如果屏幕上需要有多个海龟,就必须使用面向对象的接口。
RawTurtle/Turtle 方法和对应函数
海龟动作
turtle.forward
(distance)、turtle.
fd
(distance)
海龟前进 distance 指定的距离。distance -- 一个数值 (整型或浮点型)。
turtle.back
(distance)、turtle.
bk
(distance)、turtle.
backward
(distance)
海龟后退 distance 指定的距离。distance -- 一个数值 (整型或浮点型)。
import turtle
turtle.fd(200.0)
turtle.bk(100.0)
turtle.done()
turtle.
right
(angle)、turtle.
rt
(angle)
海龟右转 angle 个单位。单位默认为角度,但可通过 degrees() 和 radians() 函数改变设置。)角度的正负由海龟模式确定,参见 mode()。
angle -- 一个数值 (整型或浮点型)。
turtle.
left
(angle)、turtle.
lt
(angle)
海龟左转 angle 个单位。(单位默认为角度,但可通过 degrees() 和 radians() 函数改变设置。) 角度的正负由海龟模式确定,参见 mode()。
参数:angle -- 一个数值 (整型或浮点型)
import turtle
turtle.rt(90.0)
turtle.lt(180.0)
turtle.done()
turtle.
goto
(x, y=None)、turtle.
setpos
(x, y=None)、turtle.
setposition
(x, y=None)
参数:x -- 一个数值或数值对/向量 y -- 一个数值或 None
如果 y 为 None
,x 应为一个表示坐标的数值对或 Vec2D 类对象 (例如 pos() 返回的对象).
海龟移动到一个绝对坐标。如果画笔已落下将会画线。不改变海龟的朝向。
turtle.
setx
(x)
参数:x -- 一个数值 (整型或浮点型)
设置海龟的横坐标为 x,纵坐标保持不变。
turtle.
sety
(y)
参数:y -- 一个数值 (整型或浮点型)
设置海龟的纵坐标为 y,横坐标保持不变。
import turtle
turtle.speed(1)
turtle.goto(100.0, 0)
turtle.goto(100.0, 50.0)
turtle.goto(0, 0)
turtle.setx(100.0)
turtle.sety(50.0)
turtle.done()
turtle.
setheading
(to_angle)、turtle.
seth
(to_angle)
参数:to_angle -- 一个数值 (整型或浮点型)
设置海龟的朝向为 to_angle。以下是以角度表示的几个常用方向:
标准模式 | logo 模式 |
---|---|
0 - 东 | 0 - 北 |
90 - 北 | 90 - 东 |
180 - 西 | 180 - 南 |
270 - 南 | 270 - 西 |
import turtle
turtle.speed(1)
turtle.seth(90)
turtle.done()
turtle.
home
()
海龟移至初始坐标 (0,0),并设置朝向为初始方向 (由海龟模式确定,参见 mode())。
turtle.
circle
(radius, extent=None, steps=None)
参数:radius -- 一个数值 extent -- 一个数值 (或 None
) steps -- 一个整型数 (或 None
)
绘制一个 radius 指定半径的圆。圆心在海龟左边 radius 个单位;extent 为一个夹角,用来决定绘制圆的一部分。如未指定 extent*则绘制整个圆。如果 *extent 不是完整圆周,则以当前画笔位置为一个端点绘制圆弧。如果 radius 为正值则朝逆时针方向绘制圆弧,否则朝顺时针方向。最终海龟的朝向会依据 extent 的值而改变。
import turtle
turtle.speed(1)
turtle.circle(100)
turtle.circle(-100, None, 20)
turtle.goto(200, 0)
turtle.circle(-100, 180, )
turtle.home()
turtle.done()
turtle.
dot
(size=None, *color)
参数:size -- 一个整型数 >= 1 (如果指定) color -- 一个颜色字符串或颜色数值元组
绘制一个直径为 size,颜色为 color 的圆点。如果 size 未指定,则直径取 pensize+4 和 2*pensize 中的较大值。
import turtle
turtle.speed(1)
turtle.dot(50, 'red')
turtle.done()
turtle.
stamp
()
在海龟当前位置印制一个海龟形状。返回该印章的 stamp_id,印章可以通过调用 clearstamp(stamp_id)
来删除。
turtle.
clearstamp
(stampid)
参数:stampid -- 一个整型数,必须是之前 stamp() 调用的返回值
删除 stampid 指定的印章。
turtle.
clearstamps
(n=None)
参数:n -- 一个整型数 (或 None
)
删除全部或前/后 n 个海龟印章。如果 n 为 None
则删除全部印章,如果 n > 0 则删除前 n 个印章,否则如果 n < 0 则删除后 n 个印章。
import turtle
turtle.speed(1)
stamp1 = turtle.stamp()
turtle.goto(100, 100)
stamp2 = turtle.stamp()
turtle.clearstamp(stamp1)
turtle.goto(100, 200)
turtle.clearstamps(1)
turtle.done()
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 将使海龟立即改变朝向。
import turtle
turtle.speed(1)
stamp1 = turtle.stamp()
turtle.goto(100, 100)
turtle.goto(200, 200)
turtle.undo()
turtle.undo()
turtle.done()
获取海龟的状态
turtle.
position
()、turtle.
pos
()
返回海龟当前的坐标 (x,y) (为 Vec2D 矢量类对象)。
import turtle
turtle.speed(1)
turtle.goto(100, 100)
print(turtle.pos())
turtle.done()
turtle.
towards
(x, y=None)
参数:x -- 一个数值或数值对/矢量,或一个海龟实例 y -- 一个数值——如果 x 是一个数值,否则为 None
返回从海龟位置到由 (x,y)、矢量或另一海龟所确定位置的连线的夹角。 此数值依赖于海龟的初始朝向,这又取决于 "standard"/"world" 或 "logo" 模式设置。
import turtle
turtle.speed(1)
print(turtle.towards(4, 4))
turtle.done()
turtle.
xcor
()
返回海龟的 x 坐标。
turtle.
ycor
()
返回海龟的 y 坐标。
turtle.
heading
()
返回海龟当前的朝向 (数值依赖于海龟模式参见 mode())。
import turtle
turtle.speed(1)
turtle.goto(50, 50)
print(turtle.xcor())
print(turtle.ycor())
turtle.left(30)
print(turtle.heading())
turtle.done()
turtle.
distance
(x, y=None)
参数:x -- 一个数值或数值对/矢量,或一个海龟实例 y -- 一个数值——如果 x 是一个数值,否则为 None
返回从海龟位置到由 (x,y),适量或另一海龟对应位置的单位距离。
import turtle
turtle.speed(1)
print(turtle.distance(3,4))
turtle.done()
度量单位设置
turtle.
degrees
(fullcircle=360.0)
参数:fullcircle -- 一个数值
设置角度的度量单位,即设置一个圆周为多少 "度"。默认值为 360 度。
turtle.
radians
()
设置角度的度量单位为弧度。其值等于 degrees(2*math.pi)
。
import math
import turtle
turtle.speed(1)
turtle.left(180)
turtle.radians()
turtle.left(math.pi)
turtle.degrees()
turtle.left(360)
turtle.done()
画笔控制
绘图状态
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。
turtle.
pen
(pen=None, **pendict)
参数:pen -- 一个包含部分或全部下列键的字典 pendict -- 一个或多个以下列键为关键字的关键字参数
返回或设置画笔的属性,以一个包含以下键值对的 "画笔字典" 表示:
shown | pendown | pencolor | fillcolor | pensize |
True/False | True/False | 颜色字符串或颜色元组 | 颜色字符串或颜色元组 | 正数值 |
speed | resizemode | stretchfactor | outline | tilt |
0..10 范围内的数值 | auto或user或noresize | (正数值, 正数值) | 正数值 | 数值 |
此字典可作为后续调用 pen() 时的参数,以恢复之前的画笔状态。另外还可将这些属性作为关键词参数提交。使用此方式可以用一条语句设置画笔的多个属性。
turtle.
isdown
()
如果画笔落下返回 True
,如果画笔抬起返回 False
。
import turtle
turtle.speed(1)
turtle.up()
print('turtle is down:{}'.format(turtle.isdown()))
turtle.down()
print('turtle is down:{}'.format(turtle.isdown()))
turtle.width(10)
turtle.goto(100, 100)
turtle.width(3)
turtle.goto(100, 200)
dict1 = turtle.pen()
for k in dict1.keys():
print('{}:{}'.format(k,dict1[k]))
turtle.done()
颜色控制
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 为多边形,该多边形轮廓也以新设置的画笔颜色绘制。
import turtle
turtle.pencolor('red')
turtle.setx(50)
turtle.pencolor((0, 1, 0))
turtle.setx(100)
print(turtle.pencolor())
turtle.pencolor(0, 0, 1.0)
turtle.setx(150)
turtle.done()
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 为多边形,该多边形内部也以新设置的填充颜色填充。
import turtle
turtle.begin_fill()
turtle.fillcolor('red')
turtle.setx(50)
turtle.sety(50)
turtle.setx(0)
turtle.sety(0)
turtle.end_fill()
turtle.done()
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.
filling
()
返回填充状态 (填充为 True
,否则为 False
)。
turtle.
begin_fill
()
在绘制要填充的形状之前调用。
turtle.
end_fill
()
填充上次调用 begin_fill() 之后绘制的形状。
import turtle
print(turtle.filling())
turtle.begin_fill()
print(turtle.filling())
turtle.color('red', 'blue')
turtle.setx(50)
turtle.sety(50)
turtle.setx(0)
turtle.sety(0)
turtle.end_fill()
turtle.done()
更多绘图控
turtle.
reset
()
从屏幕中删除海龟的绘图,海龟回到原点并设置所有变量为默认值。
turtle.
clear
()
从屏幕中删除指定海龟的绘图。不移动海龟。海龟的状态和位置以及其他海龟的绘图不受影响。
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 为真值,画笔会移至文本的右下角。 默认情况下 move 为 False
。
import turtle
turtle.speed(1)
turtle.penup()
turtle.sety(-50)
turtle.write('start')
turtle.sety(0)
turtle.reset()
turtle.begin_fill()
turtle.color('red', 'blue')
turtle.setx(50)
turtle.sety(50)
turtle.setx(0)
turtle.write((0, 0))
turtle.sety(0)
turtle.end_fill()
turtle.color()
turtle.done()
海龟状态
可见性
turtle.hideturtle
()、turtle.
ht
()
使海龟不可见。当你绘制复杂图形时这是个好主意,因为隐藏海龟可显著加快绘制速度。
turtle.showturtle
()、turtle.
st
()
使海龟可见。
turtle.
isvisible
()
如果海龟显示返回 True
,如果海龟隐藏返回 False
。
import turtle
turtle.speed(1)
turtle.begin_fill()
turtle.color('red', 'blue')
turtle.setx(500)
turtle.sety(250)
turtle.hideturtle()
print(turtle.isvisible())
turtle.setx(0)
turtle.write((0, 0))
turtle.showturtle()
print(turtle.isvisible())
turtle.sety(0)
turtle.end_fill()
turtle.color()
turtle.done()
外观
turtle.
shape
(name=None)
参数:name -- 一个有效的形状名字符串
设置海龟形状为 name 指定的形状名,如未指定形状名则返回当前的形状名。name 指定的形状名应存在于 TurtleScreen 的 shape 字典中。
多边形的形状初始时有以下几种: "arrow", "turtle", "circle", "square", "triangle", "classic"。要了解如何处理形状请参看 Screen 方法 register_shape()。
import turtle
turtle.speed(1)
print(turtle.shape())
turtle.shape("turtle")
print(turtle.shape())
turtle.setx(500)
turtle.shape("circle")
print(turtle.shape())
turtle.sety(250)
turtle.shape("triangle")
print(turtle.shape())
turtle.setx(0)
turtle.shape("classic")
print(turtle.shape())
turtle.sety(0)
turtle.done()
turtle.
resizemode
(rmode=None)
参数:rmode -- 字符串 "auto", "user", "noresize" 其中之一
设置大小调整模式为以下值之一: "auto", "user", "noresize"。如未指定 rmode 则返回当前的大小调整模式。不同的大小调整模式的效果如下:
-
"auto": 根据画笔粗细值调整海龟的外观。
-
"user": 根据拉伸因子和轮廓宽度 (outline) 值调整海龟的外观,两者是由 shapesize() 设置的。
-
"noresize": 不调整海龟的外观大小。
resizemode("user")
会由 shapesize() 带参数使用时被调用。
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.
shearfactor
(shear=None)
参数:shear -- 数值 (可选)
设置或返回当前的剪切因子。根据 share 指定的剪切因子即剪切角度的切线来剪切海龟形状。不 改变海龟的朝向 (移动方向)。如未指定 shear 参数: 返回当前的剪切因子即剪切角度的切线,与海龟朝向平行的线条将被剪切。
import turtle
turtle.speed(1)
turtle.shape("turtle")
turtle.setx(500)
turtle.resizemode('user')
turtle.shapesize(2, 2, 2)
turtle.shearfactor(0.5)
print(turtle.shearfactor())
turtle.done()
turtle.
tilt
(angle)
参数:angle -- 一个数值
海龟形状自其当前的倾角转动 angle 指定的角度,但 不 改变海龟的朝向 (移动方向)。
turtle.
settiltangle
(angle)
参数:angle -- 一个数值
旋转海龟形状使其指向 angle 指定的方向,忽略其当前的倾角,不 改变海龟的朝向 (移动方向)。
turtle.
tiltangle
(angle=None)
参数:angle -- 一个数值 (可选)
设置或返回当前的倾角。如果指定 angle 则旋转海龟形状使其指向 angle 指定的方向,忽略其当前的倾角。不 改变海龟的朝向 (移动方向)。如果未指定 angle: 返回当前的倾角,即海龟形状的方向和海龟朝向 (移动方向) 之间的夹角。
import turtle
turtle.speed(1)
turtle.tilt(30)
turtle.shape("turtle")
turtle.setx(500)
turtle.settiltangle(60)
turtle.sety(250)
turtle.tiltangle(180)
turtle.done()
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。
import turtle
turtle.speed(1)
turtle.shape("square")
turtle.shapesize(4,2)
turtle.shearfactor(-0.5)
print(turtle.shapetransform())
turtle.done()
turtle.
get_shapepoly
()
返回以坐标值对元组表示的当前形状多边形。这可以用于定义一个新形状或一个复合形状的多个组成部分
import turtle
turtle.speed(1)
turtle.shape("square")
turtle.shapetransform(4, -1, 0, 2)
print(turtle.get_shapepoly())
turtle.done()
使用事件
turtle.onclick
(fun, btn=1, add=None)
参数:fun -- 一个函数,调用时将传入两个参数表示在画布上点击的坐标。 btn -- 鼠标按钮编号,默认值为 1 (鼠标左键) add -- True
或 False
-- 如为 True
则将添加一个新绑定,否则将取代先前的绑定
将 fun 指定的函数绑定到鼠标点击此海龟事件。如果 fun 值为 None
,则移除现有的绑定。以下为使用匿名海龟即过程式的示例:
import turtle
turtle.speed(1)
turtle.shape("turtle")
turtle.shapesize(4, 4, 2)
def turn(x, y):
turtle.left(60)
turtle.onclick(turn)
turtle.done()
turtle.
onrelease
(fun, btn=1, add=None)
参数:fun -- 一个函数,调用时将传入两个参数表示在画布上点击的坐标。 btn -- 鼠标按钮编号,默认值为 1 (鼠标左键) add -- True
或 False
-- 如为 True
则将添加一个新绑定,否则将取代先前的绑定
将 fun 指定的函数绑定到在此海龟上释放鼠标按键事件。如果 fun 值为 None
,则移除现有的绑定
import turtle
turtle.speed(1)
turtle.shape("turtle")
turtle.shapesize(4, 4, 2)
def turn(x, y):
turtle.left(60)
turtle.onrelease(turn)
turtle.done()
turtle.
ondrag
(fun, btn=1, add=None)
参数:fun -- 一个函数,调用时将传入两个参数表示在画布上点击的坐标。 btn -- 鼠标按钮编号,默认值为 1 (鼠标左键) add -- True
或 False
-- 如为 True
则将添加一个新绑定,否则将取代先前的绑定
将 fun 指定的函数绑定到在此海龟上移动鼠标事件。如果 fun 值为 None
,则移除现有的绑定。
import turtle
turtle.speed(1)
turtle.shape("turtle")
turtle.shapesize(2, 2, 2)
turtle.ondrag(turtle.goto) # 拖动
turtle.done()
特殊海龟方法
turtle.
begin_poly
()
开始记录多边形的顶点。当前海龟位置为多边形的第一个顶点。
turtle.
end_poly
()
停止记录多边形的顶点。当前海龟位置为多边形的最后一个顶点。它将连线到第一个顶点。
turtle.
get_poly
()
返回最新记录的多边形。
turtle.
clone
()
创建并返回海龟的克隆体,具有相同的位置、朝向和海龟属性。
turtle.
getturtle
()、turtle.
getpen
()
返回海龟对象自身。唯一合理的用法: 作为一个函数来返回 "匿名海龟":
import turtle
turtle.speed(1)
turtle.shape('turtle')
backup1 = turtle.clone() # 备份海龟,具有相同的位置、朝向和海龟属性。
turtle.home()
turtle.begin_poly()
turtle.fd(100)
turtle.shape('arrow')
backup2 = turtle.getturtle() # 取得当前图形
turtle.left(90)
turtle.fd(45)
turtle.home()
turtle.end_poly()
p = turtle.get_poly()
turtle.register_shape("myFavouriteShape", p)
turtle.shape('myFavouriteShape')
turtle.goto(-200, 0) # 当前海龟移动
backup1.goto(0, -200) # 备份海龟移动
backup2.goto(0, 300) # 当前海龟移动
turtle.done()
turtle.
getscreen
()
返回作为海龟绘图场所的 TurtleScreen 类对象。该对象将可调用 TurtleScreen 方法。
import turtle
turtle.getscreen().bgcolor('red')
turtle.done()
turtle.
setundobuffer
(size)
参数:size -- 一个整型数值或 None
设置或禁用撤销缓冲区。 如果 size 为整数,则开辟一个给定大小的空撤销缓冲区。 size 给出了可以通过 undo() 方法/函数撤销海龟动作的最大次数。 如果 size 为 None
,则禁用撤销缓冲区。
turtle.
undobufferentries
()
返回撤销缓冲区里的条目数。
复合形状
要使用由多个不同颜色多边形构成的复合海龟形状,你必须明确地使用辅助类 Shape,具体步骤如下:
-
创建一个空 Shape 对象,类型为 "compound"
-
按照需要使用
addcomponent()
方法向此对象添加多个部件 -
接下来将 Shape 对象添加到 Screen 对象的形状列表并使用它
import turtle
shape1 = turtle.Shape("compound")
poly1 = ((0, 0), (10, -5), (0, 10), (-10, -5))
shape1.addcomponent(poly1, "red", "blue")
poly2 = ((0, 0), (10, -5), (-10, -5))
shape1.addcomponent(poly2, "blue", "red")
turtle.register_shape("myshape", shape1)
turtle.shape("myshape")
turtle.done()
注解
Shape 类在 register_shape() 方法的内部以多种方式使用。应用程序编写者 只有 在使用上述的复合形状时才需要处理 Shape 类。
TurtleScreen/Screen 方法及对应函数
本节中的大部分示例都使用 TurtleScreen 类的一个实例,命名为 screen
。
窗口控制
turtle.
bgcolor
(*args)
参数:args -- 一个颜色字符串或三个取值范围 0..colormode 内的数值或一个取值范围相同的数值3元组
设置或返回 TurtleScreen 的背景颜色。
import turtle
turtle.bgcolor("#800080")
print(turtle.bgcolor())
turtle.done()
turtle.
bgpic
(picname=None)
参数:picname -- 一个字符串, gif-文件名, "nopic"
, 或 None
设置背景图片或返回当前背景图片名称。如果 picname 为一个文件名,则将相应图片设为背景。如果 picname 为 "nopic"
,则删除当前背景图片。如果 picname 为 None
,则返回当前背景图片文件名。
import turtle
print(turtle.bgpic())
turtle.bgpic("landscape.gif")
print(turtle.bgpic())
turtle.done()
turtle.
clear
()
此 TurtleScreen 方法作为全局函数时只有一个名字 clearscreen
。全局函数 clear
所对应的是 Turtle 方法 clear
。
turtle.
clearscreen
()
从中删除所有海龟的全部绘图。将已清空的 TurtleScreen 重置为初始状态: 白色背景,无背景片,无事件绑定并启用追踪。
turtle.
reset
()
注解此 TurtleScreen 方法作为全局函数时只有一个名字 resetscreen
。全局函数 reset
所对应的是 Turtle 方法 reset
。
turtle.
resetscreen
()
重置屏幕上的所有海龟为其初始状态。
turtle.
screensize
(canvwidth=None, canvheight=None, bg=None)
canvwidth | 正整型数,以像素表示画布的新宽度值 |
canvheight | 正整型数,以像素表示画面的新高度值 |
bg | 颜色字符串或颜色元组,新的背景颜色 |
如未指定任何参数,则返回当前的 (canvaswidth, canvasheight)。否则改变作为海龟绘图场所的画布大小。不改变绘图窗口。要观察画布的隐藏区域,可以使用滚动条。通过此方法可以令之前绘制于画布之外的图形变为可见。
import turtle
turtle.screensize(800,600)
print(turtle.screensize())
turtle.done()
turtle.
setworldcoordinates
(llx, lly, urx, ury)
llx | 一个数值, 画布左下角的 x-坐标 |
lly | 一个数值, 画布左下角的 y-坐标 |
urx | 一个数值, 画面右上角的 x-坐标 |
ury | 一个数值, 画布右上角的 y-坐标 |
设置用户自定义坐标系并在必要时切换模式为 "world"。这会执行一次 screen.reset()
。如果 "world" 模式已激活,则所有图形将根据新的坐标系重绘。
注意: 在用户自定义坐标系中,角度可能显得扭曲。
import turtle
turtle.reset()
turtle.setworldcoordinates(-50, -7.5, 50, 7.5)
for _ in range(72):
turtle.left(10)
for _ in range(8):
turtle.left(45);
turtle.fd(2)
turtle.done()
动画控制
turtle.
delay
(delay=None)
参数:delay -- 正整型数
设置或返回以毫秒数表示的延迟值 delay。(这约等于连续两次画布刷新的间隔时间。) 绘图延迟越长,动画速度越慢。
import turtle
turtle.delay(5)
urtle.
tracer
(n=None, delay=None)
参数:n -- 非负整型数 delay -- 非负整型数
启用/禁用海龟动画并设置刷新图形的延迟时间。如果指定 n 值,则只有每第 n 次屏幕刷新会实际执行。(可被用来加速复杂图形的绘制。) 如果调用时不带参数,则返回当前保存的 n 值。第二个参数设置延迟值 (参见 delay())。
import turtle
turtle.speed(1)
turtle.tracer(4, 250)
dist = 2
for i in range(200):
turtle.fd(dist)
turtle.rt(90)
dist += 2
turtle.done()
turtle.
update
()
执行一次 TurtleScreen 刷新。在禁用追踪时使用。
import turtle
turtle.update()
使用屏幕事件
turtle.
listen
(xdummy=None, ydummy=None)
设置焦点到 TurtleScreen (以便接收按键事件)。使用两个 Dummy 参数以便能够传递 listen() 给 onclick 方法。
turtle.
onkey
(fun, key)、turtle.
onkeyrelease
(fun, key)
参数:fun -- 一个无参数的函数或 None key -- 一个字符串: 键 (例如 "a") 或键标 (例如 "space")
绑定 fun 指定的函数到按键释放事件。如果 fun 值为 None
,则移除事件绑定。注: 为了能够注册按键事件,TurtleScreen 必须得到焦点。(参见 method listen() 方法。)
import turtle
turtle.speed(1)
def f():
turtle.fd(50)
turtle.lt(60)
turtle.onkey(f, "Up") # 绑定键盘向上键
turtle.listen()
turtle.done()
turtle.
onkeypress
(fun, key=None)
参数:fun -- 一个无参数的函数或 None key -- 一个字符串: 键 (例如 "a") 或键标 (例如 "space")
绑定 fun 指定的函数到指定键的按下事件。如未指定键则绑定到任意键的按下事件。注: 为了能够注册按键事件,必须得到焦点。(参见 listen() 方法。)
类似:onkey
turtle.onclick
(fun, btn=1, add=None)、turtle.
onscreenclick
(fun, btn=1, add=None)
参数:fun -- 一个函数,调用时将传入两个参数表示在画布上点击的坐标。 btn -- 鼠标按钮编号,默认值为 1 (鼠标左键) add -- True
或 False
-- 如为 True
则将添加一个新绑定,否则将取代先前的绑定
绑定 fun 指定的函数到鼠标点击屏幕事件。如果 fun 值为 None
,则移除现有的绑定。
此 TurtleScreen 方法作为全局函数时只有一个名字 onscreenclick
。全局函数 onclick
所对应的是 Turtle 方法 onclick
。
import turtle
turtle.speed(1)
turtle.onclick(turtle.goto)
turtle.done()
turtle.
ontimer
(fun, t=0)
参数:fun -- 一个无参数的函数 t -- 一个数值 >= 0
安装一个计时器,在 t 毫秒后调用 fun 函数。
import turtle
turtle.speed(1)
running = True
def f():
if running:
turtle.fd(50)
turtle.lt(60)
turtle.ontimer(f, 250)
f() ### makes the turtle march around
running = False
turtle.done()
turtle.
mainloop
()、turtle.
done
()
开始事件循环 - 调用 Tkinter 的 mainloop 函数。必须作为一个海龟绘图程序的结束语句。如果一个脚本是在以 -n 模式 (无子进程) 启动的 IDLE 中运行时 不可 使用 - 用于实现海龟绘图的交互功能。
输入方法
turtle.
textinput
(title, prompt)
参数:title -- string prompt -- string
弹出一个对话框窗口用来输入一个字符串。形参 title 为对话框窗口的标题,prompt 为一条文本,通常用来提示要输入什么信息。返回输入的字符串。如果对话框被取消则返回 None
。:
import turtle
turtle.speed(1)
turtle.textinput("NIM", "Name of first player:")
turtle.done()
turtle.
numinput
(title, prompt, default=None, minval=None, maxval=None)
title | prompt | default | minval | maxval |
string | string | 数值 (可选) | 数值 (可选) | 数值 (可选) |
弹出一个对话框窗口用来输入一个数值。title 为对话框窗口的标题,prompt 为一条文本,通常用来描述要输入的数值信息。default: 默认值, minval: 可输入的最小值, maxval: 可输入的最大值。输入数值的必须在指定的 minval .. maxval 范围之内,否则将给出一条提示,对话框保持打开等待修改。返回输入的数值。如果对话框被取消则返回 None
。
import turtle
turtle.speed(1)
turtle.numinput("Poker", "Your stakes:", 1000, minval=10, maxval=10000)
turtle.done()
设置与特殊方法
turtle.
mode
(mode=None)
参数:mode -- 字符串 "standard", "logo" 或 "world" 其中之一
设置海龟模式 ("standard", "logo" 或 "world") 并执行重置。如未指定模式则返回当前的模式。
"standard" 模式与旧的 turtle 兼容。"logo" 模式与大部分 Logo 海龟绘图兼容。"world" 模式使用用户自定义的 "世界坐标系"。注意: 在此模式下,如果 x/y
单位比率不等于 1 则角度会显得扭曲。
模式 | 初始海龟朝向 | 正数角度 |
---|---|---|
"standard" | 朝右 (东) | 逆时针 |
"logo" | 朝上 (北) | 顺时针 |
turtle.
colormode
(cmode=None)
参数:cmode -- 数值 1.0 或 255 其中之一
返回颜色模式或将其设为 1.0 或 255。构成颜色三元组的 r, g, b 数值必须在 0..cmode 范围之内。
turtle.
getcanvas
()
返回此 TurtleScreen 的 Canvas 对象。供了解 Tkinter 的 Canvas 对象内部机理的人士使用。
turtle.
getshapes
()
返回所有当前可用海龟形状的列表。
import turtle
turtle.speed(1)
print(turtle.getshapes())
turtle.done()
turtle.
register_shape
(name, shape=None)、turtle.
addshape
(name, shape=None)
调用此函数有三种不同方式:
-
name 为一个 gif 文件的文件名, shape 为
None
: 安装相应的图像形状。import turtle turtle.screen.register_shape("turtle.gif") turtle.done()
注解:当海龟转向时图像形状 不会 转动,因此无法显示海龟的朝向!
-
name 为指定的字符串,shape 为由坐标值对构成的元组: 安装相应的多边形形状。
import turtle turtle.register_shape("triangle", ((5,-3), (0,5), (-5,-3))) turtle.done()
-
name 为指定的字符串, 为一个 (复合) Shape 类对象: 安装相应的复合形状。
将一个海龟形状加入 TurtleScreen 的形状列表。只有这样注册过的形状才能通过执行 shape(shapename)
命令来使用。
turtle.
turtles
()
返回屏幕上的海龟列表。
import turtle
turtle.goto(100, 0)
for turtle1 in turtle.turtles():
print(turtle1.color())
turtle1.color("red")
turtle.done()
turtle.
window_height
()
返回海龟窗口的高度。
turtle.
window_width
()
返回海龟窗口的宽度。
import turtle
print(turtle.window_height())
print(turtle.window_width())
turtle.done()
Screen 专有方法, 而非继承自 TurtleScreen
turtle.
bye
()
关闭海龟绘图窗口。
turtle.
exitonclick
()
将 bye()
方法绑定到 Screen 上的鼠标点击事件。
turtle.
setup
(width=_CFG['width'], height=_CFG['height'], startx=_CFG['leftright'], starty=_CFG['topbottom'])
设置主窗口的大小和位置。默认参数值保存在配置字典中,可通过 turtle.cfg
文件进行修改。
参数:
width -- 如为一个整型数值,表示大小为多少像素,如为一个浮点数值,则表示屏幕的占比;默认为屏幕的 50%
height -- 如为一个整型数值,表示高度为多少像素,如为一个浮点数值,则表示屏幕的占比;默认为屏幕的 75%
startx -- 如为正值,表示初始位置距离屏幕左边缘多少像素,负值表示距离右边缘,None
表示窗口水平居中
starty -- 如为正值,表示初始位置距离屏幕上边缘多少像素,负值表示距离下边缘,None
表示窗口垂直居中
turtle.
title
(titlestring)
参数:titlestring -- 一个字符串,显示为海龟绘图窗口的标题栏文本
设置海龟窗口标题为 titlestring 指定的文本。
import turtle
turtle.setup (width=200, height=200, startx=0, starty=0)
# sets window to 200x200 pixels, in upper left of screen
turtle.setup(width=.75, height=0.5, startx=None, starty=None)
# sets window to 75% of screen by 50% of screen and centers
turtle.done()
公共类
class turtle.
RawTurtle
(canvas)、class turtle.
RawPen
(canvas)
参数:canvas -- 一个 tkinter.Canvas
, ScrolledCanvas 或 TurtleScreen 类对象
创建一个海龟。海龟对象具有 "Turtle/RawTurtle 方法" 一节所述的全部方法。
class turtle.
Turtle
RawTurtle 的子类,具有相同的接口,但其绘图场所为默认的 Screen 类对象,在首次使用时自动创建。
class turtle.
TurtleScreen
(cv)
参数:cv -- 一个 tkinter.Canvas
类对象
提供面向屏幕的方法例如 setbg()
等。说明见上文。
class turtle.
Screen
TurtleScreen 的子类,增加了四个方法.
class turtle.
ScrolledCanvas
(master)
参数:master -- 可容纳 ScrolledCanvas 的 Tkinter 部件,即添加了滚动条的 Tkinter-canvas
由 Screen 类使用,使其能够自动提供一个 ScrolledCanvas 作为海龟的绘图场所。
class turtle.
Shape
(type_, data)
参数:type_ -- 字符串 "polygon", "image", "compound" 其中之一
实现形状的数据结构。(type_, data)
必须遵循以下定义:
type_ | data |
---|---|
"polygon" | 一个多边形元组,即由坐标值对构成的元组 |
"image" | 一个图片 (此形式仅限内部使用!) |
"compound" |
|
addcomponent
(poly, fill, outline=None)
参数:poly -- 一个多边形,即由数值对构成的元组 fill -- 一种颜色,将用来填充 poly 指定的多边形 outline -- 一种颜色,用于多边形的轮廓 (如有指定)
import turtle
poly = ((0,0),(10,-5),(0,10),(-10,-5))
s = turtle.Shape("compound")
s.addcomponent(poly, "red", "blue")
turtle.register_shape("myshape", s)
turtle.shape("myshape")
turtle.done()
class turtle.
Vec2D
(x, y)
一个二维矢量类,用来作为实现海龟绘图的辅助类。也可能在海龟绘图程序中使用。派生自元组,因此矢量也属于元组!
提供的运算 (a, b 为矢量, k 为数值):
-
a + b
矢量加法 -
a - b
矢量减法 -
a * b
内积 -
k * a
和a * k
与标量相乘 -
abs(a)
a 的绝对值 -
a.rotate(angle)
旋转