烟花由中国古代人民较早发明,常用于盛大的典礼或表演中,也在除夕夜及元宵节中燃放用来烘托节日氛围。小年到了,但是近年来随着环境污染的加剧,一些地区已经禁止燃放烟花了,那我们就用 Python 实现一场无污染的烟花秀。

环境

实现

导入库

import tkinter as tk
from PIL import Image, ImageTk
from time import time, sleep
from random import choice, uniform, randint
from math import sin, cos, radians

烟花颜色

colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue']
  • 定义烟花类
class fireworks:def __init__(self, cv, idx, total, explosion_speed, x=0., y=0., vx=0., vy=0., size=2., color='red', lifespan=2, **kwargs):self.id = idx# 烟花绽放 x 轴self.x = x# 烟花绽放 x 轴self.y = yself.initial_speed = explosion_speed# 外放 x 轴速度self.vx = vx# 外放 y 轴速度self.vy = vy# 绽放的粒子数self.total = total# 已停留时间self.age = 0# 颜色self.color = color# 画布self.cv = cvself.cid = self.cv.create_oval(x - size, y - size, x + size, y + size,fill=self.color)self.lifespan = lifespan# 更新数据def update(self, dt):self.age += dt# 粒子膨胀if self.alive() and self.expand():move_x = cos(radians(self.id * 360 / self.total)) * self.initial_speedmove_y = sin(radians(self.id * 360 / self.total)) * self.initial_speedself.cv.move(self.cid, move_x, move_y)self.vx = move_x / (float(dt) * 1000)# 膨胀到最大下落elif self.alive():move_x = cos(radians(self.id * 360 / self.total))self.cv.move(self.cid, self.vx + move_x, self.vy + 0.5 * dt)self.vy += 0.5 * dt# 过期移除elif self.cid is not None:cv.delete(self.cid)self.cid = None# 定义膨胀效果的时间帧def expand(self):return self.age <= 1.5# 检查粒子是否仍在生命周期内def alive(self):return self.age <= self.lifespan

燃放烟花

def ignite(cv):t = time()# 烟花列表explode_points = []wait_time = randint(10, 100)# 爆炸的个数numb_explode = randint(6, 10)for point in range(numb_explode):# 爆炸粒子列表objects = []# 爆炸 x 轴x_cordi = randint(50, 550)# 爆炸 y 轴y_cordi = randint(50, 150)speed = uniform(0.5, 1.5)size = uniform(0.5, 3)color = choice(colors)# 爆炸的绽放速度explosion_speed = uniform(0.2, 1)# 爆炸的粒子数半径total_particles = randint(10, 50)for i in range(1, total_particles):r = fireworks(cv, idx=i, total=total_particles, explosion_speed=explosion_speed, x=x_cordi, y=y_cordi,vx=speed, vy=speed, color=color, size=size,lifespan=uniform(0.6, 1.75))# 添加进粒子列表里objects.append(r)# 把粒子列表添加到烟花列表explode_points.append(objects)total_time = .0# 在 1.8 秒时间帧内保持更新while total_time < 1.8:# 让画面暂停 0.01ssleep(0.01)# 刷新时间tnew = time()t, dt = tnew, tnew - t# 遍历烟花列表for point in explode_points:# 遍历烟花里的粒子列表for item in point:# 更新时间item.update(dt)# 刷新页面cv.update()total_time += dtroot.after(wait_time, ignite, cv)

启动

if __name__ == "__main__":root = tk.Tk()# 绘制一个画布cv = tk.Canvas(root, height=400, width=600)# 背景图image = Image.open("bg.jpg")photo = ImageTk.PhotoImage(image)# 在画板上绘制一张图片cv.create_image(0, 0, image=photo, anchor='nw')cv.pack()root.protocol(close)root.after(100, ignite, cv)# 生成窗口root.mainloop()

最终效果,如图所示:

小年到了,用 Python 实现一场环保无污染的烟花秀,祝大家节日快乐相关推荐

  1. 用 Python 实现一场环保无污染的烟花秀

    导语 给你们除夕礼物想看烟花✨吗小编已经给你们打包

  2. 2022来了,用 Python 制作一场环保的烟花秀

    2022 来了,本文我们用 Python 送你一场跨年烟花秀. 我们用到的 Python 模块包括:tkinter.PIL.time.random.math,如果第三方模块没有装的话,pip inst ...

  3. 【Python】春节炫酷烟花秀

    [本文首发于公众号:阿黎逸阳的代码] ​一年一度的春节来啦,正值阖家团圆.万家灯火辉煌之际,阿黎逸阳带着烟花秀祝大家新年快乐!牛年大吉!    一.绘制成品 1.迪士尼烟花秀    2.两个人的新年 ...

  4. 庆祝法国队夺冠:用Python放一场烟花秀

    2019独角兽企业重金招聘Python工程师标准>>> 天天敲代码的朋友,有没有想过代码也可以变得很酷炫又浪漫?今天就教大家用Python模拟出绽放的烟花庆祝昨晚法国队夺冠,工作之余 ...

  5. 用python画烟花-过年了,用Python放一场浪漫烟花秀!

    天天敲代码的朋友,有没有想过代码也可以变得很酷炫又浪漫?今天就教大家用Python模拟出绽放的烟花,工作之余也可以随时让程序为自己放一场烟花秀. 这个有趣的小项目并不复杂,只需一点可视化技巧,100余 ...

  6. 代码也浪漫:用Python放一场烟花秀!

    来源:集智小编        链接: https://jizhi.im/blog/post/py_make_fireworks 天天敲代码的朋友,有没有想过代码也可以变得很酷炫又浪漫?今天就教大家用P ...

  7. 2022跨年烟花代码|用Python送你一场跨年烟花秀

    2021 已经接近尾声了,2022 即将到来,本文我们用 Python 送你一场跨年烟花秀. 我们用到的 Python 模块包括:tkinter.PIL.time.random.math,如果第三方模 ...

  8. 2022跨年烟花代码、用Python送你一场跨年烟花秀

    2021 已经接近尾声了,2022 即将到来,本文我们用 Python 送你一场跨年烟花秀. 我们用到的 Python 模块包括:tkinter.PIL.time.random.math,如果第三方模 ...

  9. python画春节_快到春节了,用Python来一场烟花秀

    原标题:快到春节了,用Python来一场烟花秀 作者:野客 来源:Python 技术(pythonall) 大家好,欢迎来到 Crossin的编程教室 ! 春节的脚步越来越近了,每逢春节很多地方都会燃 ...

最新文章

  1. ASP.net实现无扩展名的URL重写。简单、方便、无需ISAPI
  2. Server Application Unavailable
  3. python 3.0 print_Python 3.x 新特性及10大变化
  4. 【收藏】spark中map与mapPartitions区别
  5. php怎么调用dll例子,php调用dll的实例操作动画与代码分享_PHP教程
  6. ajax跨域请求 html5,HTML5中使用postMessage实现Ajax跨域请求的方法
  7. make though multi core
  8. Redhat as5和fedora,centos一样使用yum管理软件
  9. 《JAVA并发编程的艺术》之 Java并发编程实战
  10. 雷赛acc68c说明书_DMC2410C-A四轴通用型点位卡
  11. python中文文本聚类_Python3文本聚类如何进行分类操作?
  12. 微信公众号授权 提示内容与下载文件不符,请检查文件内容或重新上传
  13. 修改Fedora 18的窗口背景颜色为浅绿色
  14. 【JY】橡胶支座的简述和其力学性能计算
  15. Python第三方库安装
  16. 算法(c++)——循环比赛日程安排问题
  17. 离散数学复习:二元关系
  18. 分布式原理:一文了解 Gossip 协议
  19. 千秋华夏 壮丽河山 国庆节快乐~
  20. python时间戳是什么意思_python时间戳是什么

热门文章

  1. 从拟物化到扁平,再到Material Design
  2. JavaScript内置对象一周知识点总结
  3. ODL:OpenDayLight子项目之MD-SAL
  4. mysql的临时表简介
  5. PEP最新提案推出,Python将上线重大更新,带来了哪些新功能?
  6. 输出全排列(递归非递归)
  7. chart.js 参数说明
  8. Unity中Animation连续被调用时,Animation Event偶尔不触发
  9. 也许狼真的来了,我们该怎么办?
  10. Description: Web server failed to start. Port 8082 was already in use. Action: Identify and stop