烟花由中國古代人民較早發明,常用於盛大的典禮或表演中,也在除夕夜及元宵節中燃放用來烘托節日氛圍。近年來隨著環境汙染的加劇,一些地區已經禁止燃放煙花了,那我們就用 python 實現一場無汙染的烟花秀。
導入庫:
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))
# 新增進粒子列表裡
# 把粒子列表新增到烟花列表
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)
# 背景圖
# 在畫板上繪製一張
cv.create_image(0, 0, image=photo, anchor='nw')
cv.pack()
root.protocol(close)
root.after(100, ignite, cv)
# 生成視窗
root.mainloop()
最終效果,如圖所示:
python入門乾貨 python基礎乾貨 01
1.編碼集 ascii 是最早的編碼 ascii值控制字元ascii值控制字元ascii值控制字元ascii值控制字元 nut space soha astxbb etxc ceotdd enqe eackff belggbs hhhti ilfjj vtkkff llcrm msonn siood...
安卓自製recovery教程
我想大家對recovery已經很熟悉了吧,基本每個機型都可以在網路上找到你們機型的對應的recovery,但是有些新出的機型或者一些冷門安卓機型是沒有recovery的,這時候我們怎麼辦呢,其實我們完全可以手工去製作乙個屬於自己機型的recovery,下面我就給大家寫個教程一起 一下。首先我給大家介...
Python匯入自製模組
用python玩轉資料中解釋的模組概念 包 乙個有層次的檔案目錄結構 aaa init py bbb.py ccc init py c1.py c2.py ddd init py d1.py eee 定義了乙個由模組和子包組成的python應用程式執行環境 引入使用函式的兩種用法 1.import ...