您的位置:首页 > 编程语言 > Python开发

Python笔记之通过turtle库绘制图形(详细介绍turtle库的函数方法)

2020-04-24 07:40 766 查看

文章目录

  • 设置海龟状态
  • 设置和测量
  • 画笔的控制
  • 颜色控制
  • 填充
  • 更多的绘画控制
  • 海龟的属性
  • 外观
  • 事件的使用
  • 特殊的方法
  • 二、类TurtleScreen/Screen的方法
  • 动画控制
  • 画布的事件
  • 输入方法
  • 设置和特殊方法
  • 不是从类TurtleScreen继承的特定于类Screen的方法
  • turtle.cfg文件配置画布和海龟
  • 演示脚本
  • turtle库

    简介

    turtle库是非常适合初学者甚至小朋友使用的简单图形绘制模块。
    自Python2.6版本以后,turtle库就已经成为Python的内嵌模块,无需特别安装。
    turtle库中的指令,形象而简单,它绘制的坐标轴以画布中心点为原点。在标准模式中海龟的初始方向是水平向右(向东),一般情况下是标准模式,可参考函数mode() 进行修改。

    帮助

    1. Python内置的函数help([object])
      函数help() 通过调用内置的交互式帮助系统在帮助文档里面进行查找。如果没有给出参数,帮助系统将在解释器控制台启动。如果参数是字符串,那么该字符串将作为模块、函数、类、方法、关键字或帮助文档主题的名称进行查找,并在控制台上打印帮助页面。如果参数是任何其他类型的对象,则生成该对象的帮助页。
    2. Python自带的帮助文档
      在Python安装路径下的Doc里面可以找到pythonXXX.chm帮助文档。
    3. Python官网的帮助文档
      https://docs.python.org/zh-cn/3.8/index.html

    面向对象和面向过程

    turtle库以面向对象和面向过程的方式提供了基本方法。因为它使用tkinter接口作为基础,所以需要一个安装了Tk支持的Python版本。
    :如果要在画布上使用多个海龟对象,必须使用面向对象的接口。
    在下文给出的所有函数的参数列表中,函数的第一个附加参数self在本文中都省略了。

    • 面向对象的接口在下文中介绍了包含的公共的类。
      以下是面向对象的写法:
    # 第一种写法
    import turtle
    turtle01 = turtle.Turtle()  #创建一个名为turtle01的海龟对象
    turtle01.fd(100)  #调用方法让turtle01这个海龟对象前进
    
    # 第二种写法
    from turtle import Turtle
    turtle01 = Turtle()  #创建一个名为turtle01的海龟对象
    turtle01.fd(100)  #调用方法让turtle01这个海龟对象前进
    • 面向过程的接口提供了从类Screen和类Turtle的方法中派生出来的函数。它们具有与对应方法相同的名称。当调用从Screen方法派生的函数时,将会自动创建一个画布对象。当调用从Turtle方法派生的函数时,将会自动创建一个未命名的海龟对象。
      以下是面向过程的写法:
    # 第一种写法
    import turtle
    turtle.fd(100)  #调用方法让海龟前进
    
    # 第二种写法
    from turtle import *
    fd(100)  #调用方法让海龟前进

    公共的类

    • class turtle.RawTurtle(canvas)或class turtle.RawPen(canvas)
      功能:创建一个海龟对象。它可以调用下文的类RawTurtle/Turtle的所有方法。
      参数canvas:一个由tkinter.Canvas或ScrolledCanvas或TurtleScreen创建的对象。
    • class turtle.Turtle()
      功能:类RawTurtle的子类,继承了类RawTurtle的所有方法,不同的是在第一次调用时会自动创建一个默认的Screen对象。
    • class turtle.TurtleScreen(cv)
      功能:创建一个画布对象。它可以调用下文的类TurtleScreen/Screen的所有方法。
      参数cv:一个由tkinter.Canvas创建的对象。
    • class turtle.Screen()
      功能:类TurtleScreen的子类,继承了类TurtleScreen的所有方法,不同的是另外还增加了四个方法。
    • class turtle.ScrolledCanvas(master)
      功能:使用是类Screen,从而自动提供了一个滚动的画布。
      参数master:一些包含在滚动画布里面的Tkinter小部件,即添加了滚动条的tkinter.Canvas的对象。
    • 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 向量加法
    a - b 向量减法
    a * b 数量积
    k * a 或 a * k 数乘
    abs(a) 向量a的模
    a.rotate(angle) 旋转

    一、类RawTurtle/Turtle的方法

    海龟的运动

    移动和绘图

    1. forward(distance)或fd(distance)
    • 功能
      在海龟前进的方向上,将海龟向前移动指定的距离。
      距离的单位是像素,下面提到的长度单位一般都是像素。
    • 参数
      distance(整数或浮点数):海龟移动的距离。
    2. back(distance)或bk(distance)或backward(distance)
    • 功能
      将海龟向后移动一定距离,与海龟前进的方向相反。但不会改变海龟的方向。
    • 参数
      distance(整数或浮点数):海龟移动的距离。
    3. right(angle)或rt(angle)
    • 功能
      以角度为单位将海龟右转。
      默认单位是角度,但可以通过函数degrees() 和函数redians() 来设置。
      角度方向取决于海龟模式,请参考函数mode()。
    • 参数
      angle(整数或浮点数):海龟右转的角度。
    4. left(angle)或lt(angle)
    • 功能
      以角度为单位将海龟左转。
      默认单位是角度,但可以通过函数degrees() 和 函数redians() 来设置。
      角度方向取决于海龟模式,请参考函数mode()。
    • 参数
      angle(整数或浮点数):海龟左转的角度。
    5. goto(x, y=None)或setpos(x, y=None)或setposition(x, y=None)
    • 功能
      把海龟移到指定的坐标点(x, y)。但不会改变海龟的方向。
      如果y为None,则x必须是一对坐标或一个Vec2D。(例如x可以由函数position() 返回)
      如果画笔状态是放下的,则会画出移动轨迹。
    • 参数
      x(一个数字,或一对坐标,或一个向量):指定的x轴坐标。
      y(一个数字,或None):指定的y轴坐标。
    6. setx(x)
    • 功能
      将海龟的x轴坐标设置为x,y轴坐标不变。
    • 参数
      x(整数或浮点数):设置新的x轴坐标。
    7. sety(y)
    • 功能
      将海龟的y轴坐标设置为y,x轴坐标不变。
    • 参数
      y(整数或浮点数):设置新的y轴坐标。
    8. setheading(to_angle)或seth(to_angle)
    • 功能
      根据to_angle的值设置海龟当前的方向。角度方向取决于海龟模式,请参考函数mode()。
    • 参数
      to_angle(整数或浮点数):设置的角度。以下是一些常用的度数:
    9. home()
    • 功能
      将海龟移动到原点坐标(0, 0),并将其方向设置为其初始方向(方向取决于模式,请参考函数mode())。
    10. circle(radius, extent=None, steps=None)
    • 功能
      画一个给定半径的圆或弧。圆心是在海龟的左侧,相距radius的长度。
    • 参数
      radius(整数或浮点数):决定了圆的半径。可取正负值,如果radius为正,则按逆时针方向画弧,否则按顺时针方向画弧。
      extent(整数或浮点数或None):决定了画弧的范围(例extent=180表示半圆)。弧的一个端点是当前的笔尖。如果没有给出参数,则画出整个圆。最后,海龟的方向会随着extent的大小而改变。
      steps(整数或None):当圆和其内接的正多边形近似时,steps决定了正多边形的边数。如果没有给出,它将自动计算。可用于绘制规则多边形。
    11. dot(size=None, *color)
    • 功能
      用指定颜色来画一个直径size大小的圆点。
    • 参数
      size(大于等于1的整数,或None):决定了圆点的直径。如果没有给出参数,则使用画笔尺寸+4到画笔尺寸*2之间的最大尺寸。
      color(颜色规范字符串,或十六进制颜色码):决定了圆点的颜色。
    12. stamp()
    • 功能
      在画布上以当前海龟的位置复制一个海龟的形状,然后留下印记。
      该函数会返回一个值stampid,它是用来标识留下的印记,可以通过调用函数clearstamp(stampid) 来删除它。
    13. clearstamp(stampid)
    • 功能
      删除指定stampid的海龟印记。
    • 参数
      stampid(整数):必须是前面的==函数stamp()==调用的返回值。
    14. clearstamps(n=None)
    • 功能
      删除所有或前n个/后n个海龟印记。
    • 参数
      n(整数或None):如果n为None,则删除所有印记;如果n>0,删除前n个印记;否则如果n<0,删除后n个印记。
    15. undo()
    • 功能
      撤消最后一个海龟动作。可重复撤消,撤消操作的次数由撤消缓冲区的大小决定。(请参考函数setundobuffer())
    16. speed(speed=None)
    • 功能
      设置海龟的速度,从1到10的速度使画线和转海龟的动画越来越快。
    • 参数
      speed(0到10范围内的整数,或速度规范字符串):如果没有参数,返回当前速度。如果输入的数字大于10或小于0.5,则speed变为0。注意:speed=0表示没有动画发生。
      相关速度规范字符串对应的速度值如下:
      •“fastest”:0
      •“fast”:10
      •“normal”:6
      •“slow”:3
      •“slowest”:1

    设置海龟状态

    1. position()或pos()
    • 功能
      返回海龟的当前位置(x, y)(可作为一个Vec2D向量)。
    2. towards(x, y=None)
    • 功能
      返回从海龟当前位置到指定位置(x, y)或向量或另一只海龟之间的直线方向与初始方向的夹角(矢量的夹角)。
      :只与海龟初始方向有关,与海龟当前方向无关。海龟的初始方向取决于海龟模式。(请参考函数mode())
    • 参数
      x(一个数字,或一对坐标,或一个向量,或另一只海龟对象):指定的x轴坐标。
      y(一个数字,或None):指定的y轴坐标。
    3. xcor()
    • 功能
      返回海龟的x轴坐标。
    4. ycor()
    • 功能
      返回海龟的y轴坐标。
    5. heading()
    • 功能
      返回海龟当前的前进方向,是一个浮点数(数值取决于海龟模式)。
      角度方向取决于海龟模式,请参考函数mode()。
    6. distance(x, y=None)
    • 功能
      返回从海龟当前位置到指定位置(x, y)或向量或另一只海龟之间的距离,以像素为单位。
    • 参数
      x(一个数字,或一对坐标,或一个向量,或另一只海龟对象):指定的x轴坐标。
      y(一个数字,或None):指定的y轴坐标。

    设置和测量

    1. degrees(fullcircle=360.0)
    • 功能
      设置角度测量单位,即设置一个完整圆的相对度数。默认值是360度。
    • 参数
      fullcircle(整数或浮点数):完整圆的相对度数。
    2. radians()
    • 功能
      将角度测量单位设置为弧度。相当于函数degrees(2*math.pi)。

    画笔的控制

    绘画状态

    1. pendown()或pd()或down()
    • 功能
      把画笔放下,当移动的时候会画出轨迹。
    2. penup()或pu()或up()
    • 功能
      把画笔提起,当移动的时候不会画出轨迹。
    3. pensize(width=None)或width(width=None)
    • 功能
      将线的宽度设置为width。
      如果调整模式被设置为“auto”,而海龟形状是一个多边形,则用新设置的相同宽度的线绘制该多边形。(请参考函数resizemode() 和 函数shape())
    • 参数
      width(正数或None):设置的宽度。如果没有给出参数,则返回当前的宽度。
    4. pen(pen=None, **pendict)
    • 功能
      使用关键字的参数来设置画笔的状态和属性。
      这个字典可以用作函数pen()后续调用时的参数,用以恢复到以前的画笔状态。此外,可以将这些属性中的一个或多个作为键值对提供。可以用于在一条语句中设置多个属性。
      :需要附带了解一下字典的概念
      https://www.runoob.com/python3/python3-dictionary.html
    • 参数
      pen:自定义的一个字典名。可以为None。
      pendict:包含一个或多个键值对。
      以下列出了键以及对应的取值:
      • shown:True或False
      • pendown:True或False
      • pencolor:颜色规范字符串,或十六进制颜色码
      • fillcolor:颜色规范字符串,或十六进制颜色码
      • pensize:正数
      • speed:0到10范围内的整数或浮点数
      • resizemode:“auto” 或 “user” 或 “noresize”
      • stretchfactor:(正数,正数)
      • outline:正数
      • tilt:整数或浮点数
    5. isdown()
    • 功能
      如果笔是放下状态的,返回True;如果笔是提起状态的,返回False。

    颜色控制

    1. pencolor(*args)
    • 功能
      返回或设置画笔颜色。如果海龟形状是多边形,则用新设置的画笔颜色绘制该多边形的轮廓。(请参考函数shape())
    • 参数
      允许有以下四种输入格式:
      1、pencolor()
      返回当前画笔的颜色规范字符串或元组。可以作为另一个颜色/画笔颜色/填充颜色调用的输入参数。
      2、pencolor(colorstring)
      将画笔颜色设置为colorstring,这是一个Tk颜色规范字符串,例如"red"、“blue"或”#33cc8c"。
      3、pencolor((r, g, b))
      设置画笔颜色为由r、g和b的元组表示的RGB颜色。r、g和b的每个值都必须在0到colormode的范围内,其中colormode为1.0或255(请参考函数colormode() )。
      4、pencolor(r, g, b)
      设置画笔颜色为r、g和b表示的RGB颜色。r、g和b的每个值都必须在0到colormode范围内,其中colormode为1.0或255(请参考函数colormode())。
    2. fillcolor(*args)
    • 功能
      返回或设置填充颜色。
    • 参数
      允许有以下四种输入格式:
      1、fillcolor()
      2、fillcolor(colorstring)
      3、fillcolor((r, g, b))
      4、fillcolor(r, g, b)
      以上的输入格式可参照 函数pencolor(*args) 的输入格式,这里不再介绍。
    3. color(*args)
    • 功能
      返回或设置画笔颜色和填充颜色。
    • 参数
      允许有以下多种输入格式:
      1、color()
      以函数pencolor()和函数fillcolor()返回的一对颜色规范字符串或元组的形式,返回当前画笔颜色和当前填充颜色。
      2、color(colorstring), color((r,g,b)), color(r,g,b)
      可参照函数pencolor(*args)的输入格式,将填充颜色和画笔颜色都设置为相同颜色值。
      3、color(colorstring1, colorstring2), color((r1,g1,b1), (r2,g2,b2))
      color(colorstring1, colorstring2)相当于pencolor(colorstring1)和fillcolor(colorstring2)两者结合。
      另外一种输入格式也和上述的类似。

    填充

    1. filling()
    • 功能
      返回填充状态(如果填充了则为True,否则为False)。
    2. begin_fill()
    • 功能
      在绘制要填充的图形之前被调用。
    3. end_fill()
    • 功能
      填充最后一次调用==函数begin_fill()==后绘制的图形。

    更多的绘画控制

    1. reset()
    • 功能
      从画布上删除海龟的绘图,重新将海龟居中并将变量设置为默认值。
    2. clear()
    • 功能
      从画布上删除海龟的绘图,但不会移动海龟,而且海龟的状态和位置以及其他海龟的绘图不受影响。
    3. write(arg, move=False, align=“left”, font=(“Arial”, 8, “normal”))
    • 功能
      将文本按设置的对齐方式和给定的字体格式写在当前的海龟位置。
    • 参数
      arg(字符串对象):写在画布上的文本。
      move(True/False):如果move为True,则将海龟移动到文本的右下角,否则不移动。默认情况下,move为False。
      align(“left"或"center"或"right”):对齐方式。
      font(包含三项(字体名称、字体大小、字体类型)):字体属性。

    海龟的属性

    可见性

    1. hideturtle()或ht()
    • 功能
      让海龟隐形。
      当你在做一些复杂的绘图过程中这样做是一个好主意,因为隐藏海龟可以明显地加快绘图的速度。
    2. showturtle()或st()
    • 功能
      让海龟显形。
    3. isvisible()
    • 功能
      如果海龟是可见的,返回True;如果它是不可见的,返回False。

    外观

    1. shape(name=None)
    • 功能
      将海龟形状设置为指定的形状,如果没有指定形状,则返回当前海龟形状的名称。
    • 参数
      name(字符串或None):带名称的海龟形状必须存在于画布的海龟形状字典中。最初有这些海龟形状:“arrow”, “turtle”, “circle”, “square”, “triangle”, “classic”。要了解如何添加海龟形状,请参考函数register_shape()。
    2. resizemode(rmode=None)
    • 功能
      将调整模式设置为以下值之一:“auto”、“user”、“noresize”。如果没有给出参数,则返回当前的调整模式。
    • 参数
      rmode(“auto”或“user”或“noresize”或None):不同的调整模式有以下的效果:
      “auto”:根据画笔的尺寸来调整海龟形状。(请参考函数pensize())
      “user”:根据函数shapesize()设置的拉伸因子和轮廓宽度来调整海龟形状。resizemode(“user”)和函数shapesize()经常一起使用。(请参考函数shapesize())
      “noresize”:海龟形状不会发生变化。
    3. shapesize(stretch_wid=None, stretch_len=None, outline=None)或turtlesize(stretch_wid=None, stretch_len=None, outline=None)
    • 功能
      设置海龟形状的尺寸大小。如果没有给出参数,则返回当前海龟形状的尺寸。当且仅当将调整模式设置为user时,海龟形状将根据其拉伸因子和轮廓宽度进行变化。
    • 参数
      stretch_wid(正数或None):垂直于海龟方向的拉伸因子,即拉伸海龟的宽度。为None时则为当前值。默认初始值为1。
      stretch_len(正数或None):平行于海龟方向的拉伸因子,即拉伸海龟的长度。为None时则为当前值。默认初始值为1。
      outline(正数或None):海龟形状的轮廓宽度。为None时则为当前值。默认初始值为1。
    4. shearfactor(shear=None)
    • 功能
      设置或返回当前剪切因子。根据给定的剪切因子(即剪切角的正切值)剪切出海龟形状。剪切角是指海龟前进的方向和剪切线的夹角(锐角)。但不会改变海龟的方向和面积。
    • 参数
      shear(整数或浮点数或None):取剪切角的正切值。取0时表示不剪切。如果没有给出参数,则返回当前剪切因子。
    5. tilt(angle)
    • 功能
      在当前的旋转角的基础上根据angle旋转海龟形状,但不会改变海龟前进的方向。
      角度方向取决于海龟模式,请参考函数mode()。
    • 参数
      angle(整数或浮点数):旋转角。取负值时顺时针旋转,取正值时逆时针旋转。
    6. settiltangle(angle)
    • 功能
      无论当前的旋转角如何,将海龟形状旋转到指定的角度方向。但不会改变海龟前进的方向。
      角度方向取决于海龟模式,请参考函数mode()。
    • 参数
      angle(整数或浮点数):旋转角。取负值时顺时针旋转,取正值时逆时针旋转。
    7. tiltangle(angle=None)
    • 功能
      设置或返回当前旋转角。但不会改变海龟前进的方向。
      无论当前的旋转角如何,将海龟形状旋转到指定的角度方向。
      角度方向取决于海龟模式,请参考函数mode()。
    • 参数
      angle(整数或浮点数或None):旋转角。取负值时顺时针旋转,取正值时逆时针旋转。如果没有给出参数,则返回当前的旋转角。
    8. shapetransform(t11=None, t12=None, t21=None, t22=None)
    • 功能
      设置或返回当前海龟形状的变换矩阵。
      如果没有给出参数,则返回一个包含4个元素的元组的变换矩阵。另外根据由第一行t11、t12和第二行t21、t22组成的矩阵,对给定的元素进行设置,并对海龟形状进行变换。行列式t11 * t22 - t12 * t21必须不为零,否则会产生错误。根据给定的矩阵修改拉伸因子、剪切因子和旋转角度。
    • 参数
      t11、t12、t21、t22(整数或浮点数或None):具体的含义目前还不清楚,需要自行好好研究。
    9. get_shapepoly()
    • 功能
      以坐标对元组的形式返回当前海龟形状。这可以用来定义一个新的形状或复合形状的组件。

    事件的使用

    1. onclick(fun, btn=1, add=None)
    • 功能
      将函数fun绑定到此海龟上的鼠标单击事件。
    • 参数
      fun(函数或None):一个带有两个参数的函数,它将与画布上单击点的坐标(x,y)一起被调用。如果函数fun为None,则删除现有绑定。
      btn(整数):表示鼠标上按钮的数字,默认为1。1表示鼠标左键,2表示鼠标中间键,3表示鼠标右键。
      add(True或False或None):如果为True,将添加一个新的绑定,否则将替换以前的绑定。
    2. onrelease(fun, btn=1, add=None)
    • 功能
      将函数fun绑定到此海龟上的鼠标按钮释放事件。
    • 参数
      fun(函数或None):一个带有两个参数的函数,它将与画布上单击点的坐标(x,y)一起被调用。如果函数fun为None,则删除现有绑定。
      btn(整数):表示鼠标上按钮的数字,默认为1。1表示鼠标左键,2表示鼠标中间键,3表示鼠标右键。
      add(True或False或None):如果为True,将添加一个新的绑定,否则将替换以前的绑定。
    3. ondrag(fun, btn=1, add=None)
    • 功能
      将函数fun绑定到此海龟上的鼠标移动事件。
      :在海龟上的每一个鼠标移动事件之前都有一个鼠标点击事件发生。
    • 参数
      fun(函数或None):一个带有两个参数的函数,它将与画布上单击点的坐标(x,y)一起被调用。如果函数fun为None,则删除现有绑定。
      btn(整数):表示鼠标上按钮的数字,默认为1。1表示鼠标左键,2表示鼠标中间键,3表示鼠标右键。
      add(True或False或None):如果为True,将添加一个新的绑定,否则将替换以前的绑定。

    特殊的方法

    1. begin_poly()
    • 功能
      开始记录多边形的顶点。使当前海龟的位置是多边形的第一个顶点。
    2. end_poly()
    • 功能
      停止记录多边形的顶点。使当前海龟的位置是多边形的最后一个顶点。最后一个顶点将与第一个顶点相连。
    3. get_poly()
    • 功能
      返回最后记录的多边形。这个多边形是用来设置海龟形状的,可参考函数register_shape()。
    4. clone()
    • 功能
      创建并返回具有相同位置、海龟方向和海龟属性的海龟克隆体。
    5. getturtle()或getpen()
    • 功能
      返回Turtle对象本身。唯一合理的用途是作为函数返回未命名的海龟。
    6. getscreen()
    • 功能
      返回海龟正在绘制时的TurtleScreen对象。然后可以为该对象调用类TurtleScreen的方法。
    7. setundobuffer(size)
    • 功能
      设置或禁用撤销缓冲区。
    • 参数
      size(整数或None):size给出了通过 函数undo() 可以撤消的海龟动作的最大数量。如果size是整数,则安装给定大小的空的撤消缓冲区。如果参数为空,则禁用撤销缓冲区。
    8. undobufferentries()
    • 功能
      返回撤消缓冲区中的最大可撤消数。
      :函数setundobuffer()中的size <= 最大可撤消数

    二、类TurtleScreen/Screen的方法

    窗口控制

    1. bgcolor(*args)
    • 功能
      设置或返回画布的背景颜色。
    • 参数
      允许有以下四种输入格式:
      1、bgcolor()
      返回当前画布的背景颜色规范字符串或元组。可以作为另一个颜色/背景颜色调用的输入参数。
      2、bgcolor(colorstring)
      将画布的背景颜色设置为colorstring,这是一个Tk颜色规范字符串,例如"red"、“blue"或”#33cc8c"。
      3、bgcolor((r, g, b))
      设置画布的背景颜色为由r、g和b的元组表示的RGB颜色。r、g和b的每个值都必须在0到colormode的范围内,其中colormode为1.0或255(请参考函数colormode())。
      4、bgcolor(r, g, b)
      设置画布的背景颜色为r、g和b表示的RGB颜色。r、g和b的每个值都必须在0到colormode范围内,其中colormode为1.0或255(请参考函数colormode())。
    2. bgpic(picname=None)
    • 功能
      设置背景图像或返回当前背景图像的名称。
    • 参数
      picname(字符串形式的gif文件名,或“nopic”,或None):如果picname是文件名,则将相应的图像设置为背景图像。如果picname是“nopic”,则删除已存在的背景图像。如果picname为None,则返回当前背景图像的文件名。
    3. clear()或clearscreen()
    • 功能
      从画布上删除所有的图画和所有的海龟。将当前空的画布重置为初始状态:白色背景,没有背景图像,没有事件绑定和跟踪。
      :这个函数只有在名为clearscreen的情况下才可以作为全局函数使用。而函数clear()是从 类Turtle的函数clear() 派生出来的另一个全局函数。
    4. reset()或resetscreen()
    • 功能
      重置所有海龟在画布上的初始状态。
      :这个函数只有在名为resetscreen的情况下才可以作为全局函数使用。而函数reset()是从 类Turtle的函数reset() 派生出来的另一个全局函数。
    5. screensize(canvwidth=None, canvheight=None, bg=None)
    • 功能
      如果没有给出参数,则返回当前值(画布宽度,画布高度)。或者调整海龟们正在绘制的画布的大小。但不会改变绘图窗口。要观察画布的隐藏部分,可以使用滚动条。
    • 参数
      canvwidth(正整数或None):画布的新宽度(以像素为单位)。
      cnvheight(正整数或None):画布的新高度(以像素为单位)。
      bg(颜色规范字符串或颜色元组或None):新的背景颜色。
    6. setworldcoordinates(llx, lly, urx, ury)
    • 功能
      建立用户自定义坐标系,调用该函数时会自动切换到模式“world”,如果必要时可调用 函数mode() 切换。在这之前先执行一个 函数reset()。如果模式“world”已经激活,所有的图画将根据新的坐标重新绘制。(请参考函数mode())
    • 参数
      llx(整数或浮点数):画布左下方的x坐标。
      lly(整数或浮点数):画布左下方的y坐标。
      urx(整数或浮点数):画布右上方的x坐标。
      ury(整数或浮点数):画布右上方的y坐标。
      这四个参数的正负值决定了坐标轴的方向,下面给出了四种情况。
      这四个参数的数值应该是比例,将海龟绘图窗口当前的宽度划分成x份,将窗口当前的高度划分成y份,以一等份为单位,进行海龟运动。

    动画控制

    1. delay(delay=None)
    • 功能
      设置或返回绘图延迟。这大约是两个连续的画布更新之间的时间间隔。绘图延迟越长,动画就越慢。(可和 函数speed() 作比较)
    • 参数
      delay(正整数或None):以毫秒为单位的绘图延迟值。如果参数为空时,则返回当前绘图延迟值。
    2. tracer(n=None, delay=None)
    • 功能
      打开或关闭海龟动画,为更新的绘图设置延迟。可用于加速复杂图形的绘制。当参数为空时,返回当前存储值n。
    • 参数
      n(非负整数或None):实际执行n次常规的画布更新。
      delay(非负整数或None):设置延迟值(请参考函数delay())。
    3. update()
    • 功能
      执行画布的更新。当tracer关闭时使用。

    画布的事件

    1. listen(xdummy=None, ydummy=None)
    • 功能
      将焦点设置在画布上(以便收集键盘事件)。
    • 参数
      提供两个伪参数是为了能够将函数listen()传递给函数onclick()。
    2. onkey(fun, key)或onkeyrelease(fun, key)
    • 功能
      将函数fun绑定到键盘上的按键释放事件。
      :为了能够注册键盘事件,画布必须有焦点。(请参考函数listen())
    • 参数
      fun(函数或None):一个无参的函数。如果函数fun为None,则删除事件绑定。
      key(字符串):按键(如“a”)或按键符号(如“space”)。
    3. onkeypress(fun, key=None)
    • 功能
      将函数fun绑定到键盘上的按键事件。
      :为了能够注册键盘事件,画布必须有焦点。(请参考函数listen())
    • 参数
      fun(函数或None):一个无参的函数。如果函数fun为None,则删除事件绑定。
      key(字符串或None):按键(如“a”)或按键符号(如“space”)。如果给定key,则将函数fun绑定到键的按键事件;如果没有给定key,则绑定到任何键的按键事件。
    4. onclick(fun, btn=1, add=None)或onscreenclick(fun, btn=1, add=None)
    • 功能
      将函数fun绑定到此画布上的鼠标单击事件。
      :这个函数只有在名为onscreenclick的情况下才可以作为全局函数使用。而函数onclick()是从 类Turtle的函数onclick() 派生出来的另一个全局函数。
    • 参数
      fun(函数或None):一个带有两个参数的函数,它将与画布上单击点的坐标(x,y)一起被调用。如果函数fun为None,则删除现有绑定。
      btn(整数):表示鼠标上按钮的数字,默认为1。1表示鼠标左键,2表示鼠标中间键,3表示鼠标右键。
      add(True或False或None):如果为True,将添加一个新的绑定,否则将替换以前的绑定。
    5. ontimer(fun, t=0)
    • 功能
      安装一个计时器,在t毫秒之后调用函数fun。
    • 参数
      fun(函数):一个无参的函数,可自定义。
      t(整数或浮点数):一个大于等于零的数,用于计时。
    6. mainloop()或done()
    • 功能
      开始事件循环——调用Tkinter接口的函数mainloop()。且必须是海龟绘图程序的最后一个语句。如果在集成开发环境IDLE里面的-n模式(没有子进程)下运行脚本(用于交互式使用海龟绘图),则一定不能使用该函数。

    输入方法

    1. textinput(title, prompt)
    • 功能
      弹出一个用于输入字符串的对话框窗口。如果确认了对话框,则返回用户输入的字符串。如果取消了对话框,则返回None。
    • 参数
      title(字符串):对话框窗口的标题。
      prompt(字符串):用来提示用户输入什么信息的文本。
    2. numinput(title, prompt, default=None, minval=None, maxval=None)
    • 功能
      弹出一个用于输入数字的对话框窗口。如果确认了对话框,则返回用户输入的数字。如果取消了对话框,则返回None。
    • 参数
      title(字符串):对话框窗口的标题。
      prompt(字符串):用来提示用户输入什么数字信息的文本。
      default(整数或浮点数或None):缺省值。
      minval(整数或浮点数或None):用户输入数字的最小值。
      maxval(整数或浮点数或None):用户输入数字的最大值。

    设置和特殊方法

    1. mode(mode=None)
    • 功能
      设置海龟的模式,并执行复位。如果没有参数,则返回当前模式。
    • 参数
      mode(“standard”或“logo”或“world”):模式“standard”与turtle库兼容。模式“logo”是兼容大多数标志海龟形状。模式“world”使用用户定义的世界坐标(请参考函数setworldcoordinates()),在这种模式下,如果x/y单位比t=1,角度就会失真。
    模式 初始的海龟方向 正角
    “standard” 水平向右(向东) 逆时针
    “logo” 水平向上(向北) 顺时针
    2. colormode(cmode=None)
    • 功能
      返回颜色模式,或将其设置为1.0或255。随后,颜色三元组的r、g、b值必须在0到cmode的范围内。
    • 参数
      cmode(取值为1.0或255中的一个):当cmode=1.0时,颜色模式为RGB小数值;当cmode=255时,颜色模式为RGB整数值。当参数为空时,返回当前颜色模式。
    颜色 英文字符串 RGB小数值 RGB整数值 十六进制字符串
    纯黑 “black” (0, 0, 0) (0, 0, 0) “#000000”
    纯红 “red” (1, 0, 0) (255, 0, 0) “#FF0000”
    酸橙色 “lime” (0, 1, 0) (0, 255, 0) “#00FF00”
    纯蓝 “blue” (0, 0, 1) (0, 0, 255) “#0000FF”
    纯白 “white” (1, 1, 1) (255, 255, 255) “#FFFFFF”
    青色 “cyan” (0, 1, 1) (0, 255, 255) “#00FFFF”
    洋红色 “magenta” (1, 0, 1) (255, 0, 255) “#FF00FF”
    纯黄 “yellow” (1, 1, 0) (255, 255, 0) “#FFFF00”
    灰色 “gray” (0.50, 0.50, 0.50) (128,128,128) “#808080”
    栗色 “maroon” (0.50, 0, 0) (128, 0, 0) “#800000”
    纯绿 “green” (0, 0.50, 0) (0, 128, 0) “#008000”
    海军蓝 “navy” (0, 0, 0.50) (0, 0,128) “#000080”
    水鸭色 “teal” (0, 0.50, 0.50) (0, 128, 128) “#008080”
    紫色 “purple” (0.50, 0, 0.50) (128, 0, 128) “#800080”
    橄榄色 “olive” (0.50, 0.50, 0) (128, 128, 0) “#808000”
    金色 “gold” (1, 0.84, 0) (255, 215, 0) “#FFD700”
    粉红色 “pink” (1, 0.75, 0.80) (255, 192, 203) “#FFC0CB”

    RGB颜色值与十六进制颜色码转换工具:https://www.sioe.cn/yingyong/yanse-rgb-16/

    3. getcanvas()
    • 功能
      返回当前的画布。对于知道如何使用Tkinter画布的人非常有用。
    4. getshapes()
    • 功能
      返回当前所有可用海龟形状的名称列表。
    5. register_shape(name, shape=None)或addshape(name, shape=None)
    • 功能
      在画布的海龟形状列表中添加一个海龟的形状。因此,只能通过函数shape(shapename) 来调用已添加的海龟形状。
    • 参数
      有三种不同的方法来调用这个函数:
      1)添加相应的图像形状:name是gif文件的名称,而shape是None。
      :图像形状在旋转海龟时不旋转,所以它们不显示海龟的方向。
      2)添加相应的多边形形状:name是一个任意字符串,shape是几对坐标的元组。
      3)安装相应的复合形状:name是一个任意字符串,shape是一个(复合)形状对象。
    6. turtles()
    • 功能
      返回画布上所有海龟组成的列表。
    7. window_height()
    • 功能
      返回海龟绘图窗口的高度。
    8. window_width()
    • 功能
      返回海龟绘图窗口的宽度。

    不是从类TurtleScreen继承的特定于类Screen的方法

    1. bye()
    • 功能
      关闭海龟绘图窗口。
    2. exitonclick()
    • 功能
      将函数bye()绑定到画布上的鼠标点击事件上。如果turtle.cfg文件中using_IDLE的值为False(默认值),函数exitonclick()也会进入主事件循环。可参考函数mainloop()。
      :如果你经常使用集成开发环境IDLE并启用-n开关(没有子进程),则将turtle.cfg文件中的using_IDLE设置为True。在这种情况下,IDLE自身的主事件循环对于客户端脚本也是活动的。其中turtle.cfg文件的配置将在下文中详细介绍。
    3. setup(width=_CFG[“width”], height=_CFG[“height”], startx=_CFG[“leftright”], starty=_CFG[“topbottom”])
    • 功能
      设置海龟绘图窗口的大小和位置。参数的默认值存储在配置文件中,可以通过turtle.cfg文件进行更改。
    • 参数
      width(整数或浮点数):如果是整数,则以像素为单位设置窗口宽度。如果是浮点数,则是画布的百分比值(默认是0.5=50%的画布宽度)。
      height(整数或浮点数):如果是整数,则以像素为单位设置窗口高度。如果是浮点数,则是画布的百分比值(默认是0.75=75%的画布高度)。
      startx(整数或None):如果为正,则startx为窗口左侧距离电脑屏幕左侧边缘的像素距离,如果为负,则startx为窗口右侧距离电脑屏幕右侧边缘的像素距离,如果为None,则窗口是水平居中的。
      starty(整数或None):如果为正,则starty为窗口顶部距离电脑屏幕顶部边缘的像素距离,如果为负,则starty为窗口底部距离电脑屏幕底部边缘的像素距离,如果为None,则窗口是垂直居中的。
    4. title(titlestring)
    • 功能
      设置海龟绘图窗口的标题为给定的titlestring。
    • 参数
      titlestring(字符串):显示在海龟绘图窗口的标题栏中。

    turtle.cfg文件配置画布和海龟

    • turtle.cfg文件是一个turtle库内置的默认配置文件。
      如果你想使用一个不同的配置,更好地反映turtle库的特点,或更适合你的需要,那么你可以更改turtle.cfg文件的配置内容。
    • 在turtle.cfg文件里会有以下内容:
    • 简要说明上图中的内容:
      1)前四行对应 函数setup() 的参数。
      2)第五行和第六行对应于 函数screensize() 的参数。
      3)shape可以是任何内置的海龟形状,如arrow、turtle等。可参考函数shape()。
      4)如果你不想使用fillcolor(比如让海龟透明),则必须写成fillcolor = “”。
      :所有非空字符串在turtle.cfg文件中不能有引号。
      5)如果你想要反映海龟的状态,则必须写成resizemode =auto。
      6)如果你设置的是language = italian,那么文档字符串字典文件turtle_docstringdict_italian.py将在导入时加载(在同一个目录中加载)。
      7)exampleturtle和examplescreen定义了相应对象在文档字符串中显示的名称。
      8)如果你经常使用集成开发环境IDLE并启用-n开关(没有子进程),则将using_IDLE设置为True。这将阻止函数exitonclick() 进入主事件循环。
    • turtle.cfg文件存放在Python安装路径下的Lib\turtledemo里面。
      当然turtle.cfg 文件也可以保存于 turtle 所在目录,当前工作目录也可以有一个同名文件。后者会重载覆盖前者的配置。

    演示脚本

    复杂的传统海龟绘图

    • 源代码
    from turtle import Turtle, mainloop
    from time import perf_counter as clock
    
    # wrapper for any additional drawing routines
    # that need to know about each other
    class Designer(Turtle):
    
    def design(self, homePos, scale):
    self.up()
    for i in range(5):
    self.forward(64.65 * scale)
    self.down()
    self.wheel(self.position(), scale)
    self.up()
    self.backward(64.65 * scale)
    self.right(72)
    self.up()
    self.goto(homePos)
    self.right(36)
    self.forward(24.5 * scale)
    self.right(198)
    self.down()
    self.centerpiece(46 * scale, 143.4, scale)
    self.getscreen().tracer(True)
    
    def wheel(self, initpos, scale):
    self.right(54)
    for i in range(4):
    self.pentpiece(initpos, scale)
    self.down()
    self.left(36)
    for i in range(5):
    self.tripiece(initpos, scale)
    self.left(36)
    for i in range(5):
    self.down()
    self.right(72)
    self.forward(28 * scale)
    self.up()
    self.backward(28 * scale)
    self.left(54)
    self.getscreen().update()
    
    def tripiece(self, initpos, scale):
    oldh = self.heading()
    self.down()
    self.backward(2.5 * scale)
    self.tripolyr(31.5 * scale, scale)
    self.up()
    self.goto(initpos)
    self.setheading(oldh)
    self.down()
    self.backward(2.5 * scale)
    self.tripolyl(31.5 * scale, scale)
    self.up()
    self.goto(initpos)
    self.setheading(oldh)
    self.left(72)
    self.getscreen().update()
    
    def pentpiece(self, initpos, scale):
    oldh = self.heading()
    self.up()
    self.forward(29 * scale)
    self.down()
    for i in range(5):
    self.forward(18 * scale)
    self.right(72)
    self.pentr(18 * scale, 75, scale)
    self.up()
    self.goto(initpos)
    self.setheading(oldh)
    self.forward(29 * scale)
    self.down()
    for i in range(5):
    self.forward(18 * scale)
    self.right(72)
    self.pentl(18 * scale, 75, scale)
    self.up()
    self.goto(initpos)
    self.setheading(oldh)
    self.left(72)
    self.getscreen().update()
    
    def pentl(self, side, ang, scale):
    if side < (2 * scale): return
    self.forward(side)
    self.left(ang)
    self.pentl(side - (.38 * scale), ang, scale)
    
    def pentr(self, side, ang, scale):
    if side < (2 * scale): return
    self.forward(side)
    self.right(ang)
    self.pentr(side - (.38 * scale), ang, scale)
    
    def tripolyr(self, side, scale):
    if side < (4 * scale): return
    self.forward(side)
    self.right(111)
    self.forward(side / 1.78)
    self.right(111)
    self.forward(side / 1.3)
    self.right(146)
    self.tripolyr(side * .75, scale)
    
    def tripolyl(self, side, scale):
    if side < (4 * scale): return
    self.forward(side)
    self.left(111)
    self.forward(side / 1.78)
    self.left(111)
    self.forward(side / 1.3)
    self.left(146)
    self.tripolyl(side * .75, scale)
    
    def centerpiece(self, s, a, scale):
    self.forward(s); self.left(a)
    if s < (7.5 * scale):
    return
    self.centerpiece(s - (1.2 * scale), a, scale)
    
    def main():
    t = Designer()
    t.speed(0)
    t.hideturtle()
    t.getscreen().delay(0)
    t.getscreen().tracer(0)
    at = clock()
    t.design(t.position(), 2)
    et = clock()
    return "runtime: %.2f sec." % (et-at)
    
    if __name__ == '__main__':
    msg = main()
    print(msg)
    mainloop()
    • 运行结果

    绘制模拟时钟显示本机的当前时间

    • 源代码
    from turtle import *
    from datetime import datetime
    
    def jump(distanz, winkel=0):
    penup()
    right(winkel)
    forward(distanz)
    left(winkel)
    pendown()
    
    def hand(laenge, spitze):
    fd(laenge*1.15)
    rt(90)
    fd(spitze/2.0)
    lt(120)
    fd(spitze)
    lt(120)
    fd(spitze)
    lt(120)
    fd(spitze/2.0)
    
    def make_hand_shape(name, laenge, spitze):
    reset()
    jump(-laenge*0.15)
    begin_poly()
    hand(laenge, spitze)
    end_poly()
    hand_form = get_poly()
    register_shape(name, hand_form)
    
    def clockface(radius):
    reset()
    pensize(7)
    for i in range(60):
    jump(radius)
    if i % 5 == 0:
    fd(25)
    jump(-radius-25)
    else:
    dot(3)
    jump(-radius)
    rt(6)
    
    def setup():
    global second_hand, minute_hand, hour_hand, writer
    mode("logo")
    make_hand_shape("second_hand", 125, 25)
    make_hand_shape("minute_hand",  130, 25)
    make_hand_shape("hour_hand", 90, 25)
    clockface(160)
    second_hand = Turtle()
    second_hand.shape("second_hand")
    second_hand.color("gray20", "gray80")
    minute_hand = Turtle()
    minute_hand.shape("minute_hand")
    minute_hand.color("blue1", "red1")
    hour_hand = Turtle()
    hour_hand.shape("hour_hand")
    hour_hand.color("blue3", "red3")
    for hand in second_hand, minute_hand, hour_hand:
    hand.resizemode("user")
    hand.shapesize(1, 1, 3)
    hand.speed(0)
    ht()
    writer = Turtle()
    #writer.mode("logo")
    writer.ht()
    writer.pu()
    writer.bk(85)
    
    def wochentag(t):
    wochentag = ["Monday", "Tuesday", "Wednesday",
    "Thursday", "Friday", "Saturday", "Sunday"]
    return wochentag[t.weekday()]
    
    def datum(z):
    monat = ["Jan.", "Feb.", "Mar.", "Apr.", "May", "June",
    "July", "Aug.", "Sep.", "Oct.", "Nov.", "Dec."]
    j = z.year
    m = monat[z.month - 1]
    t = z.day
    return "%s %d %d" % (m, t, j)
    
    def tick():
    t = datetime.today()
    sekunde = t.second + t.microsecond*0.000001
    minute = t.minute + sekunde/60.0
    stunde = t.hour + minute/60.0
    try:
    tracer(False)  # Terminator can occur here
    writer.clear()
    writer.home()
    writer.forward(65)
    writer.write(wochentag(t),
    align="center", font=("Courier", 14, "bold"))
    writer.back(150)
    writer.write(datum(t),
    align="center", font=("Courier", 14, "bold"))
    writer.forward(85)
    tracer(True)
    second_hand.setheading(6*sekunde)  # or here
    minute_hand.setheading(6*minute)
    hour_hand.setheading(30*stunde)
    tracer(True)
    ontimer(tick, 100)
    except Terminator:
    pass  # turtledemo user pressed STOP
    
    def main():
    tracer(False)
    setup()
    tracer(True)
    tick()
    return "EVENTLOOP"
    
    if __name__ == "__main__":
    mode("logo")
    msg = main()
    print(msg)
    mainloop()
    • 运行结果

    更多的演示脚本

    在Python安装路径下的Lib\turtledemo里面,存放了各种各样的演示脚本。其中__main__.py是一个演示查看器,可用来查看脚本的源码并即时运行。

    • 点赞 4
    • 收藏
    • 分享
    • 文章举报
    上轩希言 发布了6 篇原创文章 · 获赞 114 · 访问量 8350 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: