Python带你跨年!用Python送你一场跨年烟花秀

举报
Python小二 发表于 2022/01/01 00:39:45 2022/01/01
【摘要】 2021 已经接近尾声了,2022 即将到来,本文我们用 Python 送你一场跨年烟花秀。 我们用到的 Python 模块包括:tkinter、PIL、time、random、math,如果第三方模块没有装的话,pip install 一下即可,下面看一下代码实现。 导库 import tkinter ...

2021 已经接近尾声了,2022 即将到来,本文我们用 Python 送你一场跨年烟花秀。

我们用到的 Python 模块包括:tkinter、PIL、time、random、math,如果第三方模块没有装的话,pip install 一下即可,下面看一下代码实现。

导库


   
  1. import tkinter as tk
  2. from PIL import Image, ImageTk
  3. from time import time, sleep
  4. from random import choice, uniform, randint
  5. from math import sin, cos, radians

烟花颜色

colors = ['red''blue''yellow''white''green''orange''purple''seagreen''indigo''cornflowerblue']
  

定义烟花类


   
  1. class fireworks:
  2.     def __init__(self, cv, idx, total, explosion_speed, x=0., y=0., vx=0., vy=0., size=2., color='red', lifespan=2, **kwargs):
  3.         self.id = idx
  4.         # 烟花绽放 x 轴
  5.         self.x = x
  6.         # 烟花绽放 x 轴
  7.         self.y = y
  8.         self.initial_speed = explosion_speed
  9.         # 外放 x 轴速度
  10.         self.vx = vx
  11.         # 外放 y 轴速度
  12.         self.vy = vy
  13.         # 绽放的粒子数
  14.         self.total = total
  15.         # 已停留时间
  16.         self.age = 0
  17.         # 颜色
  18.         self.color = color
  19.         # 画布
  20.         self.cv = cv
  21.         self.cid = self.cv.create_oval(x - size, y - size, x + size, y + size,
  22.         fill=self.color)
  23.         self.lifespan = lifespan
  24.     # 更新数据
  25.     def update(self, dt):
  26.         self.age += dt
  27.         # 粒子膨胀
  28.         if self.alive() and self.expand():
  29.             move_x = cos(radians(self.id * 360 / self.total)) * self.initial_speed
  30.             move_y = sin(radians(self.id * 360 / self.total)) * self.initial_speed
  31.             self.cv.move(self.cid, move_x, move_y)
  32.             self.vx = move_x / (float(dt) * 1000)
  33.         # 膨胀到最大下落
  34.         elif self.alive():
  35.             move_x = cos(radians(self.id * 360 / self.total))
  36.             self.cv.move(self.cid, self.vx + move_x, self.vy + 0.5 * dt)
  37.             self.vy += 0.5 * dt
  38.         # 过期移除
  39.         elif self.cid is not None:
  40.             cv.delete(self.cid)
  41.             self.cid = None
  42.     # 定义膨胀效果的时间帧
  43.     def expand(self):
  44.         return self.age <= 1.5
  45.     # 检查粒子是否仍在生命周期内
  46.     def alive(self):
  47.         return self.age <= self.lifespan

燃放烟花


   
  1. def ignite(cv):
  2.     t = time()
  3.     # 烟花列表
  4.     explode_points = []
  5.     wait_time = randint(10100)
  6.     # 爆炸的个数
  7.     numb_explode = randint(610)
  8.     for point in range(numb_explode):
  9.         # 爆炸粒子列表
  10.         objects = []
  11.         # 爆炸 x 轴
  12.         x_cordi = randint(50550)
  13.         # 爆炸 y 轴
  14.         y_cordi = randint(50150)
  15.         speed = uniform(0.51.5)
  16.         size = uniform(0.53)
  17.         color = choice(colors)
  18.         # 爆炸的绽放速度
  19.         explosion_speed = uniform(0.21)
  20.         # 爆炸的粒子数半径
  21.         total_particles = randint(1050)
  22.         for i in range(1, total_particles):
  23.             r = fireworks(cv, idx=i, total=total_particles, explosion_speed=explosion_speed, x=x_cordi, y=y_cordi,
  24.                      vx=speed, vy=speed, color=color, size=size,
  25.                      lifespan=uniform(0.61.75))
  26.             # 添加进粒子列表里
  27.             objects.append(r)
  28.         # 把粒子列表添加到烟花列表
  29.         explode_points.append(objects)
  30.     total_time = .0
  31.     # 在 1.8 秒时间帧内保持更新
  32.     while total_time < 1.8:
  33.         # 让画面暂停 0.01s
  34.         sleep(0.01)
  35.         # 刷新时间
  36.         tnew = time()
  37.         t, dt = tnew, tnew - t
  38.         # 遍历烟花列表
  39.         for point in explode_points:
  40.             # 遍历烟花里的粒子列表
  41.             for item in point:
  42.                 # 更新时间
  43.                 item.update(dt)
  44.         # 刷新页面
  45.         cv.update()
  46.         total_time += dt
  47.     root.after(wait_time, ignite, cv)

启动


   
  1. if __name__ == "__main__":
  2.     root = tk.Tk()
  3.     # 绘制一个画布
  4.     cv = tk.Canvas(root, height=400, width=600)
  5.     # 背景图
  6.     image = Image.open("bg.jpg")
  7.     photo = ImageTk.PhotoImage(image)
  8.     # 在画板上绘制一张图片
  9.     cv.create_image(00, image=photo, anchor='nw')
  10.     cv.pack()
  11.     root.protocol(close)
  12.     root.after(100, ignite, cv)
  13.     # 生成窗口
  14.     root.mainloop()

看一下效果:

3014081f21d37f649ec49b70fcbf6871.gif

源码已经打包整理好了,有需要的可以在下方公众号Python数据分析之美后台回复fw获取。

文章来源: ityard.blog.csdn.net,作者:Python小二,版权归原作者所有,如需转载,请联系作者。

原文链接:ityard.blog.csdn.net/article/details/122248345

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。