使用turtle实现动画效果

众所周知,turtle能够像画笔一样来作图。一个绘图程序运行后,我们能够像看动画一样观看整个绘图过程。但是今天说的动画可和它不太一样。

我们可以用下面的函数调整画笔的速度。

1
2
turtle.speed(1)
turtle.speed(10)

在官方文档中,turtle.speed()的参数是0-10的整数,从110速度递增。0比较特殊,速度最快,几乎是瞬间完成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import turtle, time

t1 = turtle.Turtle()
t2 = turtle.Turtle()
t3 = turtle.Turtle()

pens = [t1, t2, t3]

for i in range(len(pens)):
pens[i].pu()
pens[i].goto(-100, -100 + 50 * i)
pens[i].pd()

t1.speed(1)
t2.speed(5)
t3.speed(0)

t1.fd(300)
time.sleep(2)
t2.fd(300)
time.sleep(2)
t3.fd(300)

效果比较明显:

可以说,这是一种动画的效果,毕竟能够看到绘画的全过程嘛。但是这个不是今天的重点,今天要讲的是真正的动画。

赶紧进入正题,要想使画面动起来,肯定是先画出主体,再将它移动。这里我们先看一个奇葩转圈图。

“很快啊!” ——马老师

下面看一下代码,为什么画完之后会转起来?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import turtle

turtle.speed(0)
turtle.Screen().bgcolor('black')


# 这个函数主要是画出一个奇葩图形,你想转什么就画什么
def arm(col):
turtle.begin_fill()
turtle.color(col)
turtle.fd(60)
turtle.lt(60)
turtle.fd(60)
turtle.rt(60)
turtle.fd(60)
turtle.rt(60)
turtle.fd(60)
turtle.lt(60)
turtle.fd(60)
turtle.lt(120)
turtle.fd(120)
turtle.lt(60)
turtle.fd(120)
turtle.lt(60)
turtle.fd(120)
turtle.lt(120)
turtle.end_fill()


# 这个函数可以画出我们转动的主体,我的主体是6个不同颜色的arm
def turn(angle):
turtle.seth(angle)
arm('red')
turtle.lt(60)
arm('orange')
turtle.lt(60)
arm('yellow')
turtle.lt(60)
arm('green')
turtle.lt(60)
arm('blue')
turtle.lt(60)
arm('purple')
turtle.lt(60)
turtle.hideturtle()

angle = 0 # 设置一个初始角度

while True:
turtle.clear()
turn(angle)
turtle.tracer(n=1000000000)
angle += 15 # 每次循环角度都增加15度

这里两个自定义函数都很好理解,主要看一下 turtle.tracer(),它的意思大概是将之前画过的作品重复一次,n的大小就是重复的速度,也就是说n如果很大,就可以瞬间完成刚才的画作。所以循环中的过程可以理解为(图有些丑):

graph TD
    B((开始)) -->C{while True}
    C -->  D[clear清屏] 
    D[clear清屏] --> E[seth改变角度]
    E[seth改变角度] --> F[tracer再画一次]
    F[tracer再画一次] --> G[角度增加15]
    G[角度增加15] --> C

所以,图中的6个arm就转起来了,修改每次循环的角度可以调整旋转速度和方向哦。(负数为反方向)