圆蛋快乐
本文作者:陈志玲
文字编辑:钱梦璇
技术总编:张 邯
2020来了,2020来了,2020悄无声息地来了!转眼我们已经到了2020年,在此,爬虫俱乐部全体成员祝各位:
新的一年开始了,不管过去的一年是好是坏,希望我们都可以在小憩之后愉快地踏上新的征程。大家有没有觉得蛋蛋有点可爱呢?“元旦快乐”是不是写得很工整呢?哈哈哈,这都是我们即将介绍的turtle库的功劳哦。
turtle库是Python的一个内置库,也叫海龟绘图,最初是为了用来引导孩子学习编程的。它是依据坐标轴来绘制图像,可通过控制画笔(想象成一个海龟)在坐标平面上移动,来绘制你想要的各式各样的图像或者文字。因为是内置库,所以我们直接导入turtle库就可使用其中的各种函数。
from turtle import *
turtle库中的所有函数基本可以分为设置画布和控制画笔这两类。当想画画时我们要先准备画板,同样地,当我们想用turtle来绘制图像时,也要先设置画布。
一、画布
首先我们要选择画板的大小,即设置绘图区域的大小和位置:
turtle.screensize(canvwidth=None, canvheight=None, bg=None)
该函数的参数分别设置画板的宽、高和背景颜色,如果不设置一般默认画布大小为(400,300)。
screensize(400,400,'seashell')
二、画笔
设置好画布的大小和颜色之后,就可以开始拿起画笔,于是我们开始挑选画笔的粗细和颜色,接着开始控制画笔走向和距离等。
函数 | 功能 |
turtle.pensize() | 设置画笔的宽度 |
turtle.pencolor() | 设置画笔的颜色 |
turtle.forward(distance) | 画笔向前移动距离 |
turtle.backward(distance) | 画笔向后移动距离 |
turtle.right(degree) | 画笔顺时针移动角度 |
turtle.left(degree) | 画笔逆时针移动角度 |
penup() | 提笔移动(只移不画) |
pendown() | 落笔移动(边画边移) |
turtle.goto(x,y) | 画笔将要移到位置 |
turtle.circle() | 画圆 |
turtle.fillcolor(colorstring) | 填充颜色 |
turtle.begin_fill() | 开始填充 |
turtle.end_fill() | 结束填充 |
turtle.hideturtle() | 隐藏画笔 |
简单介绍一下circle函数的使用:turtle.circle(radius,extent=None, steps=None)
radius参数是指定圆的半径,当其为正(负)时表示圆心在笔的左(右)边。extent为可选参数,表示圆的弧度。steps也为可选参数,代表画半径为radius的圆的内切多边形的边数。
circle(30,steps=3)
以上就是我们调用turtle库时常用的函数,还有一个最重要的函数。如果没有它你的程序可能永远不会终止结束,所以它是乌龟图形程序的最后一个语句,即:
turtle.mainloop()或turtle.done()
三、“元”
因为每一个字都有很多笔画,所以本文将每一个字都封装成一个函数,通过调用函数来实现。
元,代表“始”,凡数之始成为“元”,我们今天将详细介绍画“元”的程序。因为要写四个字,故将画布分为四部分,即和坐标轴中的象限正好吻合,“元”在第二象限,“旦”在第一象限,“快”在第三象限,“乐”在第四象限。
def yuan(): #首先定义函数yuan()
pensize(10) #画笔粗细为10
pencolor('purple') #画笔颜色为紫色
up() #提起画笔
pensize(10) #画笔粗细为10
pencolor('purple') #画笔颜色为紫色
goto(-200,200) #将画笔移至坐标为(-200,200)的位置
down() #落笔开始画
goto(-140,200) #画至坐标为(-140,200)的位置
up()#再次提笔移动
goto(-220,170)#移至坐标为(-220,170)的位置
down()#落笔开始画
goto(-120,170)#画至坐标为(-120,170)的位置,即第二笔,一横
backward(50)#此时画笔还在第二横的末尾,将画笔反向移动50像素
right(90) #将画笔顺时针旋转90度
a=1 #因为此笔为一捺,所以需要有弯度,通过循环使角度不断变化
for i in range(0,25): #将弯度限制在25度之内
a=a+0.2
right(2.5)#每次循环顺时针旋转2.5度
forward(a)#向前移动a像素
up() #提笔移动
goto(-160,170) #移至(-160,170)
down()#落笔移动
left(62.5)#逆时针旋转62.5度
forward(65)#向前65像素 ,即竖
left(90)#再逆时针旋转90度
forward(50)#再向前50像素,即弯
left(90)#在逆时针旋转90度
forward(15)#再向前15像素,即钩
至于中间为什么会有一个逆时针旋转62.5度呢?得解释一下,在画捺时,我们循环了25次,每次顺时针旋转2.5度,那么当捺写完时我们向右边转了25*2.5=62.5度。所以当我们想回到之前的位置和方向时就不得不逆时针旋转62.5度。
在“元”字的程序中小编并没有放入隐藏画笔(hideturtle())和结束循环(done())的函数。因为程序后面还有三个字和一个蛋没有完成,如果放入会导致后面的程序无法运行或者即使运行了也无法看见。
用turtle库写字就是不停的变换坐标,所以在画之前要先在纸上计算好坐标。如果不想用坐标,你也可以使用变换画笔角度,使用向前或反向移动,但那也得提前算好每一笔之间的角度。不过小编认为角度比坐标更难找,很容易晕头转向。当然turtle库的奇妙之处远不止此,但不管用其画什么内容都离不开以上所介绍的函数。
附上完整程序:
from turtle import *
screensize(400,400,'seashell')
def yuan():
pensize(10)
pencolor('purple')
up()
goto(-200,200)
down()
goto(-140,200)
up()
goto(-220,170)
down()
goto(-120,170)
backward(50)
right(90)
a=1
for i in range(90,115):
a=a+0.2
right(2.5)
forward(a)
up()
goto(-160,170)
down()
left(62.5)
forward(65)
left(90)
forward(50)
left(90)
forward(15)
def dan():
width(10)
pencolor('red')
up()
goto(120,200)
down()
goto(125,130)
up()
goto(120,200)
down()
goto(200,200)
right(90)
goto(190,130)
up()
goto(135,165)
down()
forward(50)
up()
goto(125,130)
down()
forward(60)
up()
goto(100,100)
down()
forward(120)
def kuai():
width(10)
pencolor('yellow')
up()
goto(-200,-110)
down()
goto(-200,-220)
up()
goto(-210,-160)
down()
goto(-225,-180)
up()
goto(-190,-160)
down()
goto(-180,-170)
up()
goto(-160,-130)
down()
goto(-110,-130)
goto(-110,-160)
up()
goto(-170,-160)
down()
goto(-90,-160)
up()
goto(-130,-110)
down()
goto(-160,-220)
up()
goto(-140,-160)
down()
goto(-100,-215)
def le():
width(10)
pencolor('pink')
up()
goto(190,-110)
down()
goto(130,-120)
goto(120,-170)
goto(210,-170)
up()
goto(165,-120)
down()
goto(165,-230)
goto(140,-210)
up()
goto(140,-190)
down()
goto(120,-220)
up()
goto(180,-190)
down()
goto(205,-220)
def dandan():
width(1)
up()
goto(0,-120)
down()
begin_fill()
color("wheat","wheat")
a=1
for i in range(120):
if 0<=i<30 or 60<=i<90:
a=a+0.2
left(3) #向左转3度
forward(a) #向前走a的步长
else:
a=a-0.2
left(3)
forward(a)
end_fill()
pencolor("black")
width(3)
up()
goto(-18,0)
down()
left(90)
circle(10,180)
up()
goto(30,0)
down()
right(180)
circle(10,180)
up()
goto(-20,-50)
down()
circle(20,180)
def luokuan():
up()
goto(200,-280)
down()
write("------from 爬虫俱乐部", align="center", font=("楷体", 16, "normal"))
hideturtle()
done()
yuan()
dan()
kuai()
le()
dandan()
luokuan()
HAPPY NEW YEAR
“气功”研究哪家强
数据长、宽整型之另辟蹊径
10分钟带你走进宝藏数据库BvD
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。