文章目录
- turtle库
- 简介
- 帮助
- 面向对象和面向过程
- 公共的类
- 一、类RawTurtle/Turtle的方法
- 海龟的运动
- 移动和绘图
- 1. forward(distance)或fd(distance)
- 2. back(distance)或bk(distance)或backward(distance)
- 3. right(angle)或rt(angle)
- 4. left(angle)或lt(angle)
- 5. goto(x, y=None)或setpos(x, y=None)或setposition(x, y=None)
- 6. setx(x)
- 7. sety(y)
- 8. setheading(to_angle)或seth(to_angle)
- 9. home()
- 10. circle(radius, extent=None, steps=None)
- 11. dot(size=None, *color)
- 12. stamp()
- 13. clearstamp(stampid)
- 14. clearstamps(n=None)
- 15. undo()
- 16. speed(speed=None)
- 设置海龟状态
- 1. position()或pos()
- 2. towards(x, y=None)
- 3. xcor()
- 4. ycor()
- 5. heading()
- 6. distance(x, y=None)
- 设置和测量
- 1. degrees(fullcircle=360.0)
- 2. radians()
- 画笔的控制
- 绘画状态
- 1. pendown()或pd()或down()
- 2. penup()或pu()或up()
- 3. pensize(width=None)或width(width=None)
- 4. pen(pen=None, **pendict)
- 5. isdown()
- 颜色控制
- 1. pencolor(*args)
- 2. fillcolor(*args)
- 3. color(*args)
- 填充
- 1. filling()
- 2. begin_fill()
- 3. end_fill()
- 更多的绘画控制
- 1. reset()
- 2. clear()
- 3. write(arg, move=False, align="left", font=("Arial", 8, "normal"))
- 海龟的属性
- 可见性
- 1. hideturtle()或ht()
- 2. showturtle()或st()
- 3. isvisible()
- 外观
- 1. shape(name=None)
- 2. resizemode(rmode=None)
- 3. shapesize(stretch_wid=None, stretch_len=None, outline=None)或turtlesize(stretch_wid=None, stretch_len=None, outline=None)
- 4. shearfactor(shear=None)
- 5. tilt(angle)
- 6. settiltangle(angle)
- 7. tiltangle(angle=None)
- 8. shapetransform(t11=None, t12=None, t21=None, t22=None)
- 9. get_shapepoly()
- 事件的使用
- 1. onclick(fun, btn=1, add=None)
- 2. onrelease(fun, btn=1, add=None)
- 3. ondrag(fun, btn=1, add=None)
- 特殊的方法
- 1. begin_poly()
- 2. end_poly()
- 3. get_poly()
- 4. clone()
- 5. getturtle()或getpen()
- 6. getscreen()
- 7. setundobuffer(size)
- 8. undobufferentries()
- 二、类TurtleScreen/Screen的方法
- 窗口控制
- 1. bgcolor(*args)
- 2. bgpic(picname=None)
- 3. clear()或clearscreen()
- 4. reset()或resetscreen()
- 5. screensize(canvwidth=None, canvheight=None, bg=None)
- 6. setworldcoordinates(llx, lly, urx, ury)
- 动画控制
- 1. delay(delay=None)
- 2. tracer(n=None, delay=None)
- 3. update()
- 画布的事件
- 1. listen(xdummy=None, ydummy=None)
- 2. onkey(fun, key)或onkeyrelease(fun, key)
- 3. onkeypress(fun, key=None)
- 4. onclick(fun, btn=1, add=None)或onscreenclick(fun, btn=1, add=None)
- 5. ontimer(fun, t=0)
- 6. mainloop()或done()
- 输入方法
- 1. textinput(title, prompt)
- 2. numinput(title, prompt, default=None, minval=None, maxval=None)
- 设置和特殊方法
- 1. mode(mode=None)
- 2. colormode(cmode=None)
- 3. getcanvas()
- 4. getshapes()
- 5. register_shape(name, shape=None)或addshape(name, shape=None)
- 6. turtles()
- 7. window_height()
- 8. window_width()
- 不是从类TurtleScreen继承的特定于类Screen的方法
- 1. bye()
- 2. exitonclick()
- 3. setup(width=_CFG["width"], height=_CFG["height"], startx=_CFG["leftright"], starty=_CFG["topbottom"])
- 4. title(titlestring)
- turtle.cfg文件配置画布和海龟
- 演示脚本
- 复杂的传统海龟绘图
- 绘制模拟时钟显示本机的当前时间
- 更多的演示脚本
turtle库
简介
turtle库是非常适合初学者甚至小朋友使用的简单图形绘制模块。
自Python2.6版本以后,turtle库就已经成为Python的内嵌模块,无需特别安装。
turtle库中的指令,形象而简单,它绘制的坐标轴以画布中心点为原点。在标准模式中海龟的初始方向是水平向右(向东),一般情况下是标准模式,可参考函数mode() 进行修改。
帮助
- Python内置的函数help([object])
函数help() 通过调用内置的交互式帮助系统在帮助文档里面进行查找。如果没有给出参数,帮助系统将在解释器控制台启动。如果参数是字符串,那么该字符串将作为模块、函数、类、方法、关键字或帮助文档主题的名称进行查找,并在控制台上打印帮助页面。如果参数是任何其他类型的对象,则生成该对象的帮助页。
- Python自带的帮助文档
在Python安装路径下的Doc里面可以找到pythonXXX.chm帮助文档。
- Python官网的帮助文档
https://docs.python.org/zh-cn/3.8/index.html
面向对象和面向过程
turtle库以面向对象和面向过程的方式提供了基本方法。因为它使用tkinter接口作为基础,所以需要一个安装了Tk支持的Python版本。
注:如果要在画布上使用多个海龟对象,必须使用面向对象的接口。
在下文给出的所有函数的参数列表中,函数的第一个附加参数self在本文中都省略了。
- 面向对象的接口在下文中介绍了包含的公共的类。
以下是面向对象的写法:
import turtle
turtle01 = turtle.Turtle()
turtle01.fd(100)
from turtle import Turtle
turtle01 = Turtle()
turtle01.fd(100)
- 面向过程的接口提供了从类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()
4. ycor()
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()
画布的事件
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
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.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)
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)
minute_hand.setheading(6*minute)
hour_hand.setheading(30*stunde)
tracer(True)
ontimer(tick, 100)
except Terminator:
pass
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是一个演示查看器,可用来查看脚本的源码并即时运行。