快到春節了,用 Python 實現一場烟花秀

2021-10-17 10:55:18 字數 3669 閱讀 8194

春節的腳步越來越近了,每逢春節很多地方都會燃放煙花來增添節日的氣氛,然而因環境汙染的加劇,近年來不少地方已經禁止燃放煙花了,為了彌補這個遺憾,本文我們來看一下如何使用 python 來實現一場烟花秀。

功能實現用到的 python 庫包括:tkinter、pil、time、random、math,如果之前沒有裝過第三庫的話,使用

pip install pillow

裝一下即可。

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))

# 新增進粒子列表裡

# 把粒子列表新增到烟花列表

total_time = .0

# 在 1.8 秒時間幀內保持更新

while total_time 

# 讓畫面暫停 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 實現了烟花燃放的特效,如果感興趣的話,可以自動動手試試。

快到七夕, 擼了乙個白噪音軟體

又是一年七夕,雖然已經對所謂的愛情無感,但還是擼了個小玩意送給自己 小夕是我認識的乙個女孩子,感覺她很害羞,給我感覺就是純天然無公害的妹子,雖然並沒有接觸過幾次,但是每次我舔著臉勾搭她的時候,她說話都特別溫柔,我知道這樣的女孩應該是很多男孩的青春,所以我並沒有過多的去打擾到她的生活,只要,我遠遠的看...

用Python爬蟲爬了世紀佳緣後發現了乙個秘密

今天在知乎上看到乙個關於 世紀佳緣找物件靠譜嗎?的討論,其中關注的人有 1903,被瀏覽了 1940753 次,355 個回答中大多數都是不靠譜。用 python 爬取世紀佳緣的資料是否能證明它的不靠譜?在 pc 端開啟世紀佳緣 搜尋 20 到 30 歲 不限地區的女朋友 翻了幾頁找到乙個 sear...

用python實現SYN Flooding攻擊

作業裡的 直接這裡copy在這裡記錄一下。在tcp ip協議中,當客戶端試著與伺服器間建立tcp連線時,正常情況下客戶端與伺服器端進行tcp三次握手 1.客戶端通過傳送syn同步 synchronize 資訊到伺服器要求建立連線。2.伺服器通過響應客戶端syn ack以抄收 acknowledge ...