使用Python绘制动态樱花
使用turtle模块创建了一个动态樱花树动画。程序首先绘制缓慢生长的树干和地面,然后生成精致的樱花效果。樱花具有随机颜色、大小和形状(5或6瓣),并带有摆动动画效果。代码实现了分阶段显示樱花、花朵生长动画以及花瓣随风摆动的视觉效果。通过精细控制绘制过程的时间间隔,实现了平滑的动画效果。程序还包含窗口关闭处理和异常处理机制,确保程序稳定运行。整个动画展现了樱花树从无到有、花开满枝的美丽过程。
import turtle
import random
import math
import time# 设置画布
screen = turtle.Screen()
screen.bgcolor("skyblue")
screen.tracer(0, 0) # 关闭自动刷新# 创建画笔
pen = turtle.Turtle()
pen.speed(0)
pen.color("brown")
pen.pensize(2)
pen.hideturtle()# 存储树枝信息
branch_info = []# 缓慢绘制树干
def draw_tree_slowly(branch_len, pen, min_len=3):if branch_len > min_len:start_pos = pen.pos()start_heading = pen.heading()# 缓慢绘制主干steps = max(3, int(branch_len / 2)) # 确保至少有3步step_length = branch_len / stepsfor i in range(steps):pen.forward(step_length)screen.update()time.sleep(0.000005) # 绘制速度end_pos = pen.pos()if branch_len < 20:branch_info.append((end_pos, start_heading))# 右侧分支right_angle = random.randint(15, 45)pen.right(right_angle)draw_tree_slowly(branch_len - random.randint(5, 15), pen)# 返回主干pen.penup()pen.goto(end_pos)pen.setheading(start_heading)pen.pendown()# 左侧分支left_angle = random.randint(15, 45)pen.left(left_angle)draw_tree_slowly(branch_len - random.randint(5, 15), pen)# 返回起始位置pen.penup()pen.goto(start_pos)pen.setheading(start_heading)pen.pendown()# 更精致的樱花类
class EnhancedBlossom:def __init__(self, pos, heading):self.pos = posself.heading = headingself.phase = random.random() * 2 * math.piself.size = 0.5 # 初始大小self.target_size = random.uniform(2.0, 3.0)self.color = random.choice([(255, 182, 193), # 浅粉(255, 105, 180), # 热粉(255, 20, 147), # 深粉(219, 112, 147) # 淡紫粉])self.growth_rate = random.uniform(0.02, 0.05)self.fully_grown = Falseself.petal_count = random.choice([5, 6]) # 5或6瓣self.petal_shape = random.choice(["rounded", "pointed"]) # 花瓣形状def draw(self, t):# 生长过程if not self.fully_grown:self.size += self.growth_rateif self.size >= self.target_size:self.size = self.target_sizeself.fully_grown = True# 计算摆动位置offset = math.sin(t + self.phase) * 2x = self.pos[0] + offsety = self.pos[1] + abs(offset) * 0.3# 设置颜色turtle.colormode(255)turtle.color(self.color)# 绘制花瓣turtle.penup()turtle.goto(x, y)turtle.setheading(self.heading)turtle.pendown()# 更精致的绘制方式turtle.begin_fill()if self.petal_shape == "rounded":# 圆形花瓣for _ in range(self.petal_count):turtle.circle(5 * self.size, 180)turtle.left(180 - (360 / self.petal_count))else:# 尖形花瓣for _ in range(self.petal_count):for _ in range(3):turtle.forward(8 * self.size)turtle.left(120)turtle.left(360 / self.petal_count)turtle.end_fill()# 花蕊turtle.penup()turtle.goto(x, y)turtle.dot(4 * self.size, "gold")# 绘制地面(缓慢)
def draw_ground_slowly():g = turtle.Turtle()g.hideturtle()g.speed(1)g.penup()g.goto(-400, -200)g.pendown()g.color("lightgreen")g.begin_fill()for i in range(2):g.forward(800)screen.update()time.sleep(0.2)g.right(90)g.forward(50)screen.update()time.sleep(0.2)g.right(90)g.end_fill()# 主函数
def main():# 初始化位置pen.penup()pen.goto(0, -200)pen.pendown()pen.left(90)# 缓慢绘制地面draw_ground_slowly()screen.update()time.sleep(0.5)# 缓慢绘制树干draw_tree_slowly(80, pen)screen.update()time.sleep(0.5)# 创建樱花blossoms = [EnhancedBlossom(pos, heading) for pos, heading in branch_info if random.random() > 0.5]# 分阶段显示樱花for i in range(1, 11):for blossom in blossoms:if random.random() < i / 10:blossom.draw(0)screen.update()time.sleep(0.3)# 动画循环start_time = time.time()running = Truedef on_close():nonlocal runningrunning = False# 设置关闭窗口的处理函数root = screen.getcanvas().winfo_toplevel()root.protocol("WM_DELETE_WINDOW", on_close)try:while running:t = (time.time() - start_time) * 0.5turtle.clearstamps()for blossom in blossoms:blossom.draw(t)screen.update()time.sleep(0.05)# 检查窗口是否仍然存在if not turtle.Turtle._screen:breakexcept turtle.Terminator:pass# 确保完全退出turtle.bye()if __name__ == "__main__":main()