前言
第一次来写博客十分激动。:)
最近才开始慢慢的学习python3,编程一直学的很烂,不过也是决定把平时一些迷惑和解决记录下来加深印象,否则大概转头就忘了。
前两天粗略学了turtle画图,本来对这麻烦的绘画没有太大兴趣,但是在网上看了一圈发现就这简陋的东西大佬们都可以画出超级好看的图,遂决定自己也来画一画试试。
turtle的基本使用
首先要引入turtle库 import turtle
但是接下来函数都会需要turtle.xxx,这样每次都要打一次,很麻烦。
所以我们可以给它import turtle as t重新命名,
或者直接全部引入from turtle import*,这样的方法之后使用函数可以不用加前缀,但是当里面的某函数名与其他函数重名的时候可能会出问题,所以这种方法通常少用。不过在这里我们这个文件只使用turtle所以这个还是好用的。
(以下指令如果没使用from turtle import*需要加上turtle.前缀)
1.画布
- screensize(width,height,bg) 里面三个参数分别是画布宽,高,背景颜色。
例如:screensize(800,600,'green')
如果不填就返回默认的大小400*300。 - setup(width,height) 创建画布。
- bgcolor(color) 背景颜色。
2.画笔
- pensize(size) 或者width(size) 画笔的大小。
- pencolor(color) 画笔的颜色。同上可以使用已经预置的颜色名称,也可以自己用RGB调。
- speed(speed) 画笔速度,[0,10]数字越大越快。
3.绘制
默认画笔位置是画布中心(原点),方向是x轴正方向。
- forward(x) 向前行进x距离。简写fd。
- backward(x) 向后退x距离。简写bk。
- right(angle) 向右转angle角度。简写rt。
- left(angle) 向左转angle角度。简写lt。(个人认为简写了反而很乱||)
- penup() 抬笔,此时之后操作不会画在画布上,只是移动画笔位置。简写pu/up。
- pendown() 落笔,此时之后操作会在画布上绘制。简写pd/down。
- goto(x,y) 移动到(x,y)位置。我的疑惑目前还不知道goto之后画笔的方向是如何变化,也没查到有人说这个问题,因此我在使用goto之后会执行一个forward看一下方向再继续写。后面再提这个问题。
- circle(x,angle) 以x为半径画圆/圆弧。此处的半径是正数则从画笔方向往左开始圆弧,负数则往右。
下面还有两个关于是否显示我们的画笔箭头图标的指令。 - hideturtle() 隐藏turtle。
- showturtle() 显示turtle。
为了美观我们可以隐藏一下。
4.填色
首先在画我们需要填色的图形前使用
- begin_fill() 表示开始填色状态,不过此时并不会产生变化。
之后我们可以绘制一个封闭图形。 - fillcolor(color) 设置想填充的颜色。
- end_fill() 表示结束填色状态,此时我们的图形就被填上色了。
最后所有东西都画完加上结束指令
- done()
下面还有几个我没用到的指令。
- reset() 清空窗口恢复原始状态。
- setheading(angle) 设置当前画笔角度为angle。(啊!我要是早看见这条就不用那么费劲了)
- write(s,[font=("font-name",font_size,"font_type")]) 文本指令,可以打字并且设置参数。s为文本内容,font是字体的参数,分别为字体名称,大小和类型。
还有一些没提到的指令,比较少用。
来画一杯橙汁
看到了别人画的樱花树、卡通形象等等十分精致,我觉得我不行。不过又不想copy别人的代码回来,还是想自己画,于是本橙汁爱好者果然还是要画橙汁!
代码如下:
from turtle import *
setup(800,600)
bgcolor("bisque")
speed(10)
pensize(8)
penup()
'''cup'''
pencolor('lightblue')
goto(-100,-150)
right(30)
pendown()
circle(200,60)
left(60)
forward(250)
left(60)
circle(200,60)
left(120)
circle(200,60)
penup()
goto(-100,100)
pendown()
goto(-100,-150)
'''lemon'''
penup()
pencolor('yellow')
goto(-100,60)
pd()
right(30)
circle(60)
penup()
pensize(4)
goto(-100,70)
pd()
begin_fill()
color('yellow','khaki')
circle(50)
end_fill()
for i in range(4):
circle(50,45)
left(90)
forward(100)
left(90)
penup()
'''juice'''
goto(-100,-150)
begin_fill()
color('orange')
pencolor('lightblue')
right(90)
pd()
forward(130)
pencolor('orange')
circle(-50,180)
circle(50,180)
pencolor('lightblue')
goto(100,-150)
penup()
goto(-100,-150)
right(120)
pendown()
circle(200,60)
end_fill()
pencolor('white')
pensize(10)
penup()
goto(80,30)
pd()
goto(80,-40)
penup()
goto(80,-60)
pd()
goto(80,-65)
hideturtle()
penup()
pencolor('seashell')
goto(0,0)
pd()
goto(80,170)
goto(110,188)
done()
虽然分成了几个不同的部分绘制,但顺序并不能调换。
因为每一步都是在上一步进行完的位置基础上进行,也涉及到之前那个goto执行完画笔的角度未知,可能前序操作不同goto之后的角度也不同。
如果使用刚才看到的那个设置画笔角度的指令进行角度的初始化加上每个板块之前都用goto位置初始化,也许可以解决这个问题。
虽然没有用到任何高大上的方法,只是很简单的画图,我也比较心满意足了。
在此记录一下。