python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python turtle雪花飘落动画

Python使用标准库turtle实现浪漫雪花飘落动画效果

作者:WL_Aurora

这篇文章主要介绍了用 Python 标准库 turtle 实现的浪漫雪花飘落动画,595 片六边形雪花从天而降,配合文字逐帧浮现,张万森、好久不见、下雪了、过的好吗,氛围感直接拉满,需要的朋友可以参考下

大家好!今天分享一个用 Python 标准库 turtle 实现的浪漫雪花飘落动画。595 片六边形雪花从天而降,配合文字逐帧浮现——“张万森”、“好久不见”、“下雪了”、“过的好吗”——氛围感直接拉满!灵感来自热门剧集《一闪一闪亮星星》,适合表白、纪念日或冬日祝福场景。

效果预览

程序启动后,黑色夜空背景中:

  1. 第一帧:“张万森” 居中浮现,停留 1 秒
  2. 第二帧:“好久不见” 替换,停留 1 秒
  3. 第三帧:“下雪了” 替换,停留 1 秒
  4. 第四帧:进入循环动画,“过 的 好 吗” 常驻屏幕中央,199 片雪花持续飘落……

每片雪花都是标准的六边形晶体结构,大小不一、速度各异,从屏幕上方随机位置生成,飘落到下方后重新从顶部出现,循环往复。

技术栈

技术说明
turtlePython 内置图形库,绘制雪花与文字
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                   # 线宽

运动参数:

参数范围说明
r2-4雪花半径,决定大小
x-1000 ~ 1000水平位置,覆盖全屏宽度
y500 ~ -500垂直范围,从顶部到底部
speed5-20下落速度,越大飘得越快
outline2画笔粗细

坐标系说明(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 的创意用法:

以上就是Python使用标准库turtle实现浪漫雪花飘落动画效果的详细内容,更多关于Python turtle雪花飘落动画的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文