利用python和前端三件套来一场线上烟花秀
目录
python烟花秀
效果展示:
全部代码如下:
前端三件套(JS、CSS、HTML)的烟花秀
HTML部分:定义网页内容
CSS部分:描述网页布局
JS部分:控制网页行为
End
✨✨✨✨✨✨✨
元旦节就要来了,线下没有烟花看,线上不得整点烟花酷炫一下嘛!!
啥?过啥圣诞节?过啥洋节,咱们过元旦节好吧!
✨✨✨✨✨✨✨
python烟花秀
效果展示:
在这里,我们设计一个对象,表示烟花事件中的每个粒子。每个粒子都会有一些重要的属性,支配了它的外观和移动状况:大小,颜色,位置,速度等等。
'''
particles 类
粒子在空中随机生成随机,变成一个圈、下坠、消失
属性:- id: 粒子的id- x, y: 粒子的坐标- vx, vy: 在坐标的变化速度- total: 总数- age: 粒子存在的时长- color: 颜色- cv: 画布- lifespan: 最高存在时长
'''
class part:
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 = idxself.x = xself.y = yself.initial_speed = explosion_speedself.vx = vxself.vy = vyself.total = totalself.age = 0self.color = colorself.cv = cvself.cid = self.cv.create_oval(x - size, y - size, x + size,y + size, fill=self.color)self.lifespan = lifespan
除了属性,这个对象肯定还要有其所固定的方法,这里我们定义了其三个方法,分别是“膨胀”“坠落”和“消失”,这些函数分别如示范:
def update(self, dt):# 粒子膨胀if self.alive() and self.expand():move_x = cos(radians(self.id*360/self.total))*self.initial_speedmove_y = sin(radians(self.id*360/self.total))*self.initial_speedself.vx = move_x/(float(dt)*1000)self.vy = move_y/(float(dt)*1000)self.cv.move(self.cid, move_x, move_y)
# 以自由落体坠落elif self.alive():move_x = cos(radians(self.id*360/self.total))# 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
# 如果粒子的生命周期已过,就将其移除elif self.cid is not None:cv.delete(self.cid)self.cid = None
除此之外,为达到烟花更好的效果,我们这里也定义了烟花种每一个粒子的绽放时间和坠落时间,这里可以自己多尝试几组参数以达到·最好的效果:
# 定义膨胀效果的时间帧
def expand (self):return self.age <= 1.2
# 检查粒子是否仍在生命周期内
def alive(self):return self.age <= self.lifespan
利用Tkinter快速创建GUI应用程序:import tkinter as tk
root = tk.Tk()
对于每个小烟花里边的粒子的定义:创建一列列表,每个子列表是一个烟花,其包含一列粒子。每个列表中的例子有相同的x,y坐标、大小、颜色、初始速度。
numb_explode = randint(6,10)
# 为所有模拟烟花绽放的全部粒子创建一列列表
for point in range(numb_explode):objects = []x_cordi = randint(50,550)y_cordi = randint(50, 150) 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 = part(cv, idx = i, total = total_particles, explosion_speed = explosion_speed, x = x_cordi, y = y_cordi, color=color, size = size, lifespan = uniform(0.6,1.75))objects.append(r)
explode_points.append(objects)
定义每个粒子定期更新粒子的属性,这里我们设置让粒子每0.01秒更新它们的状态,在1.8秒之后停止更新(这意味着每个粒子的存在时间为1.6秒,其中1.2秒为“绽放”状态,0.4秒为“坠落”状态,0.2秒处于Tkinter将其完全移除前的边缘状态)。
total_time = .0
# 在1.8秒时间帧内保持更新
while total_time < 1.8:sleep(0.01)tnew = time()t, dt = tnew, tnew - tfor point in explode_points:for part in point:part.update(dt)cv.update()total_time += dt
值得注意的是,为了增加视觉上的效果,我们可以增加一个美丽的背景图放在当前目录:
image = Image.open("./image1.jpg")
全部代码如下:
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
# 模拟重力
GRAVITY = 0.05
# 颜色选项(随机或者按顺序)
colors = ['red', 'blue', 'yellow', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue']
'''
particles 类
粒子在空中随机生成随机,变成一个圈、下坠、消失
属性:- id: 粒子的id- x, y: 粒子的坐标- vx, vy: 在坐标的变化速度- total: 总数- age: 粒子存在的时长- color: 颜色- cv: 画布- lifespan: 最高存在时长
'''
class Particle:
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 = idxself.x = xself.y = yself.initial_speed = explosion_speedself.vx = vxself.vy = vyself.total = totalself.age = 0self.color = colorself.cv = cvself.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_speedmove_y = sin(radians(self.id * 360 / self.total)) * self.initial_speedself.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))# 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
# 移除超过最高时长的粒子elif self.cid is not None:cv.delete(self.cid)self.cid = None
# 扩大的时间def expand (self):return self.age <= 1.2
# 粒子是否在最高存在时长内def alive(self):return self.age <= self.lifespan
'''
循环调用保持不停
'''
def simulate(cv):t = time()explode_points = []wait_time = randint(10, 100)numb_explode = randint(6, 10)# 创建一个所有粒子同时扩大的二维列表for point in range(numb_explode):objects = []x_cordi = randint(50, 500)y_cordi = randint(50, 250)speed = uniform(0.5, 1.5)size = uniform(0.5, 2)color = choice(colors)explosion_speed = uniform(0.2, 1)total_particles = randint(10, 100)for i in range(1, total_particles):r = Particle(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.8s内一直扩大while total_time < 1.8:sleep(0.01)tnew = time()t, dt = tnew, tnew - tfor point in explode_points:for item in point:item.update(dt)cv.update()total_time += dt# 循环调用root.after(wait_time, simulate, cv)
def close(*ignore):"""退出程序、关闭窗口"""global rootroot.quit()
if __name__ == '__main__':root = tk.Tk()cv = tk.Canvas(root, height=600, width=800)# 选一个好看的背景会让效果更惊艳!image = Image.open("./image1.jpg")photo = ImageTk.PhotoImage(image)
cv.create_image(0, 0, image=photo, anchor='nw')cv.pack()
root.protocol("WM_DELETE_WINDOW", close)root.after(100, simulate, cv)root.mainloop()
reference:https://zhuanlan.zhihu.com/p/187481893
前端三件套(JS、CSS、HTML)的烟花秀
接下来我们要做的就是在实现烟花效果的同时把前端三件套也学了!!
听着就很刺激!
利用python和前端三件套来一场线上烟花秀相关推荐
- 2022跨年烟花代码|用Python送你一场跨年烟花秀
2021 已经接近尾声了,2022 即将到来,本文我们用 Python 送你一场跨年烟花秀. 我们用到的 Python 模块包括:tkinter.PIL.time.random.math,如果第三方模 ...
- 2022跨年烟花代码、用Python送你一场跨年烟花秀
2021 已经接近尾声了,2022 即将到来,本文我们用 Python 送你一场跨年烟花秀. 我们用到的 Python 模块包括:tkinter.PIL.time.random.math,如果第三方模 ...
- Python带你跨年!用Python送你一场跨年烟花秀
2021 已经接近尾声了,2022 即将到来,本文我们用 Python 送你一场跨年烟花秀. 我们用到的 Python 模块包括:tkinter.PIL.time.random.math,如果第三方模 ...
- 2022来了,用 Python 制作一场环保的烟花秀
2022 来了,本文我们用 Python 送你一场跨年烟花秀. 我们用到的 Python 模块包括:tkinter.PIL.time.random.math,如果第三方模块没有装的话,pip inst ...
- 2023跨年烟花代码|用Python送你一场跨年烟花秀
已经接近尾声了,2023 即将到来,本文我们用 Python 送你一场跨年烟花秀. 我们用到的 Python 模块包括:tkinter.PIL.time.random.math,如果第三方模块没有装的 ...
- 今天下午三点,2020深圳开放数据应用创新大赛将举行第二场线上推介会
4月27日15:00 - 16:30,网易客户端.ZAKER.华为云.南方 plus.虎牙在线直播 每场线上推介会设两轮抽奖,欢迎互动. 继4月20日首场线上推介会顺利举行后,4月27日下午,以&qu ...
- 2018开春大礼:750页电子书 + 33场技术沙龙资料 + 17场线上课程分享
2017年,美团成长为中国领先的生活服务电子商务平台,在吃喝玩乐住行等200多个品类,2800多个城区县,服务了亿万消费者.数百万商家,日订单数超过2200万,年度交易总额达到了3600亿.2017年 ...
- 前端是选择线下还是线上课程
前端是选择线下还是线上课程?今天朗沃小刘小编来谈谈前端是选择线下还是线上课程,经常会看见有人问前端是选择线下还是线上课程?小刘个人觉得,线上还是线下好要根据个人学习习惯来看,对于学习自律比较好的人来说 ...
- chatgpt赋能python:Python编程爱好者必备:如何参加线上比赛
Python编程爱好者必备:如何参加线上比赛 作为一名拥有10年Python编程经验的工程师,我非常喜欢参加线上编程比赛.在这些比赛中,我可以与全球的编程爱好者一起竞技,展现自己编程的优势和挑战自己的 ...
最新文章
- zBrow压力测试图
- 如何用 Serverless 让 SaaS 获得更灵活的租户隔离、更优的资源开销
- 深入分析 Linux 内核链表--转
- 如何识别媒体偏见_描述性语言理解,以识别文本中的潜在偏见
- mysql检索面试题目_MySQL面试题目二十七道整理
- 保证一致性吗_谈了千百遍的缓存数据一致性问题
- Win-MASM64汇编语言-and/or指令
- 5G 时代,AIoT 该如何布局?
- 循环中需要调用异步怎么确保执行完再执行其他的_什么是事件循环和异步编程?5种使用async/await更好地编码方式!...
- idea jar包重新依赖_分布式架构系列:jar包依赖管理
- 汪文君PowerMock实战视频
- 原生WebView长截图 和 Tencent x5webview截长图
- webuploader java版本
- matlab 兼容,matlab版本兼容问题
- modelica用inertia连接FlangeWithBearing时报组件不匹配连接错误:incompatible components in connect statement
- (XWZ)的Python学习笔记Ⅱ------面向对象编程
- 一文读懂局域网、广域网、WLAN、WiFi的联系与区别
- DOS下常用命令介绍
- Windows 上6款卸载软件值得推荐
- 大数据平台日志存储分析系统解决方案