系列文章
| 序号 | 直达链接 |
| 爱心系列 | |
| 1 | Python制作一个无法拒绝的表白界面 |
| 2 | Python满屏飘字表白代码 |
| 3 | Python无限弹窗满屏表白代码 |
| 4 | Python李峋同款可写字版跳动的爱心 |
| 5 | Python流星雨代码 |
| 6 | Python漂浮爱心代码 |
| 7 | Python爱心光波代码 |
| 8 | Python普通的玫瑰花代码 |
| 9 | Python炫酷的玫瑰花代码 |
| 10 | Python多彩的玫瑰花代码 |
| 节日系列 | |
| 1 | Python动漫风烟花秀代码 |
| 2 | Python新年烟花秀代码 |
| 3 | Python圣诞礼物代码 |
| 4 | Python画圣诞树代码 |
| 5 | Python可爱版圣诞树丨绿色 |
| 6 | Python可爱版圣诞树丨粉色 |
| 7 | Python大雪纷飞代码 |
| 8 | Python生日蛋糕代码 |
| 9 | Python五彩气球代码 |
| 10 | Python国庆祝福代码 |
| 11 | Python万圣礼物代码 |
| 12 | Python愚人节礼物代码 |
| 13 | Python浪漫星空代码 |
| 14 | Python樱花树代码 |
| 动漫系列 | |
| 1 | Python名侦探柯南 |
| 2 | Python喜羊羊 |
| 3 | Python懒羊羊 |
| 4 | Python沸羊羊 |
| 5 | Python小灰灰 |
| 6 | Python小香香 |
| 7 | Python灰太狼 |
| 8 | Python海绵宝宝 |
| 9 | Python哆啦A梦 |
| 10 | Python凯蒂猫 |
| 11 | Python猫和老鼠 |
| 12 | Python草莓熊 |
| 13 | Python迷你皮卡丘 |
| 14 | Python高级皮卡丘 |
| 15 | Python豪华皮卡丘 |
| 16 | Python史迪仔 |
| 17 | Python小熊猫 |
| 18 | Python蜘蛛侠 |
| 19 | Python可爱版蜡笔小新 |
| 20 | Python萌萌的蜡笔小新 |
| 21 | Python罗小黑 |
| 22 | Python猪猪侠 |
| 炫酷系列 | |
| 1 | Python张万森下雪了 |
| 2 | Python一闪一闪亮晶晶 |
| 3 | Python黑客帝国代码雨 |
| 4 | Python七彩花朵 |
| 5 | Python模拟3D星空 |
| 6 | Python金榜题名 |
| 7 | Python满天星 |
写在前面
Python实现的动态烟花绽放效果完整代码,结合图形界面与粒子系统,带来一场视觉盛宴。
技术需求
- 图形界面构建
- 使用
tkinter创建主窗口,通过Canvas组件作为绘图区域,实现动态元素的承载与展示。 - 窗口居中显示,适配屏幕分辨率,提升用户体验。
- 绑定窗口关闭事件,确保程序可正常退出,避免后台进程残留。
- 背景图像处理
- 引入
PIL库加载并缩放背景图片,使静态夜空图像与动态烟花融合,增强氛围感。 - 利用
ImageTk.PhotoImage将PIL图像转换为Tkinter可识别格式,完成画布背景渲染。
- 粒子系统设计
- 定义
particle类,封装单个烟花粒子的状态属性:位置、速度、颜色、生命周期等。 - 通过极坐标分布实现爆炸时的放射状运动,利用三角函数计算各方向位移,模拟真实物理扩散。
- 区分“爆炸阶段”与“坠落阶段”,在不同生命周期应用不同的运动模型,增强动态真实感。
- 动画与时间控制
- 使用
time.time()获取高精度时间差,驱动粒子状态更新,保证动画流畅性。 canvas.update()主动刷新画布,避免GUI阻塞,实现逐帧动画效果。- 设置随机延迟时间触发下一轮烟花,营造自然连续的夜空烟花场景。
- 随机性与多样性
- 多处引入
random模块控制烟花数量、位置、颜色、速度、大小和寿命,确保每次运行都呈现独特视觉效果。 - 颜色池预设多种明亮色调,贴近真实烟花的绚丽多彩。
- 内存与资源管理
- 在粒子生命周期结束后自动从画布删除对应图形对象,防止内存泄漏。
- 使用
after方法替代死循环,实现非阻塞式定时任务调度,保持界面响应性。
部分代码
importtkinterastkfromPILimportImage,ImageTkimporttimeastiimportmathasmimportrandomasr colors=['red','blue','lime','yellow','white','cyan','orange','deepskyblue','orangered']classparticle:def__init__(self,canvas,num,sums,x,y,x_speed,y_speed,explosion_speed,color,size,max_life):self.canvas=canvas self.num=num self.sums=sums self.x=x self.y=y self.x_speed=x_speed self.y_speed=y_speed self.initial_speed=explosion_speed self.color=color self.life=0self.max_life=max_life self.oval=self.canvas.create_oval(x-size,y-size,x+size,y+size,fill=self.color)……代码分析
我设计这个程序时,脑海里浮现的是一个静谧夜晚突然被绚丽烟花点亮的画面。我希望用代码还原那一刻的惊喜与浪漫,于是决定从最基础的粒子系统入手。每一朵烟花都不是简单的图形,而是由数十个微小粒子组成的动态集合,它们有自己的生命轨迹——从升空、爆炸到缓缓坠落,最终消散于夜空。
我的思路是从整体到局部:先搭建窗口框架,再引入背景图营造氛围,接着定义粒子行为,最后组织它们协同演出。我选择tkinter不仅因为它轻量,更因为它的Canvas非常适合做这种自定义绘图。而PIL的加入,则让静态背景与动态效果完美融合,仿佛真的站在一片星空下。
在粒子类的设计上,我赋予每个粒子独立的属性和行为逻辑。它们不仅仅是移动的光点,更是有“生命”的个体——从诞生那一刻起就开始倒计时,经历短暂而辉煌的绽放,最后悄然熄灭。我用三角函数让粒子呈圆形扩散,模拟真实的爆炸形态;又通过重力加速度让它们在后期缓慢下坠,增加物理真实感。最关键的是时间控制,我用dt作为时间增量,使得动画不依赖帧率,更加平滑自然。
整个烟花系统的节奏由我精心编排。我设置了随机的等待时间,让下一次绽放充满期待;每次爆炸的粒子数量、颜色、速度也都不同,就像大自然的手笔,绝不重复。我特别注重细节:比如爆炸初期的快速扩张与后期的缓慢飘落形成对比,让人感受到力量与温柔的交织。
最后,我用after机制实现了非阻塞的循环调用,既保证了程序持续运行,又不会卡住界面。关闭函数的加入也让用户体验更完整。当我第一次看到那片星空被一朵接一朵的烟花点亮时,我知道,这不仅是一段代码,更是一场写给夜空的情书。
写在后面
我是一只有趣的兔子,感谢你的喜欢!