当前位置: 首页 > news >正文

使用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()

http://www.dtcms.com/a/300706.html

相关文章:

  • 记录一次薛定谔bug
  • 2116. 判断一个括号字符串是否有效
  • GitHub 趋势日报 (2025年07月26日)
  • 零基础学习性能测试第五章:JVM性能分析与调优-多线程机制与运行原理
  • Rust赋能智能土木工程革新
  • LeetCode第350题_两个数组的交集II
  • Rust Web 全栈开发(十二):构建 WebAssembly 应用
  • 图像处理:第二篇 —— 选择镜头的基础知识及对图像处理的影响
  • 大语言模型Claude 4简介
  • 【MySQL篇】:MySQL基础了解以及库和表的相关操作
  • Java学习-------桥接模式
  • 【三桥君】如何让AI从简单的记忆型模型进化为具备深度推理能力的‘学霸’?—— 解析提升AI推理能力的四大核心技术
  • 3.Linuxvim编辑器及快捷键的使用
  • 零基础学习性能测试第六章:性能难点-Jmeter实现海量用户压测
  • 【java】 IntelliJ IDEA高效编程设置指南
  • Photo Studio PRO 安卓版:专业级照片编辑的移动解决方案
  • iOS安全和逆向系列教程 第20篇:Objective-C运行时机制深度解析与Hook技术
  • Linux驱动21 --- FFMPEG 音频 API
  • bash的特性-常见的快捷键
  • 51核和ARM核单片机OTA实战解析(一)
  • 【机器学习深度学习】NLP评价指标 BLEU 和 ROUGE
  • 零基础学习性能测试第五章:性能瓶颈分析与调优-内存资源瓶颈分析与优化建议
  • LeetCode Hot 100 括号生成
  • iOS安全和逆向系列教程 第21篇:iOS应用加密与混淆技术深度剖析
  • 生成式召回-TIGER范式
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-39,(知识点:单相桥式整流电路,输出电压计算,电流计算,二极管最大反向电压)
  • C语言笔记02
  • 【Oracle】套接字异常(SocketException)背后隐藏的Oracle问题:ORA-03137深度排查与解决之道
  • 【代码问题】【包安装】MMCV
  • SCUDATA esProc SPL Enterprise Edition(大数据计算引擎) v20250605 中文免费版