Python使用標(biāo)準(zhǔn)庫turtle實(shí)現(xiàn)浪漫雪花飄落動(dòng)畫效果
大家好!今天分享一個(gè)用 Python 標(biāo)準(zhǔn)庫 turtle 實(shí)現(xiàn)的浪漫雪花飄落動(dòng)畫。595 片六邊形雪花從天而降,配合文字逐幀浮現(xiàn)——“張萬森”、“好久不見”、“下雪了”、“過的好嗎”——氛圍感直接拉滿!靈感來自熱門劇集《一閃一閃亮星星》,適合表白、紀(jì)念日或冬日祝福場(chǎng)景。
效果預(yù)覽
程序啟動(dòng)后,黑色夜空背景中:
- 第一幀:“張萬森” 居中浮現(xiàn),停留 1 秒
- 第二幀:“好久不見” 替換,停留 1 秒
- 第三幀:“下雪了” 替換,停留 1 秒
- 第四幀:進(jìn)入循環(huán)動(dòng)畫,“過 的 好 嗎” 常駐屏幕中央,199 片雪花持續(xù)飄落……
每片雪花都是標(biāo)準(zhǔn)的六邊形晶體結(jié)構(gòu),大小不一、速度各異,從屏幕上方隨機(jī)位置生成,飄落到下方后重新從頂部出現(xiàn),循環(huán)往復(fù)。

技術(shù)棧
| 技術(shù) | 說明 |
|---|---|
| turtle | Python 內(nèi)置圖形庫,繪制雪花與文字 |
| random | 隨機(jī)生成雪花參數(shù) |
| time | 文字幀間延遲控制 |
純標(biāo)準(zhǔn)庫,零第三方依賴,Python 自帶即可運(yùn)行!
項(xiàng)目結(jié)構(gòu)
雪花飄落/ ├── 雪花.py # 主程序(完整單文件) └── README.md
核心功能拆解
六邊形雪花繪制 —— 幾何之美
每片雪花由 6 個(gè)完全對(duì)稱的"花瓣"組成,每個(gè)花瓣呈"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 個(gè)花瓣,每瓣間隔 60°
t.forward(x * 5) # 主干:向前 5r
t.backward(x * 2) # 退回 2r(分叉點(diǎn))
t.left(60) # 左轉(zhuǎn) 60°,畫左分支
t.forward(x * 2) # 左分支:長 2r
t.backward(x * 2) # 退回
t.right(120) # 右轉(zhuǎn) 120°,畫右分支
t.forward(x * 2) # 右分支:長 2r
t.backward(x * 2) # 退回
t.left(60) # 回正
t.backward(x * 3) # 退回起點(diǎn)
t.right(60) # 旋轉(zhuǎn) 60°,準(zhǔn)備下一片花瓣
雪花結(jié)構(gòu)解析:
│
│ 主干 (5r)
│
左分支 /\ 右分支
/ \
/ \
/ \
●────────● 分叉點(diǎn) (距頂點(diǎn) 3r)
│\ /│
│ \ / │
│ \ / │
│ \/ │
└────────┘ 中心點(diǎn)
每個(gè)花瓣 = 主干(5r) + 左分支(2r) + 右分支(2r)
6 個(gè)花瓣 × 60° = 360° 完美對(duì)稱
繪制軌跡示意(單瓣):
forward(5r) → 到達(dá)頂部
backward(2r) → 退回分叉點(diǎn)
left(60) → 朝向左上方
forward(2r) → 畫左分支
backward(2r) → 退回分叉點(diǎn)
right(120) → 朝向右上方
forward(2r) → 畫右分支
backward(2r) → 退回分叉點(diǎn)
left(60) → 回正朝上
backward(3r) → 退回中心
right(60) → 轉(zhuǎn)向下一瓣
雪花運(yùn)動(dòng) —— 循環(huán)飄落
def move(self):
if self.y >= -500: # 還在畫布內(nèi)
self.y -= self.speed # 向下移動(dòng)
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 # 線寬
運(yùn)動(dòng)參數(shù):
| 參數(shù) | 范圍 | 說明 |
|---|---|---|
r | 2-4 | 雪花半徑,決定大小 |
x | -1000 ~ 1000 | 水平位置,覆蓋全屏寬度 |
y | 500 ~ -500 | 垂直范圍,從頂部到底部 |
speed | 5-20 | 下落速度,越大飄得越快 |
outline | 2 | 畫筆粗細(xì) |
坐標(biāo)系說明(turtle):
y ↑
1000 ├──────────────── 雪花生成區(qū)
│ ?? ?? ??
500 ├──────────────── 主要生成高度
│ ?? ??
0 ├──────────────── 屏幕中線
│ ?? ?? ??
-500 ├──────────────── 消失邊界
│
└──────────────────→ x
-1000 1000
文字動(dòng)畫 —— 幀序列控制
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)
# 進(jìn)入主循環(huán)
t.write("過 的 好 嗎", align="center", font=("Comic Sans MS", 66, "bold"))
時(shí)間軸:
0s 1s 2s 3s 4s 5s 6s ...
│ │ │ │ │ │ │
├─顯示──┤ 清屏 ├─顯示──┤ 清屏 ├─顯示──┤ 清屏 ├─進(jìn)入循環(huán)──→
張萬森 好久不見 下雪了 過的好嗎
↑ 1秒黑屏間隔 ↑
文字樣式:
| 屬性 | 值 | 效果 |
|---|---|---|
| 字體 | Comic Sans MS | 手寫感,浪漫隨性 |
| 大小 | 66 | 超大字號(hào),視覺沖擊 |
| 粗細(xì) | bold | 加粗,更清晰 |
| 對(duì)齊 | center | 居中顯示 |
| 顏色 | white | 白字黑底,對(duì)比強(qiáng)烈 |
雙緩沖動(dòng)畫 —— 流暢渲染
while True:
tu.tracer(0) # 關(guān)閉自動(dòng)刷新
t.clear() # 清空畫布
# 繪制文字
t.write("過 的 好 嗎", ...)
# 繪制 199 片雪花
for i in range(199):
Snows[i].move()
Snows[i].snow()
tu.update() # 手動(dòng)刷新一次
為什么用 tracer(0) + update()?
| 模式 | 效果 |
|---|---|
| 默認(rèn)模式 | 每畫一筆就刷新,嚴(yán)重閃爍 |
tracer(0) | 關(guān)閉自動(dòng)刷新,所有繪制在內(nèi)存完成 |
update() | 一次性將內(nèi)存畫面推送到屏幕 |
對(duì)象池設(shè)計(jì) —— 595 片雪花
Snows = [] # 用列表保存所有雪花對(duì)象
for i in range(595):
Snows.append(Snow()) # 預(yù)創(chuàng)建 595 個(gè)雪花實(shí)例
注意: 雖然創(chuàng)建了 595 個(gè)雪花對(duì)象,但主循環(huán)只繪制 199 個(gè)(range(199))。這意味著有 396 個(gè)雪花處于"休眠"狀態(tài),是預(yù)留的擴(kuò)展空間。
快速開始
步驟 1:直接運(yùn)行
python 雪花.py
無需安裝任何第三方庫!
步驟 2:自定義文字
# 修改這四行文字
t.write("你的名字", align="center", font=("Comic Sans MS", 66, "bold"))
t.write("想對(duì)TA說的話", ...)
t.write("下雪了", ...)
t.write("過的好嗎", ...)
步驟 3:調(diào)整雪花數(shù)量
# 創(chuàng)建數(shù)量(建議 100-600)
for i in range(595):
Snows.append(Snow())
# 每幀繪制數(shù)量(建議 50-200,太多會(huì)卡頓)
for i in range(199):
Snows[i].move()
Snows[i].snow()
步驟 4:調(diào)整顏色主題
colors = ['white'] # 純白(默認(rèn)) # colors = ['#E0F7FA'] # 冰藍(lán)色 # 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'] # 白色 → 淺藍(lán) → 中藍(lán),隨機(jī)選取
改造 3:添加水平飄動(dòng)(風(fēng)吹效果)
def move(self):
if self.y >= -500:
self.y -= self.speed
self.x += ra.randint(-2, 2) # 隨機(jī)左右飄動(dòng)
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:雪花旋轉(zhuǎn)效果
def snow(self, rotation=0):
# 在繪制前旋轉(zhuǎn)
t.setheading(rotation)
# ... 原有繪制邏輯
# 主循環(huán)中
for i in range(199):
Snows[i].move()
Snows[i].snow(rotation=ra.randint(0, 360))
改造 6:添加地面積雪
# 在 while 循環(huán)中繪制地面
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:鼠標(biāo)交互 —— 點(diǎn)擊生成雪花
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()
總結(jié)
本項(xiàng)目展示了 Python turtle 的創(chuàng)意用法:
- ? 六邊形雪花:純代碼繪制標(biāo)準(zhǔn)晶體結(jié)構(gòu)
- ? 對(duì)象池預(yù)創(chuàng)建:595 個(gè)雪花實(shí)例,199 個(gè)活躍繪制
- ? 文字幀動(dòng)畫:time.sleep 控制文字切換節(jié)奏
- ? 雙緩沖渲染:tracer(0) + update() 流暢無閃爍
- ? 零第三方依賴:純標(biāo)準(zhǔn)庫,開箱即用
以上就是Python使用標(biāo)準(zhǔn)庫turtle實(shí)現(xiàn)浪漫雪花飄落動(dòng)畫效果的詳細(xì)內(nèi)容,更多關(guān)于Python turtle雪花飄落動(dòng)畫的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python利用matplotlib實(shí)現(xiàn)制作動(dòng)態(tài)條形圖
說到用 Python 制作動(dòng)態(tài)圖,首先想到的肯定是一些直接拿來就用的庫,雖然我沒做過,但是我相信一定有且不止一個(gè),搜了一圈后發(fā)現(xiàn)有個(gè)bar chart race庫看起來不錯(cuò),感興趣的可以跟隨小編一起學(xué)習(xí)一下2022-10-10
在python3中pyqt5和mayavi不兼容問題的解決方法
今天小編就為大家分享一篇在python3中pyqt5和mayavi不兼容問題的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Python3安裝requests庫的步驟及使用示例和常見問題
Python3的requests庫是處理HTTP請(qǐng)求最常用的工具之一,它簡(jiǎn)化了與Web服務(wù)的交互,讓開發(fā)者能更專注于業(yè)務(wù)邏輯,而非底層網(wǎng)絡(luò)細(xì)節(jié),這篇文章主要介紹了Python3安裝requests庫的步驟及使用示例和常見問題,需要的朋友可以參考下2026-06-06
Python isalpha()函數(shù)的具體使用方法詳解
這篇文章主要介紹了Python isalpha()函數(shù)的具體使用方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Flask框架debug與配置項(xiàng)的開啟與設(shè)置詳解
這篇文章主要介紹了Flask框架debug與配置項(xiàng)的開啟與設(shè)置,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09
Flask實(shí)現(xiàn)swagger在線文檔與接口測(cè)試流程詳解
Flask是一個(gè)使用Python編寫的輕量級(jí)Web應(yīng)用框架。其WSGI工具箱采用 Werkzeug,模板引擎則使用Jinja2。Flask使用 BSD 授權(quán)。Flask也被稱為“microframework”,因?yàn)樗褂煤?jiǎn)單的核心,用 extension 增加其他功能,本篇帶你用Flask實(shí)現(xiàn)swagger在線文檔與接口測(cè)試2022-07-07
Python實(shí)現(xiàn)微信好友數(shù)據(jù)爬取及分析
這篇文章會(huì)基于Python對(duì)微信好友進(jìn)行數(shù)據(jù)分析,這里選擇的維度主要有:性別、頭像、簽名、位置,主要采用圖表和詞云兩種形式來呈現(xiàn)結(jié)果,其中,對(duì)文本類信息會(huì)采用詞頻分析和情感分析兩種方法,感興趣的小伙伴可以了解一下2021-12-12

