ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

快到春节了,用 Python 实现一场烟花秀

2021-01-26 10:32:20  阅读:196  来源: 互联网

标签:Python self 烟花 快到 total speed cv


春节的脚步越来越近了,每逢春节很多地方都会燃放烟花来增添节日的气氛,然而因环境污染的加剧,近年来不少地方已经禁

止燃放烟花了,为了弥补这个遗憾,本文我们来看一下如何使用 Python 来实现一场烟花秀。

实现

功能实现用到的 Python 库包括:tkinter、PIL、time、random、math,如果之前没有装过第三库的话,使用

 

 pip install pillow 

 

装一下即可。

 

首先,我们使用 tkinter 来创建一个画布,可以根据自己的喜好选一张应景的图片作为背景,代码实现如下:

 
root = tk.Tk()
 
# 绘制一个画布
 
cv = tk.Canvas(root, height=457, width=690)
 
# 背景图
 
image = Image.open("bg.jpeg")
 
photo = ImageTk.PhotoImage(image)
 
# 在画板上绘制一张图片
 
cv.create_image(0, 0, image=photo, anchor='nw')
 
cv.pack()

 

看一下效果:

图片

 

接着我们来实现烟花燃放的效果并在画布上显示。先来定义一个烟花类 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 = y
 
 self.initial_speed = explosion_speed
 
 # 外放 x 轴速度
 
 self.vx = vx
 
 # 外放 y 轴速度
 
 self.vy = vy
 
 # 绽放的粒子数
 
 self.total = total
 
 # 已停留时间
 
 self.age = 0
 
 # 颜色
 
 self.color = color
 
 # 画布
 
 self.cv = cv
 
 self.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_speed
 
  move_y = sin(radians(self.id * 360 / self.total)) * self.initial_speed
 
  self.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 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.01s
 
        sleep(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 += dt
 
    root.after(wait_time, ignite, cv)

 

最后,我们来看一下效果:

图片

总结

本文我们使用 Python 实现了烟花燃放的特效,如果感兴趣的话,可以自动动手试试。

在这里还是要推荐下我自己建的Python学习群:810735403,群里都是学Python的,如果你想学或者正在学习

Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份

2021最新的Python进阶资料和零基础教学,欢迎进阶中和对Python感兴趣的小伙伴加入!

标签:Python,self,烟花,快到,total,speed,cv
来源: https://www.cnblogs.com/peig/p/14328967.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有