在Python中绘制动态樱花树,主要依靠turtle绘图库实现。turtle是Python内置的图形绘制库,无需额外安装,语法简单直观,非常适合用来实现分形树、自然景物等递归图形。
本文将从环境准备、核心原理、分步实现、代码逐行解析、效果优化五个维度,完整讲解樱花树的实现过程,确保零基础也能看懂并运行。
一、前期准备
1.1 开发环境
- Python 3.x(推荐3.6及以上版本)
- 内置库: turtle 、 random (无需pip安装)
- 编辑器:VS Code、PyCharm、IDLE均可
1.2 核心原理
樱花树本质是分形递归结构:
1. 树干向上生长,到一定长度后分叉;
2. 左右树枝重复树干的生长逻辑,形成递归;
3. 树枝末端绘制粉色花瓣,模拟樱花;
4. 加入随机角度、长度,让树木更自然。
递归公式:
plaintext
树 = 树干 + 左子树 + 右子树
子树 = 更短的树干 + 更小的左子树 + 更小的右子树
二、分步实现过程
第一步:导入库并初始化画布
首先导入 turtle 和 random ,设置画布大小、标题、速度。
第二步:定义递归绘制树枝函数
递归是核心:
- 前进绘制树枝
- 右转一定角度,递归画右枝
- 左转双倍角度,递归画左枝
- 回退到原点,恢复角度
第三步:绘制樱花花瓣
当树枝长度小于阈值时,停止递归,绘制圆形粉色花瓣。
第四步:美化优化
- 调整颜色:树干棕色、花瓣粉色渐变
- 加入随机角度:避免树木僵硬
- 加速绘制:关闭动画延迟
- 隐藏海龟箭头:提升美观度
第五步:运行主程序
调用递归函数,启动绘图循环,保持窗口不关闭。
三、完整代码
python
# -*- coding: utf-8 -*-
import turtle
import random
from time import sleep
# 1. 初始化画布设置
window = turtle.Screen()
window.setup(1.0, 1.0, 0, 0) # 全屏显示
window.title("Python樱花树")
window.bgcolor("#f0f0f0") # 浅灰色背景
turtle.speed(0) # 最快绘制速度
turtle.pensize(1) # 画笔粗细
turtle.hideturtle() # 隐藏画笔箭头
turtle.color("#8B4513") # 初始颜色:树干棕色
turtle.left(90) # 初始方向向上
turtle.penup()
turtle.backward(300) # 向下移动起点
turtle.pendown()
# 2. 随机数控制自然效果
def random_angle():
return random.randint(10, 30)
def random_length():
return random.randint(5, 15)
def random_color():
colors = ["#FFB6C1", "#FFC0CB", "#FF69B4", "#FF1493", "#FF82AB"]
return random.choice(colors)
# 3. 递归绘制樱花树
def draw_tree(branch_len):
sleep(0.0001)
if branch_len > 15:
# 绘制主干
turtle.forward(branch_len)
# 右侧树枝
turtle.right(random_angle())
draw_tree(branch_len - random_length())
# 左侧树枝
turtle.left(2 * random_angle())
draw_tree(branch_len - random_length())
# 回退复位
turtle.right(random_angle())
turtle.backward(branch_len)
else:
# 绘制樱花花瓣
turtle.color(random_color())
turtle.begin_fill()
turtle.circle(3)
turtle.end_fill()
turtle.color("#8B4513")
# 4. 启动绘制
draw_tree(90)
# 5. 保持窗口
turtle.done()
四、代码逐行深度解析
4.1 库导入部分
python
import turtle
import random
from time import sleep
- turtle :绘图核心库,控制画笔移动、旋转、颜色;
- random :生成随机角度、长度、颜色,让树自然不呆板;
- sleep :微秒延迟,控制绘制节奏。
4.2 画布初始化
python
window = turtle.Screen()
window.setup(1.0, 1.0, 0, 0)
window.title("Python樱花树")
window.bgcolor("#f0f0f0")
- Screen() 创建绘图窗口;
- setup(1.0,1.0) 实现全屏显示;
- 背景色设为浅灰,突出粉色樱花。
python
turtle.speed(0)
turtle.pensize(1)
turtle.hideturtle()
turtle.left(90)
turtle.penup()
turtle.backward(300)
turtle.pendown()
- speed(0) :最快绘制模式;
- left(90) :默认向右,左转90度向上生长;
- 向后移动300:让树长在屏幕中下部,更美观。
4.3 随机函数
python
def random_angle(): return random.randint(10,30)
def random_length(): return random.randint(5,15)
- 角度10~30度:树枝分叉自然;
- 每次减5~15长度:树枝逐级变短。
python
def random_color():
colors = ["#FFB6C1","#FFC0CB","#FF69B4","#FF1493","#FF82AB"]
return random.choice(colors)
- 粉色系十六进制色值,模拟樱花渐变。
4.4 递归核心函数
python
def draw_tree(branch_len):
sleep(0.0001)
if branch_len > 15:
turtle.forward(branch_len)
turtle.right(random_angle())
draw_tree(branch_len - random_length())
turtle.left(2 * random_angle())
draw_tree(branch_len - random_length())
turtle.right(random_angle())
turtle.backward(branch_len)
1. 长度>15时继续分叉,否则画花;
2. 前进画树枝 → 右转画右枝 → 左转双倍画左枝;
3. 回退复位,保证递归正确回溯。
python
else:
turtle.color(random_color())
turtle.begin_fill()
turtle.circle(3)
turtle.end_fill()
turtle.color("#8B4513")
- 小圆形填充粉色,模拟樱花;
- 画完恢复棕色,继续画其他树枝。
4.5 启动与保持窗口
python
draw_tree(90)
turtle.done()
- 初始树干长度90,可自行调整;
- done() 防止窗口一闪而逝。
五、运行效果说明
运行后:
1. 屏幕底部向上生长出棕色树干;
2. 逐级分叉,越来越细;
3. 细枝末端出现密集粉色樱花;
4. 整棵树呈自然分形结构,无人工僵硬感。
六、自定义优化扩展
6.1 调整树大小
修改:
python
draw_tree(90) # 越大树越高
draw_tree(60) # 越小树越矮
6.2 花瓣大小
python
turtle.circle(3) # 数字越大花越大
6.3 背景色改为夜晚
python
window.bgcolor("black")
6.4 加入飘落效果
可通过 tracer(0,0) 和 update() 实现动态飘落,进阶版本可实现风吹樱花动画。
七、总结
本文完整实现了Python+turtle樱花树,核心是递归分形结构。
- 代码量少、逻辑清晰、适合入门;
- 可自由修改参数,实现不同风格樱花树;
- 是学习递归、图形编程的经典案例。