怎样用Python实现烟花秀效果,要用到哪些模块
Admin 2022-05-21 群英技术资讯 965 次浏览
tkinter
、PIL
、time
、random
、math
,如果第三方模块没有装的话,pip install
一下即可,下面看一下代码实现。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
colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue']
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
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)
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()
看一下效果:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
本文主要介绍了OpenCV中Canny边缘检测的实现,边缘检测一般是识别目标图像中亮度变化明显的像素点,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
目录1 筛选出数据的指定几行数据2 筛选出数据某列为某值的所有数据记录3 模式匹配4 范围区间值筛选5 获取某一行某一列的某个值6 获取原始的numpy二维数组7 根据条件得到某
这篇文章主要介绍了手把手教你使用Python绘制时间序列图,本文将以股价数据集为例,指导你从Quandl下载股价数据集,并将这些数据绘制在价格和成交量图表上,需要的朋友可以参考下
在上一章的学习中,我们主要学习了怎么去衡量一个算法的好坏,比较常见的方式是使用大O记法,就是所谓的时间复杂度,这一章节我来学习基本的数据结构,如栈、队列和双端队列等等。感兴趣的小伙伴可以参考一下
这篇文章主要为大家详细介绍了python实现五子棋双人对弈,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008