文 | 野客
来源:Python 技术「ID: pythonall」
春节的脚步越来越近了,每逢春节很多地方都会燃放烟花来增添节日的气氛,然而因环境污染的加剧,近年来不少地方已经禁止燃放烟花了,为了弥补这个遗憾,本文我们来看一下如何使用 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 实现了烟花燃放的特效,如果感兴趣的话,可以自动动手试试。
RECOMMEND
推荐阅读
01
《Python学习手册(原书第5版)》
无论你是零基础新手,还是有编程基础的程序员,想快速入门Python并达到可以开发实际项目的水平,本书都会是你的理想选择。每章都对Python语言的关键内容做单独讲解,并且配有章后习题、编程练习及详尽的解答,还配有大量注释的示例以及图表,便于你学习新的技能并巩固加深自己的理解。
02
《Effective Python:编写高质量Python代码的90个有效方法(原书第2版)》
经典畅销书重磅更新!Python编程进阶必读,基于Python3.8,新增31条建议!以使用场景为主导的精练教学方式,汇聚了90条优秀的实践原则、开发技巧和便捷方案,并以实用的代码范例来解释它们。通过本书,你能够掌握真正的Pythonic编程方式,写出高质量代码。
03
《Python 3标准库》
标准库与语言本身同样重要,它好比一个百宝箱,能为各种常见的任务提供完美的解决方案,所以本书是所有Python程序员都必备的工具书!全书以案例驱动的方式讲解了标准库中数百个模块的使用方法和工作原理,简洁易懂,为Python程序员熟练掌握和使用这些模块提供了绝佳指导。
04
《Python代码整洁之道:编写优雅的代码》
本书提供了构建无错误和强壮的Python项目所需的技巧和技术。阅读本书之后,你将会熟练地编写整洁的Python代码,并可以成功地将这些原则应用到自己的Python项目中。
点击下图进入【Python图书专题】
查看更多Python好书!
更多精彩回顾
书讯 | 2月书讯 | 读新书,过新年。
资讯 | DB-Engines 2月数据库排名:三霸主集体“亮红灯”?小众数据库不可小觑
书单 | 2020年云原生技术关键趋势总结
干货 | 人工智能的最后一公里
收藏 | 女朋友都能听懂的:入门级用户画像
上新 | 受了中台的伤?给你一本疗伤手册
赠书 | 【第41期】产品经理宝典
点击阅读全文查看更多Python好书