Python turtle库绘制简易烟花:零基础代码实现教程

小岛来信
小岛来信
发布时间:2026-11-06 | 9人浏览过
原创

面向零基础读者的 Python turtle 绘制简易烟花完整教程。通过解析极坐标发散几何原理、画布配置、射线与粒子渲染,配合完整可运行代码与参数调优指南,带你快速实现绚丽的夜空烟花动画。

Python 标准库 海龟绘图 (turtle) 零基础动手实战 阅读时间:约 8 分钟
Python turtle库绘制简易烟花:零基础代码实现教程
图 0:基于 Python turtle 与极坐标粒子渲染的夜空烟花演示示意
使用 Python 标准库 turtle(海龟绘图)搭配 random 模块,无需额外安装第三方依赖库,仅需 40 余行清晰代码即可实现多色彩、多层次的绚丽烟花绽放动画。本文从烟花发散的极坐标几何原理切入,逐步演示画布初始化、射线绘制、末端粒子发散与平滑渲染优化,最终给出一套结构规范且可直接运行的完整程序。

一、核心原理解析:烟花爆炸的几何与逻辑

现实中的烟花在升空后于特定高空爆开,火药推力将无数发光的火花粒子向四周均匀且带有扰动地炸开,并在空气阻力与重力作用下渐渐减速扩散。

在二维计算机屏幕上模拟这一视觉过程,本质是将平面笛卡尔坐标与极坐标辐射模型相结合。对于一个选定的爆炸中心点 (x, y),每个火花粒子的轨迹可以被抽象为:以该中心为起点,沿角度 θ 向外延展一段长度为 r 的线段,并在末端绘制一个高亮小圆点(光斑)。

Python turtle库绘制简易烟花:零基础代码实现教程
图 1:海龟画笔的极坐标射线与火花扩散几何原理及对应指令

在 turtle 库中,这一物理几何过程可以直接映射为画笔的一组基本指令:

  • 归位到爆炸核心:调用 turtle.penup() 提起画笔,执行 turtle.goto(x, y) 将画笔瞬间移至爆心,确保移动过程中不产生无效轨迹。
  • 调整发射朝向:调用 turtle.setheading(angle) 将画笔的角度调至 0° ~ 360° 之间的某个角度 θ。
  • 冲刺留痕:调用 turtle.pendown() 放下画笔,执行 turtle.forward(distance) 沿当前朝向绘制射线,模拟尾焰。
  • 终点粒子成型:调用 turtle.dot(size) 在轨迹终点绘制实心圆点,形成火花碎片质感。

二、开发环境与画布准备流程

本教程仅依赖 Python 3 内置的标准库,使用任何常见的 Python 开发环境(如 IDLE、VS Code、PyCharm 或直接在终端命令行)均可直接运行。整个程序从零实现的流水线可拆解为五个清晰的步骤:

Python turtle库绘制简易烟花:零基础代码实现教程
图 2:Python 简易烟花程序实现操作流程图

为呈现逼真的夜空效果,我们需要为 turtle 窗口配置黑色背景,同时关闭自动动画刷新。初学者常遇到的“画笔移动缓慢”、“画面剧烈闪烁”等问题,大多是由于未合理使用屏幕追踪器导致的。

画布与基础环境配置代码

import turtle
import random
import time

# 1. 创建并设置画布窗口
screen = turtle.Screen()
screen.setup(width=800, height=600)  # 设定窗口宽高为 800x600 像素
screen.bgcolor("#0B0F19")            # 设置深黑偏蓝的夜空底色
screen.title("Python turtle 简易烟花演示")

# 2. 关键优化:关闭自动刷新
# 默认情况下 turtle 每画一笔就会重绘画布,导致绘制 30 根射线时产生拖沓感
screen.tracer(0)

# 3. 初始化绘制画笔
pen = turtle.Turtle()
pen.hideturtle()  # 隐藏海龟光标图标
pen.speed(0)       # 设为最高绘图速度
pen.pensize(2)     # 设置射线线宽为 2 像素
注意:screen.tracer(0) 会暂停画面的自动实时更新,所有绘制操作都会先在内存缓冲区中完成。必须在单朵烟花绘制完毕后显式调用 screen.update(),画面才会瞬间呈现,从而实现干脆利落的“瞬间绽放”效果。

三、核心步骤逐步编码实现

1. 定义烟花调色盘

夜空中的烟花需要具有丰富的色彩层次。我们在代码顶层预置一组高饱和度、高对比度的亮色调列表:

FIREWORK_COLORS = [
    "#FF3B30",  # 绯红
    "#FF9500",  # 暖橙
    "#FFCC00",  # 金黄
    "#34C759",  # 翠绿
    "#007AFF",  # 天蓝
    "#5856D6",  # 靛紫
    "#AF52DE",  # 亮紫
    "#FF2D55",  # 桃红
    "#64D2FF",  # 冰蓝
    "#E5E5EA"   # 亮白
]

2. 编写单朵烟花绘制函数

如果让烟花的每束射线长度完全相同、角度绝对均等,绘制出的图案会呈现出机械对称的齿轮状。真实烟花在爆裂时,各火花的速度与质量存在差异。因此,我们在循环中引入 random.uniform(0, 360) 获取离散角度,并通过 random.randint(40, 140) 赋予粒子不同的散开距离。

Python turtle库绘制简易烟花:零基础代码实现教程
图 3:规则均匀发散与随机扰动发散的渲染效果及参数对比
def draw_single_firework(t, center_x, center_y, spark_count=36):
    """
    在指定坐标 (center_x, center_y) 绘制一朵绽放的烟花
    :param t: turtle.Turtle 对象
    :param center_x: 爆炸中心 X 坐标
    :param center_y: 爆炸中心 Y 坐标
    :param spark_count: 火花射线总数量
    """
    # 从调色盘中随机选取本次烟花的主色调
    color = random.choice(FIREWORK_COLORS)
    t.pencolor(color)

    # 循环绘制每一根辐射射线与火花点
    for _ in range(spark_count):
        # 1. 产生随机散角与随机半径
        angle = random.uniform(0, 360)
        radius = random.randint(40, 140)
        dot_size = random.randint(3, 6)

        # 2. 回到爆炸起点
        t.penup()
        t.goto(center_x, center_y)

        # 3. 设定方向并前进留痕
        t.setheading(angle)
        # 前半段留白,后半段落笔,营造离开中心向外炸开的悬空感
        t.forward(radius * 0.25)
        t.pendown()
        t.forward(radius * 0.75)

        # 4. 在末端画出高亮粒子点
        t.dot(dot_size, color)

        # 5. 提起画笔准备下一次迭代
        t.penup()

四、完整可运行源码

将画布初始化、函数封装以及连续绽放的控制循环整合在一起,即可得到独立运行的完整脚本。将以下代码保存为 firework_demo.py 即可执行:

import turtle
import random
import time

# ==================== 1. 全局配置与色彩池 ====================
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
BURST_COUNT = 15  # 自动燃放烟花的总朵数

FIREWORK_COLORS = [
    "#FF3B30", "#FF9500", "#FFCC00", "#34C759",
    "#007AFF", "#5856D6", "#AF52DE", "#FF2D55",
    "#64D2FF", "#FFFFFF", "#F59E0B"
]

# ==================== 2. 画布与画笔初始化 ====================
screen = turtle.Screen()
screen.setup(width=SCREEN_WIDTH, height=SCREEN_HEIGHT)
screen.bgcolor("#0A0E17")  # 沉浸式夜空黑
screen.title("Python turtle 简易烟花 - 零基础代码教程")
screen.tracer(0)           # 禁用自动刷新以消除闪烁

pen = turtle.Turtle()
pen.hideturtle()
pen.speed(0)
pen.pensize(2)

# ==================== 3. 单朵烟花渲染函数 ====================
def create_firework(t, x, y):
    """在指定位置绘制一朵多粒子烟花"""
    color = random.choice(FIREWORK_COLORS)
    t.pencolor(color)
    spark_total = random.randint(28, 42)  # 每朵烟花的粒子数量稍作浮动

    for _ in range(spark_total):
        angle = random.uniform(0, 360)
        max_dist = random.randint(50, 150)
        spark_dot_size = random.randint(2, 5)

        # 提起画笔回到爆心
        t.penup()
        t.goto(x, y)
        t.setheading(angle)

        # 沿射线冲刺:前 20% 距离空走,后 80% 距离落笔画光芒
        t.forward(max_dist * 0.2)
        t.pendown()
        t.forward(max_dist * 0.8)
        t.dot(spark_dot_size, color)
        t.penup()

# ==================== 4. 主控循环与画面更新 ====================
def main():
    print("烟花程序已启动,正在夜空中持续绽放...")
    
    for i in range(BURST_COUNT):
        # 随机产生位于屏幕范围内的爆炸中心(留出边界余量)
        rand_x = random.randint(-SCREEN_WIDTH // 2 + 100, SCREEN_WIDTH // 2 - 100)
        rand_y = random.randint(-SCREEN_HEIGHT // 2 + 120, SCREEN_HEIGHT // 2 - 80)

        # 绘制烟花
        create_firework(pen, rand_x, rand_y)

        # 手动刷新屏幕,将缓冲区内的绘制一次性呈现
        screen.update()

        # 停顿短暂时间,呈现燃放间隔节奏
        time.sleep(random.uniform(0.35, 0.65))

        # 如需保持夜空干净,可取消下行注释实现单朵消逝效果:
        # pen.clear()

    print("燃放演示完成,点击窗口或关闭窗口退出。")
    # 保持窗口驻留,防止程序执行完毕后立即闪退
    turtle.done()

if __name__ == "__main__":
    main()

五、效果验证与常见问题排查

在终端或集成开发环境中输入 python firework_demo.py 运行上述代码,读者将观察到以下实际效果:

  • 弹出一个 800×600 像素的深黑色窗口,标题显示为“Python turtle 简易烟花 - 零基础代码教程”。
  • 夜空中随机位置陆续炸开 15 朵颜色各异的火花。由于关闭了自动逐画笔刷新,每次绽放均在瞬间以清晰整齐的粒子群呈现,无卡顿与闪烁。
  • 所有烟花燃放完毕后,夜空保留绚丽的散落点迹,窗口持续稳定显示,等待用户主动关闭。
常见现象 / 报错 产生原因 明确解决方法
运行后窗口一闪而过立刻关闭 脚本最后缺少事件循环挂起机制,Python 执行完主线程代码后直接退出 确保脚本最末行调用 turtle.done() 或 screen.mainloop()。
绘制过程缓慢,海龟光标明显在爬行 未调用 screen.tracer(0),或者画笔未设置 pen.speed(0) 在程序初始化阶段加入 screen.tracer(0),画完后调用 screen.update()。
所有烟花都堆叠在屏幕正中心 循环中未给 rand_x 和 rand_y 赋予随机值,或每次都传了 (0, 0) 使用 random.randint() 在画布坐标区间内动态生成爆心坐标。
火花之间出现凌乱的横跨连接线 回到中心坐标时未先执行 penup() 提笔 在执行 t.goto(x, y) 之前,务必确保处于 t.penup() 状态。

六、知识总结与全景回顾

通过本篇教程的实践,读者可以掌握 turtle 标准库不仅可用于绘制静态几何图形,还能通过状态控制、坐标计算与定时刷新实现生动的图形动画。

Python turtle库绘制简易烟花:零基础代码实现教程
图 4:Python turtle 烟花绘制系统架构与方法映射全景图

在掌握了基础烟花模型后,读者还可在此基础上进行两项常见拓展:

  1. 鼠标点击互动:使用 screen.onclick(create_firework) 绑定鼠标点击事件,让用户在画布任意位置点击即可即时触发烟花。
  2. 重力下坠模拟:在射线向外延伸的过程中,通过循环递减 Y 坐标分量(即 y = y - gravity * step),模拟火花受到地球引力向下弯曲的拟真抛物线轨迹。
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表