一、turtle库
1.基本介绍
turtle库:
(1)1969年诞生
(2)Python语言的标准库之一
(3)入门级的图形绘制函数库
2.turtle绘图原理
turtle海龟走过的轨迹绘制成了图形
3.官方文档
https://docs.python.org/3/library/turtle.html
二、turtle构建体系
1.turtle绘图窗体布局
(1)最小单位是像素,左上角是(0,0)
(2)startx与starty:绘图窗体出现在屏幕的哪里,后两个参数可选,默认正中心
2.绝对坐标
绝对坐标:就是标准的xOy坐标系,上y右x,中央点是(0,0)
3.海龟坐标
standard模式下(默认):头朝的方向就是前方:如当龟头朝右时,右侧就为前方。开始默认头朝右.
4.turtle角度坐标体系
角度坐标体系:就是数学上的坐标轴角度,绕x轴逆时针角度从0°到360°
(1)turtle.setheading(angle) 别名turtle.seth(angle):只改变方向不行进。如turtle.seth(90):海龟的朝向为90度
注意:与当前海龟头的朝向没有关系,90度就一定向上
(2)turtle.left(angle)与turtle.right(angle):在海龟当前头的方向上再向左/右转多少度
三、函数纵览
1.海龟方法
(1)海龟动作
(2)画笔控制
(3)海龟状态
(4)使用事件
(5)特殊的海龟方法
2.TurtleScreen / Screen的方法
四、海龟方法详解
1.海龟动作
(1)移动和绘制
turtle.forward(distance)
turtle.fd(distance)
参数:
distance – 一个数值 (整型或浮点型)
作用:
海龟前进 distance 指定的距离,方向为海龟的朝向
turtle.back(distance)
turtle.bk(distance)
turtle.backward(distance)
参数:
distance – 一个数值
作用:
海龟后退 distance 指定的距离,方向与海龟的朝向相反。不改变海龟的朝向
turtle.right(angle)
turtle.rt(angle)
参数:
angle – 一个数值 (整型或浮点型)
作用:
海龟右转 angle 个单位。(单位默认为角度,但可通过 degrees() 和 radians() 函数改变设置。)
turtle.left(angle)
turtle.lt(angle)
参数:
angle – 一个数值 (整型或浮点型)
作用:
海龟左转 angle 个单位。(单位默认为角度,但可通过 degrees() 和 radians() 函数改变设置。)
turtle.goto(x, y=None)
turtle.setpos(x, y=None)
turtle.setposition(x, y=None)
参数:
- x – 一个数值或数值对/向量
- y – 一个数值或 None
如果 y 为 None,x 应为一个表示坐标的数值对或 Vec2D 类对象 (例如 pos() 返回的对象).
作用:
海龟移动到一个绝对坐标。如果画笔已落下将会画线。不改变海龟的朝向。
例子:
# x和y
turtle.setpos(60,30)# x为元组
turtle.setpos((20,80))# x为pos()返回的元组
tp= turtle.pos()
turtle.setpos(tp)
turtle.setx(x)
参数:
x – 一个数值 (整型或浮点型)
作用:
设置海龟的横坐标为 x,纵坐标保持不变。
turtle.sety(y)
参数:
y – 一个数值 (整型或浮点型)
作用:
设置海龟的纵坐标为 y,横坐标保持不变。
turtle.setheading(to_angle)
turtle.seth(to_angle)
参数:
to_angle – 一个数值 (整型或浮点型)
作用:
设置海龟的朝向为 to_angle。
turtle.home()
作用:
海龟移至初始坐标 (0,0),并设置朝向为初始方向 (由海龟模式确定,参见 mode())。
turtle.circle(radius, extent=None, steps=None)
参数:
radius – 一个数值 (整型或浮点型),表示半径
如果 radius 为正值则圆心在乌龟头的左边,否则圆心在乌龟头的右边。extent – 一个数值 (整型或浮点型),表示角度
如未指定 extent则绘制整个圆,指定角度(可以大于360°)则绘制圆弧。
如果 radius 为正值则按乌龟的前进的方向,否则按乌龟的倒退的方向。steps – 一个整型数
如未指定 steps则绘制圆弧,指定则绘制多边形(边数大于0)。
作用:
绘制一个 radius 指定半径的多边形部分。
例子:
# 绘制在左边的、按前进方向的import turtle
turtle.circle(50,270)
turtle.done()
# 绘制在右边的、按前进方向的import turtle
turtle.circle(50,270)
turtle.done()
# 绘制在左边的、按后退方向的import turtle
turtle.circle(50,270)
turtle.done()
# 绘制在右边的、按后退方向的import turtle
turtle.circle(50,270)
turtle.done()
# 绘制三角形import turtle
turtle.circle(50,360,3)
turtle.done()
turtle.dot(size=None,*color)
参数:
- size – 一个整型数 >= 1 (如果指定)
如果 size 未指定,则直径取 pensize+4 和 2*pensize 中的最大值。 - color – 一个颜色字符串或颜色数值元组
未指定则是画笔颜色。
作用:
绘制一个直径为 size,颜色为 color 的圆点。
例子:turtle.dot()
,turtle.dot(50)
,turtle.dot("blue")
,turtle.dot(50,"blue")
import turtle
turtle.dot(50,"blue")
turtle.done()
turtle.undo()
作用:
撤消 (或连续撤消) 最近的一个 (或多个) 海龟动作。可撤消的次数由撤消缓冲区的大小决定。
turtle.speed(speed=None)
参数:
- speed – 一个 0到10 范围内的整型数或速度字符串
- 无参:返回当前海龟的速度
speed对应表:
如果输入数值大于 10 或小于 0.5 则速度设为 0。
字符串 | 数字 | 含义 |
---|---|---|
“fastest” | 0 | 最快 |
“fast” | 10 | 快 |
“normal” | 6 | 正常 |
“slow” | 3 | 慢 |
“slowest” | 1 | 最慢 |
速度值从 1 到 10,画线和海龟转向的动画效果逐级加快。speed = 0 表示没有动画效果(转向),但绘制还是需要时间,最快。
作用:
设置海龟移动的速度或返回当前海龟的速度。
(2)获取海龟状态
turtle.position()
turtle.pos()
作用:
返回海龟当前的坐标 (x,y) (为 Vec2D 矢量类对象)。
turtle.towards(x, y=None)
参数:
- x – 一个数值或数值对/矢量,或一个海龟实例
- y – 一个数值——如果 x 是一个数值,否则为 None
返回一个角度,从海龟位置到到 (x,y)的矢量到海龟初始朝向的矢量的夹角。
例子:
import turtle
turtle.goto(50,50)print(turtle.towards(0,0))
turtle.done()# 225.0# 海龟朝向0°,从(50,50)到(0,0)的矢量朝向225°,两者相差225.0
turtle.xcor()
作用:
返回海龟的 x 坐标。
turtle.ycor()
作用:
返回海龟的 y 坐标。
turtle.heading()
作用:
返回海龟当前的朝向的角度
turtle.distance(x, y=None)
参数:
- x – 一个数值或数值对/矢量,或一个海龟实例
- y – 一个数值——如果 x 是一个数值,否则为 None
返回从海龟位置到 (x,y)的单位距离。
(3)度量单位设置
turtle.degrees(fullcircle=360.0)
参数:
fullcircle – 一个数值
作用:
设置一个圆周为多少 “度”。默认值为 360 度。
>>> turtle.home()>>> turtle.left(90)>>> turtle.heading()90.0>>> turtle.degrees(400.0)>>> turtle.heading()100.0# 原来的朝向占一个圆的四分之一,90/360。现在,还要占四分之一,那就是400/4=100°
turtle.radians()
设置角度的度量单位为弧度。其值等于 度 ÷ 180 × π 度\div 180 \times \pi度÷180×π。
>>> turtle.home()>>> turtle.left(90)>>> turtle.heading()90.0>>> turtle.radians()>>> turtle.heading()1.5707963267948966# 90/180*3.14=1.57...
2.画笔控制
(1)绘图状态
turtle.pendown()
turtle.pd()
turtle.down()
作用:
画笔落下 – 移动时将画线。
turtle.penup()
turtle.pu()
turtle.up()
作用:
画笔抬起 – 移动时不画线。
turtle.pensize(width=None)
turtle.width(width=None)
参数:
- width – 一个正数值
- 无参:返回画笔的线条粗细。
作用:
设置线条的粗细为 width 或返回该值。
turtle.isdown()
作用:
如果画笔落下返回 True,如果画笔抬起返回 False。
(2)颜色控制
turtle.pencolor(*args)
参数:
pencolor()
返回表示当前画笔颜色的颜色描述字符串或元组。pencolor(colorstring)
设置画笔颜色为 colorstring 指定的 Tk 颜色描述字符串。
如:turtle.pencolor("brown")
或turtle.pencolor('#32c18f')
pencolor((r, g, b))
设置画笔颜色为以 r, g, b 元组表示的 RGB 颜色。r, g, b 的取值范围应为0…colormode。
如:turtle.pencolor((0.2, 0.8, 0.55))
或turtle.pencolor((51.0, 204.0, 140.0))
pencolor(r, g, b)
设置画笔颜色为以 r, g, b 表示的 RGB 颜色。r, g, b 的取值范围应为 0…colormode。
如:turtle.pencolor(0.2, 0.8, 0.55)
或turtle.pencolor(51.0, 204.0, 140.0)
作用:
返回或设置画笔颜色。
turtle.fillcolor(*args)
参数:同turtle.pencolor(*args)
fillcolor()
fillcolor(colorstring)
fillcolor((r, g, b))
fillcolor(r, g, b)
作用:
返回或设置填充颜色。
turtle.color(*args)
参数:
color()
返回以一对颜色描述字符串或元组表示的画笔颜色和填充颜色,两者可分别由 pencolor() 和 fillcolor() 返回。color(colorstring), color((r,g,b)), color(r,g,b)
同时设置填充颜色和画笔颜色为指定的值。color(colorstring1, colorstring2), color((r1,g1,b1), (r2,g2,b2))
相当于pencolor(colorstring1)
加fillcolor(colorstring2)
作用:
返回或设置画笔颜色和填充颜色。
(3)填充
turtle.filling()
作用:
返回填充状态 (填充为 True,否则为 False)。
turtle.begin_fill()
作用:
在绘制要填充的形状之前调用。要配合turtle.end_fill()
使用。
turtle.end_fill()
作用:
填充上次调用 begin_fill() 之后绘制的形状。要配合turtle.begin_fill()
使用。
例子:
import turtle
turtle.color("black","red")
turtle.begin_fill()
turtle.circle(80)
turtle.end_fill()
turtle.done()
(4)更多绘图控制
turtle.reset()
作用:
从屏幕中删除海龟的绘图,海龟回到原点并设置所有变量为默认值。
turtle.clear()
作用:
从屏幕中删除指定海龟的绘图。不移动海龟。海龟的状态和位置以及其他海龟的绘图不受影响。
turtle.write(arg, move=False, align="left", font=("Arial",8,"normal"))
参数:
arg – 要书写到 TurtleScreen 的对象
如:"something"
,123
,(1,2)
,[1,2,3]
等move – True/False
如果 move 为 True,画笔会移动到文本的右下角,这样文字就不会叠在一块了。align – 字符串 “left”, “center” 或 “right”
align 指定对齐方式 (“left”, “center” 或 right")font – 一个三元组 (fontname, fontsize, fonttype)
font 指定字体
书写文本 - arg 指定的字符串 - 到当前海龟位置。
例子:
import turtle
turtle.write("Home = ",True, align="center")
turtle.write([123,456],True)
turtle.done()
3.海龟状态
(1)可见性
turtle.hideturtle()
turtle.ht()
作用:
使海龟不可见。当你绘制复杂图形时这是个好主意,因为隐藏海龟可显著加快绘制速度。
turtle.showturtle()
turtle.st()
作用:
使海龟可见。
turtle.isvisible()
作用:
如果海龟显示返回 True,如果海龟隐藏返回 False。
(2)外观
turtle.shape(name=None)
参数:
- name – 一个有效的形状名字符串
- 无参:返回当前的形状名
设置海龟形状或返回当前的形状名。
形状名 | 图形 |
---|---|
“arrow” | ![]() |
“blank”(透明) | ![]() |
“turtle” | ![]() |
“circle” | ![]() |
“square” | ![]() |
“triangle” | ![]() |
“classic” | ![]() |
turtle.register_shape(name, shape=None)
turtle.addshape(name, shape=None)
调用此函数有三种不同方式:
name 为一个 gif 文件的文件名, shape 为 None: 安装相应的图像形状。:
注解:当海龟转向时图像形状 不会 转动,因此无法显示海龟的朝向!name 为指定的字符串,shape 为由坐标值对构成的元组: 安装相应的多边形形状。
import turtle
turtle.register_shape("myshape",((-20,20),(0,-10),(50,0)))
turtle.shape("myshape")
turtle.done()
- name 为指定的字符串, 为一个 (复合) Shape 类对象: 安装相应的复合形状。
作用:
将一个海龟形状加入 TurtleScreen 的形状列表。只有这样注册过的形状才能通过执行 shape(shapename) 命令来使用。
4.使用事件
turtle.onclick(fun, btn=1, add=None)
参数:
fun – 一个函数,调用时将传入两个参数表示在画布上点击的坐标。
如果 fun 值为 None,则移除现有的绑定。btn – 鼠标按钮编号,默认值为 1 (鼠标左键)
左中右:1,2,3add – True 或 False – 如为 True 则将添加一个新绑定,否则将取代先前的绑定
作用:
将 fun 指定的函数绑定到鼠标点击此海龟引发事件或移除绑定。(注意,不是随便点,是点击海龟)
例子:
import turtledefturtlefd(x,y):
turtle.fd(100)
turtle.onclick(turtlefd)
turtle.done()
turtle.onrelease(fun, btn=1, add=None)
参数:
fun – 一个函数,调用时将传入两个参数表示在画布上点击的坐标。
如果 fun 值为 None,则移除现有的绑定。btn – 鼠标按钮编号,默认值为 1 (鼠标左键)
add – True 或 False – 如为 True 则将添加一个新绑定,否则将取代先前的绑定
作用:
将 fun 指定的函数绑定到在此海龟上释放鼠标按键事件。(注意,在海龟上点击后释放鼠标才有效,在别的地方点击把鼠标拖过来释放无效)
turtle.ondrag(fun, btn=1, add=None)
参数:
fun – 一个函数,调用时将传入两个参数表示在画布上点击的坐标。
如果 fun 值为 None,则移除现有的绑定。btn – 鼠标按钮编号,默认值为 1 (鼠标左键)
add – True 或 False – 如为 True 则将添加一个新绑定,否则将取代先前的绑定
作用:
将 fun 指定的函数绑定到在此海龟上移动鼠标事件。
例子:在此之后点击并拖动海龟可在屏幕上手绘线条 (如果画笔为落下)
import turtledefturtlefd(x,y):
turtle.goto(x,y)
turtle.ondrag(turtlefd)
turtle.done()
5.特殊海龟方法
turtle.begin_poly()
开始记录多边形的顶点。当前海龟位置为多边形的第一个顶点。
turtle.end_poly()
停止记录多边形的顶点。当前海龟位置为多边形的最后一个顶点。它将连线到第一个顶点。
turtle.get_poly()
返回最新记录的多边形。
五、TurtleScreen/Screen 方法详解
1.窗口控制
turtle.bgcolor(*args)
参数:
同turtle.pencolor(*args)
作用:
设置或返回 TurtleScreen 的背景颜色。
turtle.bgpic(picname=None)
参数:
- picname – 一个字符串, gif-文件名, “nopic”, 或 None
如果 picname 为一个文件名,则将相应图片设为背景。
如果 picname 为 “nopic”,则删除当前背景图片。
如果 picname 为 None,则返回当前背景图片文件名。
作用:
设置背景图片或删除背景或返回当前背景图片名称。
PS:路径还是“\”或“/”,https://blog.csdn.net/sandalphon4869/article/details/86767978
turtle.reset()
turtle.resetscreen()
作用:
删除所有海龟的全部绘图,重置屏幕上的所有海龟为其初始状态。
turtle.clear()
turtle.clearscreen()
作用:
不仅达到turtle.reset()
的作用,而且删除背景片成白色背景,无事件绑定并启用追踪。
turtle.screensize(canvwidth=None, canvheight=None, bg=None)
参数:
canvwidth – 正整型数,以像素表示画布的新宽度值
这个值可以超过电脑屏幕的尺寸,可以展示一副超大的画布。canvheight – 正整型数,以像素表示画面的新高度值
这个值可以超过电脑屏幕的尺寸,可以展示一副超大的画布。bg – 颜色字符串或颜色元组,新的背景颜色
作用:
- 如未指定任何参数,则返回当前的 (canvaswidth, canvasheight)。
- 否则改变作为海龟绘图场所的画布大小。(通过此方法可以令之前绘制于画布之外的图形变为可见。可以使用滚动条观察画布的隐藏区域.)
PS:
画布大小还是以画布中心点为中心的,而且这个滑动条可以滑动展示的区域是展示图形的那个画布大小,而不是能一直无限地拖动。
2.动画控制
turtle.delay(delay=None)
参数:
- delay – 正整型数
- 无参返回以毫秒数表示的延迟值 delay
作用:
设置或返回以毫秒数表示的延迟值 delay。(这约等于连续两次画布刷新的间隔时间。) 绘图延迟越长,动画速度越慢。
turtle.tracer(n=None, delay=None)
参数:
n – 非负整型数
如果指定 n 值,则只有每第 n 次屏幕刷新会实际执行。(可被用来加速复杂图形的绘制。)
如果调用时不带参数,则返回当前保存的 n 值。delay – 非负整型数
第二个参数设置延迟值 (参见 delay())。
作用:
启用/禁用海龟动画并设置刷新图形的延迟时间。
turtle.update()
作用:
执行一次 TurtleScreen 刷新。在禁用追踪时使用。
3.使用屏幕事件
turtle.listen(xdummy=None, ydummy=None)
作用:
设置焦点到 TurtleScreen (以便接收按键事件)。使用两个 Dummy 参数以便能够传递 listen() 给 onclick 方法。
turtle.onkeypress(fun, key=None)
参数:
fun – 一个无参数的函数或 None
如果 fun 值为 None,则移除事件绑定。key – 一个字符串: 键 (例如 “a”) 或键标 (例如 “space”)
如未指定键则绑定到任意键的按下事件。
作用:
绑定 fun 指定的函数到指定键的按下事件。注: 为了能够注册按键事件,必须得到焦点。(参见 listen() 方法。)
例子:
#按方向上键画正方形(可以一直按进行快速移动)import turtledeff():
turtle.fd(100)
turtle.left(90)
turtle.speed(0)
turtle.listen()
turtle.onkeypress(f,"Up")#解除绑定 turtle.onkeypress(None,"Up")
turtle.done()
turtle.onkey(fun, key)
turtle.onkeyrelease(fun, key)
参数:
fun – 一个无参数的函数或 None
如果 fun 值为 None,则移除事件绑定。key – 一个字符串: 键 (例如 “a”) 或键标 (例如 “space”)
作用:
绑定 fun 指定的函数到按键按下并释放事件。
注: 为了能够注册按键事件,TurtleScreen 必须得到焦点。(参见listen() 方法)
例子:
#按方向上键释放后开始画正方形import turtledeff():
turtle.fd(100)
turtle.left(90)
turtle.speed(0)
turtle.listen()
turtle.onkey(f,"Up")#解除绑定 turtle.onkey(None,"Up")
turtle.done()
turtle.onscreenclick(fun, btn=1, add=None)
参数:
fun – 一个函数,调用时将传入两个参数表示在画布上点击的坐标。
如果 fun 值为 None,则移除现有的绑定。btn – 鼠标按钮编号,默认值为 1 (鼠标左键)
add – True 或 False – 如为 True 则将添加一个新绑定,否则将取代先前的绑定
作用:
绑定 fun 指定的函数到鼠标点击屏幕事件。
PS:turtle.onclick()
和turtle.onscreenclick()
不一样,前者是只有点击到海龟身上才行,后者是点击画布任意区域就行。
例子:
#点击画布任意区域,海龟移动到那里import turtledeff(x,y):
turtle.goto(x,y)
turtle.onscreenclick(f)
turtle.done()
turtle.ontimer(fun, t=0)
参数:
fun – 一个无参数的函数
t – 一个数值 >= 0
作用:
安装一个计时器,在 t 毫秒后调用 fun 函数。
例子:
import turtledeff():
turtle.fd(100)
turtle.ontimer(f,100)
turtle.done()
turtle.mainloop()
turtle.done()
必须作为一个海龟绘图程序的结束语句。要不然程序会无响应。
4.设置与特殊方法
turtle.mode(mode=None)
参数:
- mod