turtle库是python标准库之一,入门级绘图库。import turtle之后即可使用。
以下是关于turtle的语句文档,可能有遗漏,但是够用了
画布
turtle.screensize() //设置画布像素背景颜色
代码语言:javascript复制turtle.screensize(800,600,'green')#设置画布像素为800*600 画布背景为绿色
turtle.setup(width,height)//设置画布在屏幕上的位置,一般不用
画笔
turtle.pensize()//设置画笔的宽度
turtle.pencolor()//设置画笔的颜色
turtle.speed() //设置画笔的移动速度(1-10),越高越快
绘图命令
画笔运动命令
命令 | 说明 |
---|---|
turtle.forward(距离) | 向当前画笔方向移动距离像素长度 |
turtle.backward(距离) | 向当前画笔反方向移动距离像素长度 |
turtle.right(度) | 顺时针移动多少度 |
turtle.left(度) | 逆时针移动多少 |
turtle.pendown() | 放下笔 |
turtle.goto(x,y) | 将画笔移动到坐标x,y的位置 |
turtle.penup() | 提起移笔移动,不绘制图形,用于另起一个地方绘制 |
turtle.circle() | 画圆,半径为正(负),表示圆心在画笔的左(右)边画圆 |
setx() | 将当前X轴移动到指定位置 |
sety() | 将当前y轴移动到指定位置 |
setheading(angle) | 设置当前朝向为angle角度 |
home() | 设置当前画笔位置为原点,朝向东 |
dot(r) | 绘制一个指定直径和颜色的圆点 |
画笔控制命令
命令 | 说明 |
---|---|
turtle.fillcolor(colorstring) | 绘制图形的填充颜色 |
turtle.color(color1, color2) | 同时设置pencolor=color1, fillcolor=color2 |
turtle.filling() | 返回当前是否在填充状态 |
turtle.begin_fill() | 准备开始填充图形 |
turtle.end_fill() | 填充完成 |
turtle.hideturtle() | 隐藏画笔的turtle形状 |
turtle.showturtle() | 显示画笔的turtle形状 |
全局控制命令
命令 | 说明 |
---|---|
turtle.clear() | 清空turtle窗口,但是turtle的位置和状态不会改变 |
turtle.reset() | 清空窗口,重置turtle状态为起始状态 |
turtle.undo() | 撤销上一个turtle动作 |
turtle.isvisible() | 返回当前turtle是否可见 |
stamp() | 复制当前图形 |
turtle.write(s [,font=("font-name",font_size,"font_type")]) | 写文本,s为文本内容,font是字体的参数,分别为字体名称,大小和类型;font为可选项,font参数也是可选项 |
绘制木叶徽章
我是一个资深的影迷,所以就试着用turtle库绘制一个木叶徽章。
起初,大致一看,这应该是不规则的画圆,于是在大脑中将图案拆分成了N多线段,因为发现有的线段有圆的一部分,可以用
代码语言:javascript复制turtle.circle()
解决 虽然麻烦了点,不过还是值得一试!于是开始了沙雕一样的自己写方法
代码语言:javascript复制#Coding utf-8
import turtle as t
t.screensize(400,300,'white')#设置画布大小和背景色
#定义一个方法循环绘制,参数分别为:角度,像素长度,循环次数
def angler(ang,pi,would):
for hour in range(would):
t.right(ang)
t.forward(pi)
#设置画笔宽度颜色速度
t.pensize(5)
t.pencolor('black')
t.speed(10)
#绘制中心点直线
t.right(50)
t.forward(25)
angler(12,5,13)
t.left(1)
t.forward(2)
angler(3,1,15)
angler(2,2,5)
angler(3,3,10)
t.circle(-30,120)
angler(1.5,2,24)
angler(5,4,18)
t.right(5)
t.forward(60)
t.right(100)
t.forward(65)
t.backward(65)
t.left(100)
t.backward(60)
#angler(25,15,4)
#t.hideturtle()
t.done()
起初想过从最后那条小尾巴开始倒着画过来的,试了一下画着不太舒服就打算从中心开始画 画出来的样子不忍直视
这个三角太小了吧!加大一点
这是个啥!!这不是我想要的木叶(╯‵□′)╯︵┴─┴
不行,照这样画下去先不说我自己想打死自己,单是影迷朋友就能打死我了 重新分析了一下图,感觉可以用螺旋线和直线来画 整个图就分为螺旋线和三条直线,先整螺旋线 But! 我数学很差劲 于是补了一下
Sin(0)=y/r Cos(0)=x/r 于是可知 x=cos(0)*r y=sin(0)*x
然后又去看了一眼斐波那契螺旋线,真的只是看了一眼就放弃了
通过
代码语言:javascript复制x =math.sin(i*math.pi/180)*r
y =math.cos(i*math.pi/180)*r
能得到一个圆的坐标,然后根据坐标画线能画出一个圆 but,我们是要画螺旋线,在画圆的过程中逐渐扩大半径就能得到一个螺旋线 先试试康
代码语言:javascript复制import turtle as t
import math
t.screensize(800,600)#设置画布大小
r=0
#计算XY并且累加r绘制
for i in range(360):
x =math.sin(i*math.pi/180)*r
y =math.cos(i*math.pi/180)*r
t.goto(x,y)
r =1
t.done()
然后一个螺旋线就粗来了 想要图中效果就需要对数据进行调整 一番微调之后
大体形状就是介个亚子,将线条改细小尾巴画出来
还差两条线,通过判断循环变量的值来确定是否画线,于是出现了这样的东西
还有这样的:
离真相很近了!一番改改改之后
大体形状是有了,但是多出来的那条线需要处理掉 绘制完两调直线后提笔,回到坐标点在放笔,最后再调整一下小尾巴的角度,一切的一切就达到了预期
代码如下(太懒了,就不详细说明了):
代码语言:javascript复制import turtle as t
import math
t.screensize(800,600,'black')#设置画布大小和背景色
#设置画笔颜色宽度速度
t.pencolor('white')
t.pensize(4)
t.speed(10)
r=0
for i in range(770):
x =math.sin(i*math.pi/180)*r
y =math.cos(i*math.pi/180)*r
t.goto(x,y)
if i == 550:
t.backward(60)
t.right(115)
t.backward(60)
t.penup()
t.goto(x, y)
t.pendown()
r =0.07
t.right(200)
t.forward(37)
t.hideturtle()
t.done()