利用Python寫一場新年煙花秀
更新時間:2022年01月04日 09:35:08 作者:?Python小二?
這篇文章主要介紹了利用Python寫一場新年煙花秀,可以送給朋友還可以當(dāng)作練習(xí),Python 模塊包括:tkinter、PIL、time、random、math,下面來看一下代碼實現(xiàn),需要的朋友可以參考一下
我們用到的 Python 模塊包括:tkinter、PIL、time、random、math,如果第三方模塊沒有裝的話,pip install 一下即可,下面看一下代碼實現(xiàn)。
1.導(dǎo)庫
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 ? ? ? ? # 綻放的粒子數(shù) ? ? ? ? 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 ? ? # 更新數(shù)據(jù) ? ? 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 ? ? # 檢查粒子是否仍在生命周期內(nèi) ? ? def alive(self): ? ? ? ? return self.age <= self.lifespan
4.燃放煙花
def ignite(cv): ? ? t = time() ? ? # 煙花列表 ? ? explode_points = [] ? ? wait_time = randint(10, 100) ? ? # 爆炸的個數(shù) ? ? 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) ? ? ? ? # 爆炸的粒子數(shù)半徑 ? ? ? ? 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 秒時間幀內(nèi)保持更新 ? ? 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()看一下效果:

相關(guān)文章
Pytorch矩陣乘法(torch.mul() 、 torch.mm() 和torch.m
在深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)的世界里,矩陣乘法是一項至關(guān)重要的操作,本文主要介紹了Pytorch矩陣乘法,包含了torch.mul() 、 torch.mm() 和torch.matmul()的區(qū)別,具有一定的參考價值,感興趣的可以了解一下2024-03-03
Python操作mysql數(shù)據(jù)庫實現(xiàn)增刪查改功能的方法
這篇文章主要介紹了Python操作mysql數(shù)據(jù)庫實現(xiàn)增刪查改功能的方法,涉及Python針對mysql數(shù)據(jù)庫的連接、增刪改查等相關(guān)操作技巧,需要的朋友可以參考下2018-01-01
Python requests HTTP驗證登錄實現(xiàn)流程
這篇文章主要介紹了Python requests HTTP驗證登錄實現(xiàn)流程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
7個關(guān)于Python的經(jīng)典基礎(chǔ)案例
這篇文章主要給大家分享 7個關(guān)于Python的經(jīng)典基礎(chǔ)案例,列表排序、調(diào)換字典鍵值、刪除列表中的重復(fù)元素、輸出質(zhì)數(shù)、判斷是一年中第幾天、猜數(shù)字、進制轉(zhuǎn)換;,需要的朋友可以參考一下2021-11-11

