在抖音上面看到了有人画的冬奥会的冰墩墩,自己也想做一个。当然,图案的绘制还是得使用我们熟悉的turtle框架。原因很简单,它是一种基于canvas画布的UI框架。
文末附完整源代码,可直接运行。
首先,将这个turtle库安装好。
pip install turtle
将turtle导入我们的模块使用即可。
import turtle as tle
设置画笔的全局属性,先设置画笔的基本速度和UI界面的标题吧
tle.speed(50) # 速度设置为100 tle.title('冬奥会:冰墩墩! 公众号:[Python 集中营]') # 设置好UI界面的标题 tle.bgcolor('white') # 将背景颜色设置为白色,有冬季的感觉... tle.pencolor("deep sky blue") tle.fillcolor("deep sky blue")
设置好画笔的全局属性以后,接下来就是图形绘制的部分。思路就是拿一只画笔在画布上面画图就好了。
在开始绘制之前,先来说明一下几个主要函数的使用方法。代码量比较多,但是用到的函数基本都是下面这几个。
turtle.goto(x,y) 将画笔移动到坐标为x,y的位置 turtle.penup() 提起笔移动,不绘制图形,用于另起一个地方绘制 turtle.circle() 画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆 setheading(angle) 设置当前朝向为angle角度 turtle.pendown() 移动时绘制图形,缺省时也为绘制 turtle.begin_fill() 准备开始填充图形 turtle.end_fill() 填充完成 turtle.left(degree) 逆时针移动degree° turtle.forward(distance) 向当前画笔方向移动distance像素长度
画出冰墩墩的两个耳朵,注意在画布上把握好坐标,尽量计划将冰墩墩放在画布的正中间。
# 冰墩墩左耳朵 tle.penup() tle.goto(-120, 200) tle.setheading(160) tle.begin_fill() tle.pendown() tle.circle(-30, 230) tle.setheading(180) tle.circle(37, 90) tle.end_fill() # 冰墩墩右耳朵 tle.penup() tle.goto(90, 200) tle.setheading(20) tle.begin_fill() tle.pendown() tle.circle(30, 230) tle.setheading(0) tle.circle(-37, 90) tle.end_fill()
绘制冰墩墩的头部,头部主要是通过弧线构成的。
# 冰墩墩头部 tle.pensize(5) tle.penup() tle.goto(-83, 237) tle.setheading(30) tle.pendown() tle.circle(-134, 60) tle.penup() tle.goto(-120, 200) tle.setheading(-120) tle.pendown() tle.circle(200, 80) tle.penup() tle.goto(90, 200) tle.setheading(-60) tle.pendown() tle.circle(-200, 80) tle.penup() tle.setheading(210) tle.pendown() tle.circle(-120, 60)
绘制冰墩墩的双眼情况,双眼主要由眼圈、眼眶、眼珠构成的。
# 冰墩墩左眼 tle.penup() tle.goto(-110, 100) tle.setheading(-45) tle.begin_fill() tle.pendown() agle = 0.2 for i in range(120): if 0 <= i < 30 or 60 <= i < 90: agle = agle + 0.1 tle.left(3) tle.forward(agle) else: agle = agle - 0.1 tle.left(3) tle.forward(agle) tle.end_fill() tle.fillcolor("white") tle.penup() tle.goto(-73, 125) tle.setheading(0) tle.begin_fill() tle.pendown() tle.circle(14, 360) tle.end_fill() tle.penup() tle.goto(-72, 133) tle.setheading(0) tle.begin_fill() tle.pendown() tle.circle(6, 360) tle.end_fill() # 冰墩墩右眼 tle.penup() tle.goto(80, 100) tle.setheading(45) tle.begin_fill() tle.fillcolor("deep sky blue") tle.pendown() agle = 0.2 for i in range(120): if 0 <= i < 30 or 60 <= i < 90: agle = agle + 0.1 tle.left(3) tle.forward(agle) else: agle = agle - 0.1 tle.left(3) tle.forward(agle) tle.end_fill() tle.fillcolor("white") tle.penup() tle.goto(43, 125) tle.setheading(0) tle.begin_fill() tle.pendown() tle.circle(14, 360) tle.end_fill() tle.penup() tle.goto(42, 133) tle.setheading(0) tle.begin_fill() tle.pendown() tle.circle(6, 360) tle.end_fill()