标准库:turtle --- 海龟绘图

Lib/turtle.py

海龟绘图很适合用来引导孩子学习编程。


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

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

  1. TurtleScreen 类定义图形窗口作为绘图海龟的运动场。

    Screen() 函数返回一个 TurtleScreen 子类的单例对象。

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

  2. 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(xy=None)、turtle.setpos(xy=None)、turtle.setposition(xy=None)

参数:x -- 一个数值或数值对/向量 y -- 一个数值或 None

如果 y 为 Nonex 应为一个表示坐标的数值对或 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(radiusextent=Nonesteps=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(xy=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(xy=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 -- 一个或多个以下列键为关键字的关键字参数

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

shownpendownpencolorfillcolorpensize
True/FalseTrue/False颜色字符串或颜色元组颜色字符串或颜色元组正数值
speedresizemodestretchfactoroutlinetilt
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))

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

pencolor(r, g, b)

设置画笔颜色为以 rgb 表示的 RGB 颜色。rgb 的取值范围应为 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))

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

fillcolor(r, g, b)

设置填充颜色为 rgb 表示的 RGB 颜色。rgb 的取值范围应为 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(argmove=Falsealign='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=Nonestretch_len=Noneoutline=None)、turtle.turtlesize(stretch_wid=Nonestretch_len=Noneoutline=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=Nonet12=Nonet21=Nonet22=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(funbtn=1add=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(funbtn=1add=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(funbtn=1add=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,具体步骤如下:

  1. 创建一个空 Shape 对象,类型为 "compound"

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

  3. 接下来将 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=Nonecanvheight=Nonebg=None)

canvwidth 正整型数,以像素表示画布的新宽度值        
canvheight 正整型数,以像素表示画面的新高度值   
bg 颜色字符串或颜色元组,新的背景颜色

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

import turtle
turtle.screensize(800,600)
print(turtle.screensize())
turtle.done()

turtle.setworldcoordinates(llxllyurxury)

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=Nonedelay=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=Noneydummy=None)

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

turtle.onkey(funkey)、turtle.onkeyrelease(funkey)

参数: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(funkey=None)

参数:fun -- 一个无参数的函数或 None​​​​​​​   key -- 一个字符串: 键 (例如 "a") 或键标 (例如 "space")

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

类似:onkey

turtle.onclick(funbtn=1add=None)、turtle.onscreenclick(funbtn=1add=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(funt=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(titleprompt)

参数:​​​​​​​title -- string        prompt -- string

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

import turtle
turtle.speed(1)
turtle.textinput("NIM", "Name of first player:")
turtle.done()

turtle.numinput(titlepromptdefault=Noneminval=Nonemaxval=None)

title prompt default minval maxval 
stringstring数值 (可选)数值 (可选)​​​​​​​ 数值 (可选)

弹出一个对话框窗口用来输入一个数值。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。构成颜色三元组的 rgb 数值必须在 0..cmode 范围之内。

turtle.getcanvas()

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

turtle.getshapes()

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

import turtle
turtle.speed(1)
print(turtle.getshapes())
turtle.done()

turtle.register_shape(nameshape=None)、turtle.addshape(nameshape=None)

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

  1. name 为一个 gif 文件的文件名, shape 为 None: 安装相应的图像形状。

    import turtle
    turtle.screen.register_shape("turtle.gif")
    turtle.done()
    注解:当海龟转向时图像形状 不会 转动,因此无法显示海龟的朝向!
  2. name 为指定的字符串,shape 为由坐标值对构成的元组: 安装相应的多边形形状。

    import turtle
    turtle.register_shape("triangle", ((5,-3), (0,5), (-5,-3)))
    turtle.done()
     
  3. 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"

None (复合形状必须使用 addcomponent() 方法来构建)

addcomponent(polyfilloutline=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(xy)

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

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

  • a + b 矢量加法

  • a - b 矢量减法

  • a * b 内积

  • k * a 和 a * k 与标量相乘

  • abs(a) a 的绝对值

  • a.rotate(angle) 旋转

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值