Python使用标准库turtle实现浪漫雪花飘落动画效果
大家好!今天分享一个用 Python 标准库 turtle 实现的浪漫雪花飘落动画。595 片六边形雪花从天而降,配合文字逐帧浮现——“张万森”、“好久不见”、“下雪了”、“过的好吗”——氛围感直接拉满!灵感来自热门剧集《一闪一闪亮星星》,适合表白、纪念日或冬日祝福场景。
效果预览
程序启动后,黑色夜空背景中:
- 第一帧:“张万森” 居中浮现,停留 1 秒
- 第二帧:“好久不见” 替换,停留 1 秒
- 第三帧:“下雪了” 替换,停留 1 秒
- 第四帧:进入循环动画,“过 的 好 吗” 常驻屏幕中央,199 片雪花持续飘落……
每片雪花都是标准的六边形晶体结构,大小不一、速度各异,从屏幕上方随机位置生成,飘落到下方后重新从顶部出现,循环往复。

技术栈
| 技术 | 说明 |
|---|---|
| turtle | Python 内置图形库,绘制雪花与文字 |
| random | 随机生成雪花参数 |
| time | 文字帧间延迟控制 |
纯标准库,零第三方依赖,Python 自带即可运行!
项目结构
雪花飘落/ ├── 雪花.py # 主程序(完整单文件) └── README.md
核心功能拆解
六边形雪花绘制 —— 几何之美
每片雪花由 6 个完全对称的"花瓣"组成,每个花瓣呈"Y"字形分叉:
def snow(self):
x = self.r # 雪花半径
t.pensize(self.outline)
t.penup()
t.goto(self.x, self.y) # 定位到雪花位置
t.pendown()
t.color(self.color)
for i in range(6): # 6 个花瓣,每瓣间隔 60°
t.forward(x * 5) # 主干:向前 5r
t.backward(x * 2) # 退回 2r(分叉点)
t.left(60) # 左转 60°,画左分支
t.forward(x * 2) # 左分支:长 2r
t.backward(x * 2) # 退回
t.right(120) # 右转 120°,画右分支
t.forward(x * 2) # 右分支:长 2r
t.backward(x * 2) # 退回
t.left(60) # 回正
t.backward(x * 3) # 退回起点
t.right(60) # 旋转 60°,准备下一片花瓣
雪花结构解析:
│
│ 主干 (5r)
│
左分支 /\ 右分支
/ \
/ \
/ \
●────────● 分叉点 (距顶点 3r)
│\ /│
│ \ / │
│ \ / │
│ \/ │
└────────┘ 中心点
每个花瓣 = 主干(5r) + 左分支(2r) + 右分支(2r)
6 个花瓣 × 60° = 360° 完美对称
绘制轨迹示意(单瓣):
forward(5r) → 到达顶部
backward(2r) → 退回分叉点
left(60) → 朝向左上方
forward(2r) → 画左分支
backward(2r) → 退回分叉点
right(120) → 朝向右上方
forward(2r) → 画右分支
backward(2r) → 退回分叉点
left(60) → 回正朝上
backward(3r) → 退回中心
right(60) → 转向下一瓣
雪花运动 —— 循环飘落
def move(self):
if self.y >= -500: # 还在画布内
self.y -= self.speed # 向下移动
else:
# 飘出画布,从顶部重生
self.r = ra.uniform(2, 4) # 新半径 2-4
self.x = ra.randint(-1000, 1000) # 新水平位置
self.y = 500 # 回到顶部
self.speed = ra.randint(5, 20) # 新速度
self.color = ra.choice(colors) # 新颜色(目前只有白色)
self.outline = 2 # 线宽
运动参数:
| 参数 | 范围 | 说明 |
|---|---|---|
r | 2-4 | 雪花半径,决定大小 |
x | -1000 ~ 1000 | 水平位置,覆盖全屏宽度 |
y | 500 ~ -500 | 垂直范围,从顶部到底部 |
speed | 5-20 | 下落速度,越大飘得越快 |
outline | 2 | 画笔粗细 |
坐标系说明(turtle):
y ↑
1000 ├──────────────── 雪花生成区
│ ❄️ ❄️ ❄️
500 ├──────────────── 主要生成高度
│ ❄️ ❄️
0 ├──────────────── 屏幕中线
│ ❄️ ❄️ ❄️
-500 ├──────────────── 消失边界
│
└──────────────────→ x
-1000 1000
文字动画 —— 帧序列控制
t.pencolor("white")
# 第一帧
t.write("张万森", align="center", font=("Comic Sans MS", 66, "bold"))
time.sleep(1)
t.clear()
time.sleep(1)
# 第二帧
t.write("好久不见", align="center", font=("Comic Sans MS", 66, "bold"))
time.sleep(1)
t.clear()
time.sleep(1)
# 第三帧
t.write("下雪了", align="center", font=("Comic Sans MS", 66, "bold"))
time.sleep(1)
t.clear()
time.sleep(1)
# 进入主循环
t.write("过 的 好 吗", align="center", font=("Comic Sans MS", 66, "bold"))
时间轴:
0s 1s 2s 3s 4s 5s 6s ...
│ │ │ │ │ │ │
├─显示──┤ 清屏 ├─显示──┤ 清屏 ├─显示──┤ 清屏 ├─进入循环──→
张万森 好久不见 下雪了 过的好吗
↑ 1秒黑屏间隔 ↑
文字样式:
| 属性 | 值 | 效果 |
|---|---|---|
| 字体 | Comic Sans MS | 手写感,浪漫随性 |
| 大小 | 66 | 超大字号,视觉冲击 |
| 粗细 | bold | 加粗,更清晰 |
| 对齐 | center | 居中显示 |
| 颜色 | white | 白字黑底,对比强烈 |
双缓冲动画 —— 流畅渲染
while True:
tu.tracer(0) # 关闭自动刷新
t.clear() # 清空画布
# 绘制文字
t.write("过 的 好 吗", ...)
# 绘制 199 片雪花
for i in range(199):
Snows[i].move()
Snows[i].snow()
tu.update() # 手动刷新一次
为什么用 tracer(0) + update()?
| 模式 | 效果 |
|---|---|
| 默认模式 | 每画一笔就刷新,严重闪烁 |
tracer(0) | 关闭自动刷新,所有绘制在内存完成 |
update() | 一次性将内存画面推送到屏幕 |
对象池设计 —— 595 片雪花
Snows = [] # 用列表保存所有雪花对象
for i in range(595):
Snows.append(Snow()) # 预创建 595 个雪花实例
注意: 虽然创建了 595 个雪花对象,但主循环只绘制 199 个(range(199))。这意味着有 396 个雪花处于"休眠"状态,是预留的扩展空间。
快速开始
步骤 1:直接运行
python 雪花.py
无需安装任何第三方库!
步骤 2:自定义文字
# 修改这四行文字
t.write("你的名字", align="center", font=("Comic Sans MS", 66, "bold"))
t.write("想对TA说的话", ...)
t.write("下雪了", ...)
t.write("过的好吗", ...)
步骤 3:调整雪花数量
# 创建数量(建议 100-600)
for i in range(595):
Snows.append(Snow())
# 每帧绘制数量(建议 50-200,太多会卡顿)
for i in range(199):
Snows[i].move()
Snows[i].snow()
步骤 4:调整颜色主题
colors = ['white'] # 纯白(默认) # colors = ['#E0F7FA'] # 冰蓝色 # colors = ['#FFF8E1'] # 暖白色 # colors = ['white', '#B3E5FC', '#E1F5FE'] # 多彩雪花
自定义改造指南
改造 1:添加背景音乐
import pygame
pygame.mixer.init()
pygame.mixer.music.load("snow_music.mp3")
pygame.mixer.music.play(-1)
改造 2:雪花颜色渐变
colors = ['#FFFFFF', '#E3F2FD', '#BBDEFB', '#90CAF9', '#64B5F6'] # 白色 → 浅蓝 → 中蓝,随机选取
改造 3:添加水平飘动(风吹效果)
def move(self):
if self.y >= -500:
self.y -= self.speed
self.x += ra.randint(-2, 2) # 随机左右飘动
else:
# ... 重生逻辑
改造 4:文字淡入淡出效果
import turtle as tu
def fade_in_text(text, x, y):
for i in range(10):
t.pencolor(f"#{255-i*20:02x}{255-i*20:02x}{255-i*20:02x}")
t.write(text, align="center", font=("Comic Sans MS", 66, "bold"))
tu.update()
time.sleep(0.05)
t.clear()
改造 5:雪花旋转效果
def snow(self, rotation=0):
# 在绘制前旋转
t.setheading(rotation)
# ... 原有绘制逻辑
# 主循环中
for i in range(199):
Snows[i].move()
Snows[i].snow(rotation=ra.randint(0, 360))
改造 6:添加地面积雪
# 在 while 循环中绘制地面
t.penup()
t.goto(-1000, -500)
t.pendown()
t.color("white")
t.begin_fill()
for x in range(-1000, 1001, 50):
y = -500 + ra.randint(0, 20)
t.goto(x, y)
t.goto(1000, -600)
t.goto(-1000, -600)
t.end_fill()
改造 7:鼠标交互 —— 点击生成雪花
def click_snow(x, y):
new_snow = Snow()
new_snow.x = x
new_snow.y = y
Snows.append(new_snow)
tu.onscreenclick(click_snow)
完整源码
import turtle as tu
import random as ra
import time
tu.setup(1.0, 1.0)
tu.bgcolor('black')
tu.title("雪花")
t = tu.Pen()
t.ht()
colors = ['white']
class Snow():
def __init__(self):
self.r = ra.uniform(2, 4)
self.x = ra.randint(-1000, 1000)
self.y = ra.randint(500, 1000)
self.speed = ra.randint(5, 20)
self.color = ra.choice(colors)
self.outline = 2
def snow(self):
x = self.r
t.pensize(self.outline)
t.penup()
t.goto(self.x, self.y)
t.pendown()
t.color(self.color)
for i in range(6):
t.forward(x * 5)
t.backward(x * 2)
t.left(60)
t.forward(x * 2)
t.backward(x * 2)
t.right(120)
t.forward(x * 2)
t.backward(x * 2)
t.left(60)
t.backward(x * 3)
t.right(60)
def move(self):
if self.y >= -500:
self.y -= self.speed
else:
self.r = ra.uniform(2, 4)
self.x = ra.randint(-1000, 1000)
self.y = 500
self.speed = ra.randint(5, 20)
self.color = ra.choice(colors)
self.outline = 2
Snows = []
for i in range(595):
Snows.append(Snow())
t.penup()
t.goto(0, 0)
t.pendown()
t.pencolor("white")
t.write("张万森", align="center", font=("Comic Sans MS", 66, "bold"))
time.sleep(1)
t.clear()
time.sleep(1)
t.write("好久不见", align="center", font=("Comic Sans MS", 66, "bold"))
time.sleep(1)
t.clear()
time.sleep(1)
t.write("下雪了", align="center", font=("Comic Sans MS", 66, "bold"))
time.sleep(1)
t.clear()
time.sleep(1)
while True:
tu.tracer(0)
t.clear()
t.penup()
t.goto(0, 0)
t.pendown()
t.write("过 的 好 吗", align="center", font=("Comic Sans MS", 66, "bold"))
for i in range(199):
Snows[i].move()
Snows[i].snow()
tu.update()
tu.mainloop()
总结
本项目展示了 Python turtle 的创意用法:
- ✅ 六边形雪花:纯代码绘制标准晶体结构
- ✅ 对象池预创建:595 个雪花实例,199 个活跃绘制
- ✅ 文字帧动画:time.sleep 控制文字切换节奏
- ✅ 双缓冲渲染:tracer(0) + update() 流畅无闪烁
- ✅ 零第三方依赖:纯标准库,开箱即用
以上就是Python使用标准库turtle实现浪漫雪花飘落动画效果的详细内容,更多关于Python turtle雪花飘落动画的资料请关注脚本之家其它相关文章!
相关文章
keras中epoch,batch,loss,val_loss用法说明
这篇文章主要介绍了keras中epoch,batch,loss,val_loss用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-07-07
踩坑:pytorch中eval模式下结果远差于train模式介绍
这篇文章主要介绍了踩坑:pytorch中eval模式下结果远差于train模式介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-06-06


最新评论