Python turtle库绘制简易烟花:零基础代码实现教程
面向零基础读者的 Python turtle 绘制简易烟花完整教程。通过解析极坐标发散几何原理、画布配置、射线与粒子渲染,配合完整可运行代码与参数调优指南,带你快速实现绚丽的夜空烟花动画。
turtle(海龟绘图)搭配 random 模块,无需额外安装第三方依赖库,仅需 40 余行清晰代码即可实现多色彩、多层次的绚丽烟花绽放动画。本文从烟花发散的极坐标几何原理切入,逐步演示画布初始化、射线绘制、末端粒子发散与平滑渲染优化,最终给出一套结构规范且可直接运行的完整程序。
一、核心原理解析:烟花爆炸的几何与逻辑
现实中的烟花在升空后于特定高空爆开,火药推力将无数发光的火花粒子向四周均匀且带有扰动地炸开,并在空气阻力与重力作用下渐渐减速扩散。
在二维计算机屏幕上模拟这一视觉过程,本质是将平面笛卡尔坐标与极坐标辐射模型相结合。对于一个选定的爆炸中心点 (x, y),每个火花粒子的轨迹可以被抽象为:以该中心为起点,沿角度 θ 向外延展一段长度为 r 的线段,并在末端绘制一个高亮小圆点(光斑)。
在 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 或直接在终端命令行)均可直接运行。整个程序从零实现的流水线可拆解为五个清晰的步骤:
为呈现逼真的夜空效果,我们需要为 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) 赋予粒子不同的散开距离。
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 标准库不仅可用于绘制静态几何图形,还能通过状态控制、坐标计算与定时刷新实现生动的图形动画。
在掌握了基础烟花模型后,读者还可在此基础上进行两项常见拓展:
- 鼠标点击互动:使用
screen.onclick(create_firework)绑定鼠标点击事件,让用户在画布任意位置点击即可即时触发烟花。 - 重力下坠模拟:在射线向外延伸的过程中,通过循环递减 Y 坐标分量(即
y = y - gravity * step),模拟火花受到地球引力向下弯曲的拟真抛物线轨迹。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













