Python制作简易版烟花,没资金买烟花就来做个电子版的吧

news2024/11/15 23:45:01

前言

听说有人说我很久没更新了,那今天来表演个粒子烟花

跨年倒计时20天?我已经开始整烟花了,虽然不是很好看吧,但是也能将就看看 😥

这个的背景图,音乐,还有文字都是可以自己修改的哦

效果展示

在这里插入图片描述

导入库

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

实现代码

生成随机颜色

源码.点击领取即可


def randomcolor():
    #生成随机颜色
    colArr = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
    color = ""
    for i in range(6):
        color += colArr[random.randint(0,14)]
    return "#"+color

GRAVITY = 0.06
#重力变量
colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen','indigo', 'cornflowerblue', 'pink']
#颜色列表

属性

Generic class for particles
particles are emitted almost randomly on the sky, forming a round of circle (a star) before falling and getting removed
from canvas
Attributes(属性):
    - id: 粒子的id
    - x, y: 粒子的坐标
    - vx, vy: 粒子在对应坐标的变化速度
    - total:一颗烟花里的粒子总数
    - age: 粒子在画布上停留的时间
    - color: 自我移植
    - cv: 画布
    - lifespan: 粒子在画布上停留的时间

粒子运动的速度

这个里面的新年快乐是可以自己更改的哦

python学习交流Q群:309488165 ### 源码领取
class part:
#为每一个烟花绽放出来的粒子单独构建一个类的对象 ,每个粒子都会有一些重要的属性,决定它的外观(大小、颜色)、移动速度等
    def __init__(self, cv, idx, total, explosion_speed, x=0., y=0., vx = 0., vy = 0., size=3., color = 'red', lifespan = 2, **kwargs):
        self.id = idx
        #每个烟花的特定标识符
        self.x = x
        #烟花绽放x轴
        self.y = y
        #烟花绽放y轴
        self.initial_speed = explosion_speed
        #粒子初始速度
        self.vx = vx
        #粒子运动x轴速度
        self.vy = vy
        #粒子运动y轴速度
        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, outline='white',width=0.01)
        #指定一个限定矩形(Tkinter 会自动在这个矩形内绘制一个椭圆)
        self.lifespan = lifespan
        #粒子在画布上停留的时间

xy轴移动位移

如果粒子仅存活不扩张(只是停留时间足够,说明膨胀到最大了),则自由坠落

        elif self.alive():
            columnFont = ('华文行楷',14)
            self.cv.create_text(250, 100, text='新',tag="write_tag", fill=choice(colors),font = columnFont) #字体
            self.cv.create_text(300, 100,  text='年',tag="write_tag", fill=choice(colors),font = columnFont)
            self.cv.create_text(350, 100, text='快',tag="write_tag", fill=choice(colors),font = columnFont)
            self.cv.create_text(400, 100,  text='乐',tag="write_tag", fill=choice(colors),font = columnFont)
            #删除文字标签
            move_x = cos(radians(self.id*360/self.total))
            #x轴的移动位移
            # we technically don't need to update x, y because move will do the job
            self.cv.move(self.cid, self.vx + move_x, self.vy+GRAVITY*dt)
            self.vy += GRAVITY*dt
            #更新y轴

膨胀效果时间帧

判断膨胀时间是否小于1.2秒

    def expand (self):
        #定义膨胀效果时间帧
        return self.age <= 1.2

判断粒子是否仍在生命周期内

判断已停留时间是否小于应该停留时间

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

剩下代码

不想一步步写出来咯,有点麻烦哈哈

代码后面都有注释哈

源码.点击领取即可

def simulate(cv):

python学习交流Q群:309488165 ### 源码领取 
    t = time()
    #返回自1970年后经过的浮点秒数,精确到小数点后7位
    explode_points = []
    #爆炸点列表,烟花列表
    wait_time = randint(10,100)
    #等待时间为10到100之间整数
    numb_explode = randint(8,20)
    #爆炸烟花个数时6到10之间的随机整数
    # create list of list of all particles in all simultaneous explosion
    for point in range(numb_explode):
        #为所有模拟烟花绽放的全部粒子创建一列列表
        if point<=4:
            objects = []
            #每个点的爆炸粒子列表粒子列表
            x_cordi = 250 + point*50
            #每个爆炸点的x轴
            y_cordi = 100
            #每个爆炸点的y轴
            speed = uniform (0.5, 2.5)
            #每个爆炸点的速度
            size = uniform (0.5,3)
            #每个爆炸点的大小
            color = choice(colors)
            #每个爆炸点的颜色
            explosion_speed = uniform(0.6, 3)
            #爆炸的绽放速度
            total_particles = randint(10,60)
            #烟花的总粒子数
            for i in range(1,total_particles):
            #同一个烟花爆炸出来的粒子大小、速度、坐标都是相同的
                r = part(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))
                #把上述参数代入part函数,但是每个粒子的生存时间是自己独立的
                objects.append(r)
                #把r添加进粒子列表
            explode_points.append(objects)
            #把粒子列表添加进烟花列表
        else: 
            objects = []
            #每个点的爆炸粒子列表粒子列表
            x_cordi = randint(50,550)
            #每个爆炸点的x轴
            y_cordi = randint(50, 250)
            #每个爆炸点的y轴
            speed = uniform (0.5, 2.5)
            #每个爆炸点的速度
            size = uniform (0.5,3)
            #每个爆炸点的大小
            color = choice(colors)
            #每个爆炸点的颜色
            explosion_speed = uniform(0.3, 2)
            #爆炸的绽放速度
            total_particles = randint(10,50)
            #烟花的总粒子数
            for i in range(1,total_particles):
            #同一个烟花爆炸出来的粒子大小、速度、坐标都是相同的
                r = part(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))
                #把上述参数代入part函数,但是每个粒子的生存时间是自己独立的
                objects.append(r)
                #把r添加进粒子列表
            explode_points.append(objects)
            #把粒子列表添加进烟花列表

 
    total_time = .0
    #初始化总时间
    # keeps undate within a timeframe of 1.8 second 
    while total_time < 2:
    #当总时间小于1.8秒时运行该循环
        sleep(0.03)
        #让画面暂停0.01秒
        tnew = time()
        #刷新时间
        t, dt = tnew, tnew - t
        #时间等于新时间,和上次时间间隔为tnew-t
        for point in explode_points:
        #遍历烟花列表
            for item in point:
            #遍历烟花里的粒子列表
                item.update(dt)
                #粒子更新时间
        cv.update()
        #刷新画布
        total_time += dt
        #为while循环增加时间
 
    root.after(wait_time, simulate, cv)
    #将组件置于其他组件之后,放在最顶层,覆盖下面的,递归调用自己,形成新一轮的爆炸

def close(*ignore):
    #打开模拟循环并关闭窗口
    """Stops simulation loop and closes the window."""
    global root
    root.quit()
 
    
if __name__ == '__main__': 
    root = tk.Tk() 
    root.title('新年快乐~~')  # 设置窗体的标题栏
    cv = tk.Canvas(root, height=600, width=600)
    #绘制一个高600,宽600的画布 
    bgpath = filedialog.askopenfilename(title='请选择背景图片')
    #选择背景图片
    image = Image.open(bgpath)
    #打开背景图片
    image = image.resize((600,600), Image.ANTIALIAS)
    #把背景图片调整成窗口大小
    photo = ImageTk.PhotoImage(image) 
    cv.create_image(0, 0, image=photo, anchor='nw')
    #在画布上绘制加载的背景图片 
    bgmusic = filedialog.askopenfilename(title='请选择背景音乐')
    py.mixer.init()
    # 初始化
    py.mixer.music.load(bgmusic)
    # 文件加载
    py.mixer.music.play(-1, 0, fade_ms=50)
    # 播放  第一个是播放值 -1代表循环播放, 第二个参数代表开始播放的时间
    py.mixer.music.pause() 
    #暂停
    py.mixer.music.unpause()
    #取消暂停
    cv.pack()
    #把cv添加进去
    root.protocol("WM_DELETE_WINDOW", close)
    root.after(200, simulate, cv)
    #在0.1秒后再调用stimulate函数,生成一轮烟花绽放效果
    root.mainloop()
    #执行root,生成窗口

最后

今天的分享到这里就结束了

顺便给大家推荐一些Python视频教程,希望对大家有所帮助:

Python零基础教学合集

对文章有问题的,或者有其他关于python的问题,可以在评论区留言或者私信我哦
觉得我分享的文章不错的话,可以关注一下我,或者给文章点赞(/≧▽≦)/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/78682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]JAVA毕业设计-心理健康管理-(系统+LW)

[附源码]JAVA毕业设计-心理健康管理-&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&a…

String 创建了几个对象?

问题一 String zy1 “小朱”; String zy2 “小朱”; 复制代码 问题二 String zy1 “小朱”; String zy2 “大朱”; 复制代码 问题三 String zy1 new String(“小朱”); String zy2 new String(“小朱”); 复制代码 问题四 String zy1 new String(“小朱”);…

09 - 主引导程序控制权的转移

---- 整理自狄泰软件唐佐林老师课程 文章目录1. BootLoader内存布局2. 通过FAT表加载文件内容3. 编程实验&#xff1a;Loader文件内容的加载4. 第一个Loader程序4.1 汇编小贴士&#xff1a;标志寄存器4.2 编程实验&#xff1a;控制权转移5. 小结1. BootLoader内存布局 2. 通过F…

你还不知道「并发下的三色标记」么?

引用计数算法 在对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时 计数器值就加一;当引用失效时&#xff0c;计数器值就减一; 任何时刻计数器为零的对象就是不可能再被使用的。 引用计数算法的缺陷 如下面代码&#xff0c;两个对象互相引用导致无法回收♻️ 对…

【OpenCV学习】第12课:特征提取(高斯不同)

仅自学做笔记用,后续有错误会更改 理论 定义&#xff1a;就是把同一张图像在不同的参数下做高斯模糊之后的结果相减&#xff0c;得到的输出图像&#xff0c;称为高斯不同&#xff08;DOG&#xff09;高斯不同是图像的内在特征&#xff0c; 在灰度图像增强丶角点检测中经常用到…

【MySQL】深入分析 锁机制(一)行锁 加锁规则 之 等值查询

文章目录前言一、共享锁&#xff08;S&#xff09;和排它锁&#xff08;X&#xff09;二、行锁的3种算法Record LockGap LockNext-key Lock三、加锁规则 之 等值查询分析数据准备3.1 聚集索引有匹配索引无匹配索引3.2 唯一索引有匹配索引无匹配索引3.3 普通索引有匹配索引无匹配…

游戏蓝牙耳机哪个好用?2022超低延迟游戏蓝牙耳机推荐

随着蓝牙耳机的快速发展&#xff0c;使用蓝牙耳机玩游戏的人也越来越多。那么&#xff0c;游戏蓝牙耳机哪个好用呢&#xff1f;当然是延迟越低的蓝牙耳机玩游戏的体验感会越好&#xff0c;我们都知道蓝牙耳机相对于有线耳机来说&#xff0c;或多或少会存在延迟。下面&#xff0…

一文讲解linux SMP Boot

说明&#xff1a; Kernel版本&#xff1a;4.14ARM64处理器&#xff0c;Contex-A53&#xff0c;双核使用工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 介绍 SMP, Symmetric Multi-Processor&#xff0c;相对于单核处理器来说&#xff0c;SMP实现了真正严格意义上…

写出这个数

目录 1002:写出这个数 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 代码长度限制 时间限制 内存限制 思路: 1.求和 1.2代码: 2.找到sum的每一位 2.2代码: 3.汉语拼音输出数字 3.2代码: 完整代码: 时间复杂度: 总结: 题…

通过MQ进行系统对接

消息要有来源系统&#xff0c;消息类型&#xff0c;收到消息的应用&#xff0c;通过url取数据。做一个开关&#xff0c;用户可以自己选择方案一和方案二。 方案一&#xff1a;A公司的消息中存json&#xff0c;供应链直接获取json 方案二&#xff1a;通过A公司消息中的UrL&…

Windows系统iis 和多界面怎么安装

Windows系统iis 和多界面怎么安装 服务器拿到手都是有iis&#xff08;iis&#xff1a;用于搭建网站&#xff09;和多界面&#xff08;多界面&#xff1a;用于同时多人操作服务器&#xff09; 但也有服务器是没有安装iis和多界面的&#xff0c;遇到这样的情况就手足无措了。 今…

实训任务5:ZooKeeper节点操作

文章目录一、实训目的二、实训要求三、实训任务四、完成任务&#xff08;一&#xff09;准备工作&#xff08;二&#xff09;实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建股票价格类&#xff08;1&#xff09;创建init()方法&#xff08;2&#xff09;创…

【python脚本】ICer的脚本入门训练——find_key

我们的目标是┏ (゜ω゜)☞芯片前端全栈工程师~喵&#xff01; 前言 往期回顾&#xff1a; 【python脚本】ICer的脚本入门训练——svn_back_尼德兰的喵的博客-CSDN博客_svn back文件 【python脚本】ICer的脚本入门训练——gen_tc_尼德兰的喵的博客-CSDN博客 查找关键词这一类脚…

TFT-LCD LVGL与硬件交互

TFT-LCD LVGL与硬件交互 屏幕能正常显示LVGL官方例程&#xff0c;说明LVGL移植成功了&#xff0c;本次实验使用屏幕通过LVGL控制开发板硬件 实现效果 用LVGL画两个按钮和一个标签&#xff0c;一个按钮控制蜂鸣器&#xff0c;另一个按钮控制继电器&#xff0c;标签显示“TFT-…

基于intel机器人控制器,支持slam,激光雷达和AI加速

9th/8th gen Intel Core™ i7/i5/i3 & Celeron.XM-5149 是专为机器人行业设计的工业计算机产品&#xff0c;高性能的处理能力加速 AI 学习速度&#xff0c;多种类 I/0 可接摄像头、雷达等丰富外设。在设备密闭舱体内&#xff0c;整机可以高温稳定运行不降速。 产品规格 芯…

flink不同部署方式-1.14

1. 版本说明 本文档内容基于 flink-1.14.x&#xff0c;其他版本的整理&#xff0c;请查看本人博客的 flink 专栏其他文章。 2. 概述 Flink 是一种通用性框架&#xff0c;支持多种不同的部署方式。 本章简要介绍 Flink 集群的组成部分、用途和可用实现。如果你只是想在本地启…

最全LaTeX 数学公式、字母符号、上下标、列表矩阵、公式注释、分数二进制数、分割字符、逻辑集合论、否定符号等

最全LaTeX 数学公式、字母符号、上下标、列表矩阵、公式注释、分数二进制数、分割字符、逻辑集合论、否定符号等 1. 公式示例 E(T)∑(p,q)ϵκ∣∣p−Tq∣∣2E(T)\sum_{(p,q)\epsilon\kappa} \mid\mid p-T_q \mid \mid ^2 E(T)(p,q)ϵκ∑​∣∣p−Tq​∣∣2 E(T)∑(p,q)ϵκ…

高数 |【23数一 李林六套卷】卷四 自用思路 及 知识点 整理

23数一 李林六套卷 —— 自用思路 及 知识点 整理 ——【卷一】 以下均为个人复盘。 T1:高阶无穷小 T6:傅里叶级数 法一:直接套傅里叶展开公式,死算 法二:用技巧。取一个x,看最后结果趋近于这个数!是趋近于!不是直接等于 直接等于不可以。再来看下一个。

Java--IO流详解

目录 一、IO流的介绍 二、IO流的具体详解 &#xff08;1&#xff09;字节流 1&#xff1a;FileOutputStream 2&#xff1a;FileInputStream &#xff08;2&#xff09;字符流 1&#xff1a;解码编码 2&#xff1a;FileReader 3&#xff1a;FileWriter 三、IO流的使用 …

MATLB|基于改进教学的优化算法(TLSBO)的最优功率优化

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f4dd;目前更新&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;电力系统相关知识&#xff0c;期刊论文&…