当前位置:   article > 正文

Turtle库详解

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  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)
  • 1
  • 2
  • 3
  • 4
  • 5

3. turtle.right(angle)

turtle.rt(angle)

  • 参数

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

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

>>> turtle.heading()
0.0
>>> turtle.right(45)
>>> turtle.heading()
315.0
  • 1
  • 2
  • 3
  • 4
  • 5
  1. turtle.left(angle)

turtle.lt(angle)

  • 参数

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

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

>>> turtle.heading()
315.0
>>> turtle.left(45)
>>> turtle.heading()
0.0
  • 1
  • 2
  • 3
  • 4
  • 5
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  1. turtle.setx(x)
  • 参数

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

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

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

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

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

>>> turtle.position()
(0.00,40.00)
>>> turtle.sety(-10)
>>> turtle.position()
(0.00,-10.00)
  • 1
  • 2
  • 3
  • 4
  • 5
  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
  • 2
  • 3
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. turtle.stamp()

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

>>> turtle.color("blue")
>>> turtle.stamp()
11
>>> turtle.fd(50)
  • 1
  • 2
  • 3
  • 4
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  1. turtle.undo()

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

>>> for i in range(4):
...     turtle.fd(50); turtle.lt(80)
...
>>> for i in range(8):
...     turtle.undo()
  • 1
  • 2
  • 3
  • 4
  • 5
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

1.3.2 获取海龟的状态

  1. turtle.position()

  2. turtle.pos()

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

>>> turtle.pos()
(440.00,-0.00)
  • 1
  • 2
  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
  • 2
  • 3
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. turtle.heading()

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

>>> turtle.home()
>>> turtle.left(67)
>>> turtle.heading()
67.0
  • 1
  • 2
  • 3
  • 4
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  1. turtle.radians()

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

>>> turtle.home()
>>> turtle.left(90)
>>> turtle.heading()
90.0
>>> turtle.radians()
>>> turtle.heading()
1.5707963267948966
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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
  • 2
  • 3
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  1. turtle.isdown()

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

>>> turtle.penup()
>>> turtle.isdown()
False
>>> turtle.pendown()
>>> turtle.isdown()
True
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

另参见: 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
  • 2
  • 3
  • 4
  • 5
  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
  • 2
  • 3
  • 4
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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  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
  • 2

1.3.5 海龟状态

1.3.5.1 可见性
  1. turtle.hideturtle()

turtle.ht()

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

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

turtle.st()

使海龟可见。

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

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

>>> turtle.hideturtle()
>>> turtle.isvisible()
False
>>> turtle.showturtle()
>>> turtle.isvisible()
True
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
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
  • 2
  • 3
  • 4
  • 5
  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
  • 2
  • 3
  • 4
  • 5
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. turtle.shearfactor(shear=None)
  • 参数

    shear — 数值 (可选)

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

 >>> turtle.shape("circle")
 >>> turtle.shapesize(5,2)
 >>> turtle.shearfactor(0.5)
 >>> turtle.shearfactor()
 0.5
  • 1
  • 2
  • 3
  • 4
  • 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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
  • 2
  • 3
  • 4
  • 5
  • 6
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  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
  • 2
  • 3
  • 4

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
  • 2
  • 3
  • 4
  • 5
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. turtle.ondrag(fun, btn=1, add=None)
  • 参数
    • fun — 一个函数,调用时将传入两个参数表示在画布上点击的坐标。
    • btn — 鼠标按钮编号,默认值为 1 (鼠标左键)
    • addTrueFalse — 如为 True 则将添加一个新绑定,否则将取代先前的绑定

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

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

>>> turtle.ondrag(turtle.goto)
  • 1

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

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  1. turtle.clone()

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

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

turtle.getpen()

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

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

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

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

    size — 一个整型数值或 None

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

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

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

>>> while undobufferentries():
...     undo()
  • 1
  • 2

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")
    
    • 1
    • 2
    • 3
    • 4
    • 5
  3. 接下来将 Shape 对象添加到 Screen 对象的形状列表并使用它:

    >>> register_shape("myshape", s)
    >>> shape("myshape")
    
    • 1
    • 2

注解

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
  • 2
  • 3
  • 4
  • 5
  • 6
  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
  • 2
  • 3
  • 4
  • 5
  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
  • 2
  • 3
  • 4
  • 5

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/845730
推荐阅读
相关标签