春節的腳步越來越近了,每逢春節很多地方都會燃放煙花來增添節日的氣氛,然而因環境汙染的加劇,近年來不少地方已經禁止燃放煙花了,為了彌補這個遺憾,本文我們來看一下如何使用 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 ...