Python之turtle标准绘图库实现动画介绍

Python之turtle标准绘图库实现动画介绍

turtle 是 Python 中一个非常有趣的绘图库(或模块,在 Python 中,“模块”和“库”这两个术语经常混用),它基于“海龟绘图”的概念,通过控制一只“海龟”在画布(Canvas)上移动来绘制图形。海龟(turtle)是一个可以移动的“画笔”,它有位置、方向和颜色等属性。默认情况下,海龟位于屏幕的中心坐标(0,00,0),方向朝右(东)。画布(Canvas)是海龟绘图的区域,默认大小为一个正方形窗口。通过向海龟发送命令(也称为方法或函数),如向前移动、向后移动、转向等,可以绘制出各种形状和图案。

turtle 模块最初是为绘制图形而设计的,但通过合理利用其功能,也可以实现基本的动画效果。

以下是实现动画的关键要点和步骤:

基本设置
在开始动画之前,需要设置画布和画笔的基本属性。
import turtle

# 设置画布
screen = turtle.Screen()
screen.bgcolor("white")  # 背景颜色

# 创建画笔
pen = turtle.Turtle()
pen.shape("turtle")  # 画笔形状
pen.color("blue")    # 画笔颜色
pen.speed(0)         # 画笔速度(0为最快)

动画的核心:循环与更新
动画的本质是通过不断更新画面来模拟运动。可以使用 while 循环或 ontimer 方法来实现。
方法一:使用 while 循环
while True:
    pen.forward(10)   # 向前移动
    pen.right(10)     # 向右转
    screen.update()   # 更新画面

☆方法二:使用 ontimer
def animate():
    pen.forward(10)   # 向前移动
    pen.right(10)     # 向右转
    screen.update()   # 更新画面
    screen.ontimer(animate, 50)  # 每50毫秒调用一次animate函数

animate()             # 启动动画
帧率决定了动画的流畅度。可以通过调整 ontimer 的时间间隔来控制帧率。
时间间隔越小,帧率越高:例如,ontimer(animate, 20)。
时间间隔越大,帧率越低:例如,ontimer(animate, 100)。

处理边界条件
如果对象移动到画布边缘,可以通过以下方式处理:
反弹:改变方向。
循环:从另一侧重新出现。
☆反弹示例
def animate():
    pen.forward(10)
    if pen.xcor() > screen.window_width() / 2 or pen.xcor() < -screen.window_width() / 2:
        pen.right(180)   # x轴边界反弹
    if pen.ycor() > screen.window_height() / 2 or pen.ycor() < -screen.window_height() / 2:
        pen.right(180)   # y轴边界反弹
    screen.update()
    screen.ontimer(animate, 50)
☆循环示例
def animate():
    pen.forward(10)
    if pen.xcor() > screen.window_width() / 2:
        pen.setx(-screen.window_width() / 2)   # x轴循环
    if pen.ycor() > screen.window_height() / 2:
        pen.sety(-screen.window_height() / 2)   # y轴循环 
    screen.update()
    screen.ontimer(animate, 50)

tracer与update优化
默认情况下,turtle会实时绘制每一步操作,这可能导致性能问题。可以通过关闭自动绘制(tracer(0))并手动调用 update()来提高性能。
screen.tracer(0)   #关闭自动绘制

def animate():
    pen.forward(10)
    screen.update()
    screen.ontimer(animate,50)

animate()

事件驱动与交互
可以通过键盘或鼠标事件来控制动画的行为。详见:使用Turtle库实现,鼠标左键绘制路径,用鼠标右键结束绘制,小海龟并沿路径移动

https://blog.csdn.net/cnds123/article/details/144632809

以下是一个简单完整的 turtle 动画示例,展示了一个小乌龟在在画布上以45度角移动并反弹的效果。这个示例包括了基本设置、动画循环、边界处理以及性能优化。源码如下:

import turtle

# 设置画布
screen = turtle.Screen()
screen.setup(width=600, height=400)
screen.bgcolor("white")  # 背景颜色
screen.tracer(0)         # 关闭自动绘制,提高性能

# 创建画笔(小乌龟)
pen = turtle.Turtle()
pen.shape("turtle")      # 画笔形状
pen.color("blue")        # 画笔颜色
pen.speed(0)             # 画笔速度(0为最快)
pen.penup()              # 抬起画笔,避免绘制轨迹

# 初始位置和方向
pen.goto(0, 0)           # 将画笔移动到中心
pen.setheading(45)       # 设置初始方向

# 动画函数
def animate():
    # 移动画笔
    pen.forward(10)

    # 边界检测与反弹
    x, y = pen.pos()
    if x > screen.window_width() / 2 or x < -screen.window_width() / 2:
        pen.setheading(180 - pen.heading())   # x轴反弹
    if y > screen.window_height() / 2 or y < -screen.window_height() / 2:
        pen.setheading(-pen.heading())        # y轴反弹

    # 更新画面
    screen.update()

    # 递归调用,实现动画循环
    screen.ontimer(animate, 50)

# 启动动画
animate()

# 保持窗口打开
turtle.done()

运行效果:

下面再给出一个示例:运行的小汽车

使用 Python 的 turtle 库,实现一个简单运行小汽车的示例代码。这个小汽车会从屏幕左侧移动到右侧,模拟行驶的效果。

源码:

import turtle
import time

# 设置屏幕
screen = turtle.Screen()
screen.setup(width=800, height=400)
screen.bgcolor("lightblue")
screen.tracer(0)  # 关闭自动刷新,手动控制刷新以实现动画效果

# 创建小汽车的主体,创建一个小汽车主体,形状为长方形,颜色为红色
car = turtle.Turtle()
car.shape("square")
car.shapesize(stretch_wid=1, stretch_len=5)  # 调整形状为长方形
car.color("red")
car.penup()
car.goto(-300, -100)  # 初始位置

# 创建车轮,创建两个圆形车轮,颜色为黑色
wheel1 = turtle.Turtle()
wheel1.shape("circle")
wheel1.color("black")
wheel1.penup()
wheel1.goto(-330, -120)  # 左轮位置(相对于车体)

wheel2 = turtle.Turtle()
wheel2.shape("circle")
wheel2.color("black")
wheel2.penup()
wheel2.goto(-270, -120)  # 右轮位置(相对于车体)

# 移动小汽车的函数
def move_car():
    car.forward(10)  # 小汽车向前移动
    wheel1.forward(10)  # 左轮向前移动
    wheel2.forward(10)  # 右轮向前移动

# 主循环,让小汽车持续移动
while True:
    screen.update()  # 手动刷新屏幕以实现动画效果
    move_car()       # 调用移动函数
    time.sleep(0.05) # 控制移动速度

    # 如果小汽车超出屏幕右侧,重置到左侧
    if car.xcor() > 400:
        car.goto(-300, -100)
        wheel1.goto(-330, -120)
        wheel2.goto(-270, -120)

turtle.done()

运行效果:

为运行的小汽车场景添加道路和树木,让整个画面更加生动,源码如下:

import turtle
import time

# 设置屏幕
screen = turtle.Screen()
screen.setup(width=800, height=400)
screen.bgcolor("lightblue")
screen.tracer(0)  # 关闭自动刷新,手动控制刷新以实现动画效果

# 绘制道路
road = turtle.Turtle()
road.penup()
road.goto(-400, -140)  # 道路起始位置
road.pendown()
road.pensize(20)
road.color("gray")
road.forward(800)  # 绘制道路

# 绘制道路中间的虚线
line = turtle.Turtle()
line.penup()
line.goto(-400, -140)  # 虚线起始位置
line.pendown()
line.pensize(3)
line.color("white")

for _ in range(20):  # 绘制虚线
    line.forward(20)
    line.penup()
    line.forward(20)
    line.pendown()

# 绘制树木
def draw_tree(x, y):
    tree = turtle.Turtle()
    tree.penup()
    tree.goto(x, y)  # 树的位置
    tree.pendown()
    tree.color("brown")
    tree.begin_fill()  # 树干
    for _ in range(2):
        tree.forward(10)
        tree.left(90)
        tree.forward(20)
        tree.left(90)
    tree.end_fill()

    tree.penup()
    tree.goto(x + 5, y + 20)  # 树叶位置
    tree.pendown()
    tree.color("green")
    tree.begin_fill()  # 树叶
    tree.circle(15)
    tree.end_fill()

# 在屏幕两侧绘制树木
draw_tree(-300, -100)
draw_tree(-200, -100)
draw_tree(-100, -100)
draw_tree(100, -100)
draw_tree(200, -100)
draw_tree(300, -100)

# 创建小汽车的主体,创建一个小汽车主体,形状为长方形,颜色为红色
car = turtle.Turtle()
car.shape("square")
car.shapesize(stretch_wid=1, stretch_len=5)  # 调整形状为长方形
car.color("red")
car.penup()
car.goto(-300, -100)  # 初始位置

# 创建车轮,创建两个圆形车轮,颜色为黑色
wheel1 = turtle.Turtle()
wheel1.shape("circle")
wheel1.color("black")
wheel1.penup()
wheel1.goto(-330, -120)  # 左轮位置(相对于车体)

wheel2 = turtle.Turtle()
wheel2.shape("circle")
wheel2.color("black")
wheel2.penup()
wheel2.goto(-270, -120)  # 右轮位置(相对于车体)

# 移动小汽车的函数
def move_car():
    car.forward(10)  # 小汽车向前移动
    wheel1.forward(10)  # 左轮向前移动
    wheel2.forward(10)  # 右轮向前移动

# 主循环,让小汽车持续移动
while True:
    screen.update()  # 手动刷新屏幕以实现动画效果
    move_car()       # 调用移动函数
    time.sleep(0.05) # 控制移动速度

    # 如果小汽车超出屏幕右侧,重置到左侧
    if car.xcor() > 400:
        car.goto(-300, -100)
        wheel1.goto(-330, -120)
        wheel2.goto(-270, -120)

turtle.done()

运行效果:

附录

Python青少年简明教程:turtle模块入门 https://blog.csdn.net/cnds123/article/details/141605522

Python 的turtle模块讲座 https://blog.csdn.net/cnds123/article/details/108252863

python好之turtle例子集锦 https://blog.csdn.net/cnds123/article/details/113629085

用python 之turtle库(模块)画太极图、楼梯等 https://blog.csdn.net/cnds123/article/details/107004710

作者:学习&实践爱好者

物联沃分享整理
物联沃-IOTWORD物联网 » Python之turtle标准绘图库实现动画介绍

发表回复