Bootstrap

python冲击二级---基本库turtle,海龟绘图详解,史上最全,没有之一

** turtle — 海龟绘图**

海龟绘图很适合用来引导孩子学习编程。最初来自于 Wally Feurzeig, Seymour Papert 和 Cynthia Solomon 于1967 年所创造的 Logo 编程语言。请想象绘图区有一只机器海龟,起始位置在 x-y 平面的 (0, 0) 点。

首先了解下海龟绘图的坐标体系:
在这里插入图片描述图中红点部分,就是海龟画笔的起点坐标(0,0),海龟的头部是x轴方向,为0度。看看这个坐标系的代码:

import turtle
#写下坐标
turtle.write(turtle.position(),align="right")
#画一个直径为10的红色圆点
turtle.dot(10,'red')
#前进200个像素距离
turtle.forward(200)
#盖上印章,默认为海龟的形状
turtle.stamp()
#写上x,代表x轴
turtle.write("x")
#写上坐标
turtle.write(turtle.position(),align="right")
#返回原点
turtle.home()
#海龟方向左转90度,也就是逆时针
turtle.left(90)
#前进200
turtle.forward(200)
turtle.stamp()
turtle.write("y")
turtle.write(turtle.position(),align="right")

turtle.home()
turtle.left(180)

turtle.forward(200)
turtle.write(turtle.position(),align="right")

turtle.home()
turtle.left(270)

turtle.forward(200)
turtle.write(turtle.position(),align="right")

turtle.home()
#为了保留图形,开启循环
turtle.done()

了解了坐标系,我们就能按照要求画出合适的图形,上面的事全部的流程,我们可以用循环简化代码。

import turtle
#写下坐标
turtle.write(turtle.position(),align="right")
#画一个直径为10的红色圆点
turtle.dot(10,'red')
#前进200个像素距离
agel = 0
for i in ("xy"):
    turtle.left(agel)
    turtle.forward(200)
    turtle.stamp()
    turtle.write(i)
    turtle.write(turtle.position(),align="right")
    #后退400
    turtle.backward(400)
    turtle.home()
    #角度增加
    agel += 90 
turtle.done()

下面我们了解一下turtle的各个画图工具函数:

海龟动作

移动和绘制

forward() | fd() 前进
backward() | bk() | back() 后退
right() | rt() 右转
left() | lt() 左转
goto() | setpos() | setposition() 前往/定位
setx() 设置 x 坐标
sety() 设置 y 坐标
setheading() | seth() 设置朝向
home() 返回原点
circle() 画圆
dot() 画点
stamp() 印章
clearstamp() 清除印章
clearstamps() 清除多个印章
undo() 撤消
speed() 速度

获取海龟的状态
position() | pos() 位置
towards() 目标方向
xcor() x 坐标
ycor() y 坐标
heading() 朝向
distance() 距离

设置与度量单位

degrees() 角度
radians() 弧度

画笔控制

绘图状态

pendown() | pd() | down() 画笔落下
penup() | pu() | up() 画笔抬起
pensize() | width() 画笔粗细
pen() 画笔
isdown() 画笔是否落下

颜色控制
color() 颜色
pencolor() 画笔颜色
fillcolor() 填充颜色

填充
filling() 是否填充
begin_fill() 开始填充
end_fill() 结束填充

更多绘图控制
reset() 重置
clear() 清空
write() 书写

海龟状态

可见性
showturtle() | st() 显示海龟
hideturtle() | ht() 隐藏海龟
isvisible() 是否可见

外观
shape() 形状
resizemode() 大小调整模式
shapesize() | turtlesize() 形状大小
shearfactor() 剪切因子
settiltangle() 设置倾角
tiltangle() 倾角
tilt() 倾斜
shapetransform() 变形
get_shapepoly() 获取形状多边形

使用事件
onclick() 当鼠标点击
onrelease() 当鼠标释放
ondrag() 当鼠标拖动

特殊海龟方法
begin_poly() 开始记录多边形
end_poly() 结束记录多边形
get_poly() 获取多边形
clone() 克隆
getturtle() | getpen() 获取海龟画笔
getscreen() 获取屏幕
setundobuffer() 设置撤消缓冲区
undobufferentries() 撤消缓冲区条目数

TurtleScreen/Screen 方法

窗口控制
bgcolor() 背景颜色
bgpic() 背景图片
clearscreen()
resetscreen()
screensize() 屏幕大小
setworldcoordinates() 设置世界坐标系

动画控制
delay() 延迟
tracer() 追踪
update() 更新

使用屏幕事件
listen() 监听
onkey() | onkeyrelease() 当键盘按下并释放
onkeypress() 当键盘按下
onclick() | onscreenclick() 当点击屏幕
ontimer() 当达到定时
mainloop() | done() 主循环

设置与特殊方法
mode()
colormode() 颜色模式
getcanvas() 获取画布
getshapes() 获取形状
register_shape() | addshape() 添加形状
turtles() 所有海龟
window_height() 窗口高度
window_width() 窗口宽度

输入方法
textinput() 文本输入
numinput() 数字输入

Screen 专有方法
bye() 退出
exitonclick() 当点击时退出
setup() 设置
title() 标题

下面我们通过示例来了解绘图的各个方法:

为了方便学习,先画出一个虚线的坐标系,x,y方向都是±400,作为我们底图,通过坐标来研究各个函数的绘图结果

import turtle

def coord():
    angle = 0
    for i in [(-400,0),(0,-400)]:
        turtle.penup()
        turtle.goto(*i)
        turtle.left(angle)
        for _ in range(40):
        #通过画笔抬起再放下画出虚线
            turtle.pendown()
            turtle.forward(10)
            turtle.penup()
            turtle.forward(10)
        angle += 90
    turtle.home()
    turtle.pendown()

在这里插入图片描述首先请大家记住,在我们画图过程中,如果没有明确的指定坐标,角度,那我们所有的角度,位置都是相对的,相对当前海龟的位置和角度。

turtle.circle(radius, extent=None, steps=None)
参数
• radius -- 一个数值
• extent -- 一个数值 (None)
• steps -- 一个整型数 (None)
绘制一个 radius 指定半径的圆。圆心在海龟左边 radius 个单位;extent 为一个夹角,用来决定绘制
圆的一部分。如未指定 extent* 则绘制整个圆。如果 *extent 不是完整圆周,则以当前画笔位置为一
个端点绘制圆弧。如果 radius 为正值则朝逆时针方向绘制圆弧,否则朝顺时针方向。最终海龟的朝
向会依据 extent 的值而改变。
圆实际是以其内切正多边形来近似表示的,其边的数量由 steps 指定。如果未指定边数则会自动确
定。此方法也可用来绘制正多边形。
import turtle

#设置画图速度
turtle.speed('fast')
#设置窗口标题
turtle.title("海龟绘图学习")
#设置画笔粗细
turtle.pensize(3)
#绘制虚线坐标系
def coord():
    angle = 0
    for i in [(-400,0),(0,-400)]:
        turtle.penup()
        turtle.goto(*i)
        turtle.left(angle)
        for _ in range(40):
            turtle.pendown()
            turtle.forward(10)
            turtle.penup()
            turtle.forward(10)
        angle += 90
    turtle.home()
    turtle.pendown()

coord()

#画一个半径为100的圆形,注意圆心位置

turtle.circle(100)
turtle.goto(0,100)
turtle.dot(10,'red')
turtle.write("这是圆心位置{}".format(turtle.pos()))
turtle.done()

在这里插入图片描述下面是通过circle函数化半圆只需更改部分参数即可,和多边形的示例:

#第二个参数改为180度画半圆,也可为复数,则顺时针画圆
turtle.circle(100,180)
#画六边形
turtle.circle(100,360,6)
#画三角形
turtle.circle(100,360,3)

在这里插入图片描述

turtle.goto(x, y=None)
turtle.setpos(x, y=None)
turtle.setposition(x, y=None)
参数
• x -- 一个数值或数值对/向量
• y -- 一个数值或 None
如果 y 为 None,x 应为一个表示坐标的数值对或Vec2D 类对象 (例如pos() 返回的对象).
海龟移动到一个绝对坐标。如果画笔已落下将会画线。不改变海龟的朝向。
turtle.speed(speed=None)
参数 speed -- 一个 0..10 范围内的整型数或速度字符串 (见下)
设置海龟移动的速度为 0..10 表示的整型数值。如未指定参数则返回当前速度。
如果输入数值大于 10 或小于 0.5 则速度设为 0。速度字符串与速度值的对应关系如下:
• ”fastest”: 0 最快
• ”fast”: 10 快
• ”normal”: 6 正常
• ”slow”: 3 慢
• ”slowest”: 1 最慢
速度值从 110,画线和海龟转向的动画效果逐级加快。
注意: speed = 0 表示 没有动画效果。forward/back 将使海龟向前/向后跳跃,同样的 left/right 将使海
龟立即改变朝向。

如果我们要画一个直角三角形怎么办,一个正方形怎么办,显然circle函数无法满足我们的所有要求,那就要利用角度和移动来绘画:

turtle.left(angle)
turtle.lt(angle)
参数 angle -- 一个数值 (整型或浮点型)
海龟左转 angle 个单位。(单位默认为角度,但可通过degrees() 和radians() 函数改变设置。)
角度的正负由海龟模式确定,参见mode()
turtle.right(angle)
turtle.rt(angle)
参数 angle -- 一个数值 (整型或浮点型)
海龟右转 angle 个单位。(单位默认为角度,但可通过degrees() 和radians() 函数改变设置。)
角度的正负由海龟模式确定,参见mode()
turtle.setheading(to_angle)
turtle.seth(to_angle)
参数 to_angle -- 一个数值 (整型或浮点型)
设置海龟的朝向为 to_angle。以下是以角度表示的几个常用方向:

标准模式      logo 模式
  0 -0 -90 -90 -180 - 西      180 -270 -270 - 西

以上为三个调整海龟角度朝向的函数,我们大部分的图形都是要靠它们来完成的。


turtle.color("red")

#平行四边形,夹角分别为60度,120度
#提起画笔
turtle.penup()
#设置海龟坐标(150,150)
turtle.setpos(150,150)
#放下画笔开始绘画
turtle.pendown()
#利用setheading,改变方向,
turtle.fd(100)
#角度为为对比x轴方向的偏移度数
turtle.setheading(60)
turtle.fd(50)
turtle.setheading(180)
turtle.fd(100)
turtle.setheading(240)
turtle.fd(50)
turtle.
;