利用Python写一场新年烟花秀
2022-01-06 04:07
1141 查看
目录
我们用到的 Python 模块包括:tkinter
、PIL
、time
、random
、math
,如果第三方模块没有装的话,pip install
一下即可,下面看一下代码实现。
1.导库
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
2.烟花颜色
colors = ['red', 'blue', 'yellow', 'white', 'green', 'orange', 'purple', 'seagreen', 'indigo', 'cornflowerblue']
3.定义烟花类
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
4.燃放烟花
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)
5.启动
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()
看一下效果:
您可能感兴趣的文章:
相关文章推荐
- 庆祝法国队夺冠:用Python放一场烟花秀
- 用Python放一场浪漫的烟花秀!
- 程序员如何利用 Python 解决女朋友不看天气的坏习惯?
- Python:利用内建函数将字符串转化为整数
- 利用python3 的pygame模块实现塔防游戏
- 利用python实现strassen算法(2<=n,m)A,B为任意矩阵阶数局限于2的n次方
- Python 利用 filter() 滤掉非回数
- python中利用redis构建任务队列(queue)
- 利用Flask + python3.6+MYSQL编写一个简单的评论模块。
- python利用K均值做聚类,判断中国足球第几流
- 利用python实现批量自动化运维脚本案例
- (Python)利用SMTP发送邮件基础篇,发送文本邮件
- Python利用dict构造数据库(mysql)的插入语句
- Python下利用BeautifulSoup解析HTML的实现
- Python利用win32com操作Excel
- 利用python-opencv进行颜色标定
- 利用Python脚本实现自动刷网课
- python利用wmi模块统计windows下网卡信息和连接数
- python 利用pyttsx3文字转语音过程详解
- Python学习 | Numpy 利用数组进行数据处理