前言

嗨喽,大家好呀~这里是爱看美女的茜茜呐

又到了学Python时刻~

准备

准备一下你运行效果的背景图

以及一首你喜欢或那你女朋友喜欢的音乐

效果

代码展示

导入模块

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: 粒子在画布上停留的时间

‘’’

PS:本篇完整源码如有需要的小伙伴可以加下方的群去找管理员免费领取

为每一个烟花绽放出来的粒子单独构建一个类的对象 ,

每个粒子都会有一些重要的属性,决定它的外观(大小、颜色)、移动速度等

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

烟花绽放x轴

        self.x = x

烟花绽放y轴

        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

指定一个限定矩形(Tkinter 会自动在这个矩形内绘制一个椭圆)

        self.cid = self.cv.create_oval(x - size, y - size, x + size,y + size, fill=self.color, outline='white',width=0.01)

粒子在画布上停留的时间

        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#粒子x轴继续膨胀move_y = sin(radians(self.id*360/self.total))*self.initial_speed#粒子y轴继续膨胀self.cv.move(self.cid, move_x, move_y)#根据id把画布上的粒子移动x和y个距离self.vx = move_x/(float(dt)*1000)#粒子x轴的速度
        elif self.alive():columnFont = ('华文行楷',40)#如果粒子仅存活不扩张(只是停留时间足够,说明膨胀到最大了),则自由坠落self.cv.create_text(150, 80, text='圣',tag="write_tag", fill=choice(colors),font = columnFont) #字体self.cv.create_text(250, 80,  text='诞',tag="write_tag", fill=choice(colors),font = columnFont)self.cv.create_text(350, 80, text='快',tag="write_tag", fill=choice(colors),font = columnFont)self.cv.create_text(450, 80,  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 jobself.cv.move(self.cid, self.vx + move_x, self.vy+GRAVITY*dt)self.vy += GRAVITY*dt#更新y轴
        elif self.cid is not None:#如果粒子生命周期已过,则将其移除cv.delete(self.cid)#在画布上移除该粒子对象self.cv.delete("write_tag")#同时移除字体self.cid = None
    def expand (self):#定义膨胀效果时间帧return self.age <= 1.2#判断膨胀时间是否小于1.2秒
    def alive(self):#判断粒子是否仍在生命周期内return self.age <= self.lifespan#判断已停留时间是否小于应该停留时间
'''
Firework simulation loop:
Recursively call to repeatedly emit new fireworks on canvas
a list of list (list of stars, each of which is a list of particles)
is created and drawn on canvas at every call,
via update protocol inside each 'part' object
'''

可以在这一段修改烟花的位置

def simulate(cv):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 explosionfor point in range(numb_explode):#为所有模拟烟花绽放的全部粒子创建一列列表if point<=6:objects = []#每个点的爆炸粒子列表粒子列表x_cordi = 150 + point*50#每个爆炸点的x轴y_cordi = 80#每个爆炸点的y轴speed = uniform (0.5, 5.5)#每个爆炸点的速度size = uniform (0.5,3)#每个爆炸点的大小color = choice(colors)#每个爆炸点的颜色explosion_speed = uniform(0.6, 4)#爆炸的绽放速度total_particles = randint(10,50)#烟花的总粒子数for i in range(2,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.7,1.75))#把上述参数代入part函数,但是每个粒子的生存时间是自己独立的objects.append(r)#把r添加进粒子列表explode_points.append(objects)#把粒子列表添加进烟花列表else: objects = []#每个点的爆炸粒子列表粒子列表x_cordi = randint(50,550)#每个爆炸点的x轴y_cordi = randint(50, 550)#每个爆炸点的y轴speed = uniform (0.5, 6.5)#每个爆炸点的速度size = uniform (0.4,3)#每个爆炸点的大小color = choice(colors)#每个爆炸点的颜色explosion_speed = uniform(0.3, 2)#爆炸的绽放速度total_particles = randint(10,40)#烟花的总粒子数for i in range(2,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-tfor 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 rootroot.quit()
## 完整源码加Q君羊:261823976
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做一个粒子烟花震撼众人赚个女孩回来吧~相关推荐

  1. 卧槽!我用Python做一个打字测试器!看看谁是最快的男人!

    对于平时经常使用电脑的小伙伴而言,一个必不可少的操作就是利用键盘进行打字的操作,想必大家对自己的打字速度也是非常的自信,但是具体的速度大家却不能够准确表述. 今天,小编就同大家利用python制作一款 ...

  2. 十行代码,我用Python做一个迷你版的美图秀秀!

    美图秀秀相信大家都不陌生,大家只要操作美图秀秀,就可以P掉图片中脸上的一些瑕疵,让人变得更加的美丽.今天小编就带领大家来借助Python和Flask来实现一个美图秀秀的网页设计,大家只需要通过网页上传 ...

  3. python 制作自己的新闻_新闻-十行代码,用Python做一个迷你版的美图秀秀

    十行代码,用Python做一个迷你版的美图秀秀 2020-02-28 10:16:08 作者: 匿名 浏览量:65次 美图秀秀相信大家都不陌生,大家只要操作美图秀秀,就可以P掉图片中脸上的一些瑕疵,让 ...

  4. python 两点曲线_十行代码,用Python做一个迷你版的美图秀秀

    美图秀秀相信大家都不陌生,大家只要操作美图秀秀,就可以P掉图片中脸上的一些瑕疵,让人变得更加的美丽.今天小编就带领大家来借助Python和Flask来实现一个美图秀秀的网页设计,大家只需要通过网页上传 ...

  5. python模拟春节集五福_过年扫五福,干脆我用Python做一个五福生成器

    原标题:过年扫五福,干脆我用Python做一个五福生成器 新的一年又要到来了,各个大的公司又在这年末为大家送上了新春的祝福,支付宝还是延续了这几年的传统,在年末为大家送上了集五福的活动,为了大家能更快 ...

  6. python画圣诞老人图片_来得瑟一下!用Python做一个缩放自如的圣诞老人

    原标题:来得瑟一下!用Python做一个缩放自如的圣诞老人 圣诞节又要到了,虽说我们中国人不提倡过西方的节日, 但是商家们还是很喜欢的,估计有对象的男孩纸女孩纸们也很喜欢吧. 今天的主题是为大家展示如 ...

  7. 过年扫五福,干脆我用Python做一个五福生成器

    新的一年又要到来了,各个大的公司又在这年末为大家送上了新春的祝福,支付宝还是延续了这几年的传统,在年末为大家送上了集五福的活动,为了大家能更快更好的扫出来大大的"福",今天小编就带 ...

  8. 来得瑟一下!用Python做一个缩放自如的圣诞老人

    圣诞节又要到了,虽说我们中国人不提倡过西方的节日,但是商家们还是很喜欢的,估计有对象的男孩纸女孩纸们也很喜欢吧. 今天的主题是为大家展示如何用python做一个不断变大的圣诞老人,就像西游记中能够随意 ...

  9. 用python写搜索引擎_用python做一个搜索引擎(Pylucene)的实例代码

    1.什么是搜索引擎? 搜索引擎是"对网络信息资源进行搜集整理并提供信息查询服务的系统,包括信息搜集.信息整理和用户查询三部分".如图1是搜索引擎的一般结构,信息搜集模块从网络采集信 ...

最新文章

  1. 解决安卓微信浏览器中location.reload 或者 location.href失效的问题
  2. ajax.filter json过滤,$.ajax()的dataFilter方法
  3. html css js 实战案例_使用html+css+js实现弹球游戏
  4. stm8s跳出中断程序c语言,stm8s103 利用中断判断长按短按,长按可以实现进入低功耗 短按1-2s跳出低功耗进入工作,实际情况是短按立马跳出低功耗,请各位大侠帮忙看看。附程序...
  5. [导入]相片: 23853741.jpg
  6. 详述一则DB2 Error Code 1639和SQL State 08001案例诊断和解决方案
  7. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_4-3.登录检验JWT实战之封装通用方法...
  8. 购买成功订单详情html,订单成功页面功能实现
  9. 快速消除Word文档中空格
  10. 【转】Oracle知识点汇总
  11. PHP获取身份证年龄和性别
  12. 搜狐新闻数据400w+
  13. 企业研发人员配备比例_申报高新企业研发人员工资比例
  14. 关于ideal统计代码量 statistic插件
  15. HTPPS加密对网站有什么好处
  16. 人工智能对生活的影响
  17. Dacom G150双模耳机,为爱发声,呵护孩子听力健康成长
  18. Discuz 批量修改、替换帖子标题或内容
  19. 抖音服务器到底有多大,能够供那么多人同时刷?
  20. Word和Excel中的常用办公操作

热门文章

  1. 支持本地挂载的网盘文件列表工具AList
  2. vts传感器采取船舶的_在VTS系统中实现雷达信息与AIS信息融合的方法探讨
  3. css33d图片轮播_通过html+css3实现图片轮播切换
  4. 大数据分析课程(数据分析课设--包含代码)
  5. 西部数据My Passport Ultra炫彩风暴引爆移动存储市场
  6. PostgreSQL中的ACID特性介绍
  7. 如何添加Burp Suite添加https证书
  8. IE8——focus函数不好用
  9. 互联网公司如何管理研发团队
  10. JQuery Smart UI 简介(四) — 强大的适用性存在问题【项目使用性介绍】