利用Python写一场新年烟花秀

 更新时间:2022年01月04日 09:35:08   作者: Python小二   
这篇文章主要介绍了利用Python写一场新年烟花秀,可以送给朋友还可以当作练习,Python 模块包括:tkinter、PIL、time、random、math,下面来看一下代码实现,需要的朋友可以参考一下

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

1.导库

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

2.烟花颜色

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

3.定义烟花类

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 = 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 expand(self):
        return self.age <= 1.5

    # 检查粒子是否仍在生命周期内
    def alive(self):
        return self.age <= self.lifespan

4.燃放烟花

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)

5.启动

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

看一下效果:

相关文章

  • Pandas通过index选择并获取行和列

    Pandas通过index选择并获取行和列

    本文主要介绍了Pandas通过index选择并获取行和列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • django小技巧之html模板中调用对象属性或对象的方法

    django小技巧之html模板中调用对象属性或对象的方法

    这篇文章主要介绍了django的html模板中调用对象属性或对象的方法及相关代码,有需要的小伙伴可以参考下。
    2018-11-11
  • python各层级目录下import方法代码实例

    python各层级目录下import方法代码实例

    这篇文章主要介绍了python各层级目录下import方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 如何用python GUI(tkinter)写一个闹铃小程序(思路详解)

    如何用python GUI(tkinter)写一个闹铃小程序(思路详解)

    这篇文章主要介绍了用python GUI(tkinter)写一个闹铃小程序思路详解,涉及到tkinter一些函数控件,数据的类的封装,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-12-12
  • Python实现自动玩贪吃蛇程序

    Python实现自动玩贪吃蛇程序

    这篇文章主要介绍了通过Python实现的简易的自动玩贪吃蛇游戏的小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学一学
    2022-01-01
  • Python Requests库及用法详解

    Python Requests库及用法详解

    Requests库作为Python中最受欢迎的HTTP库之一,为开发人员提供了简单而强大的方式来发送HTTP请求和处理响应,本文将带领您深入探索Python Requests库的世界,我们将从基础知识开始,逐步深入,覆盖各种高级用法和技巧,感兴趣的朋友一起看看吧
    2024-06-06
  • Python全景系列之控制流程盘点及进阶技巧

    Python全景系列之控制流程盘点及进阶技巧

    这篇文章主要为大家介绍了Python全景系列之控制流程盘点及进阶技巧详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • 解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程

    解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程

    这篇文章主要介绍了解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程,本文图文并茂给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • 老生常谈Python基础之字符编码

    老生常谈Python基础之字符编码

    下面小编就为大家带来一篇老生常谈Python基础之字符编码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 浅谈Django学习migrate和makemigrations的差别

    浅谈Django学习migrate和makemigrations的差别

    这篇文章主要介绍了浅谈Django学习migrate和makemigrations的差别,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01

最新评论