摘要:自己選擇一個好的圖像背景填充畫布注意背景圖片可根據自己的喜好進行更換,還不趕緊定制一個屬于自己的煙花秀七夕總結以上便是博主給大家的七夕節禮物了,代碼不到行,但卻完成了一個超炫的效果。完整代碼可在公眾號后臺回復七夕獲取,最后祝大家七夕節快樂。
作者:xiaoyu
微信公眾號:Python數據科學
知乎:python數據分析師
一年一度的七夕節又到了,每年重復的過,花樣各種有,很多男同胞又開始發愁了,該準備點什么呢?前一段時間非常火的電影 “西紅市首富” 突然給了我點靈感,男主全城放煙花俘獲了女主的芳心。沒錯!就是放煙花,而且要全城放。
可除了土豪,不是所有人都能在整個城市放煙花的。對于一個普通的不能再普通的我也只能想想了。雖然夢想很遙遠,不過我還沒放棄,我決定用Python來幫我實現一下這個愿望,畢竟Python是萬能的。
下面是Python實現的禮花動態效果。
Tkinter和代碼實現這個動態效果是由 Tkinter庫來完成的,屬于Python的GUI編程部分。Python提供了多個圖形開發界面的庫,常用的有Tkinter,xwPython,Jython。Tkinter是Python的標準GUI庫,內置在Python中,不需要額外安裝,對于一些簡單的圖形界面可以輕松實現。
下面是七夕節煙花效果的代碼實現,首先導入所有需要的庫:
Tkinter:最終的GUI實現;
PIL:處理圖像,在最后畫布背景中使用;
time:處理時間,完成時間生命周期的更新迭代;
random:隨機產生數字,定義燃放過程中的隨機變量;
math:數學函數方法,計算燃放移動使用;
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
然后定義一個通用的煙花顆粒的類(part),煙花顆粒的屬性如下:
id:每個煙花中顆粒的標識;
x, y: 煙花的x,y軸;
vx, vy:在x,y軸中顆粒的速度;
total:每個煙花的顆粒數量;
age:顆粒已經在背景度過的時間;
color:顏色;
cv:背景;
lifespan:顆粒將在背景持續多久;
然后在這個類中定義了煙花顆粒的一些類方法:
update:通過判斷顆粒狀態更新顆粒的生命時間;
expand:定義爆炸的時間;
alive:檢查顆粒在生命周期內是否還存在;
# 設置重力參數 GRAVITY = 0.05 # 設置隨機的顏色列表 colors = ["red", "blue", "yellow", "white", "green", "orange", "purple", "seagreen", "indigo", "cornflowerblue"] class part: 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 self.x = x self.y = y self.initial_speed = explosion_speed self.vx = vx 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 + GRAVITY * dt) self.vy += GRAVITY * dt # 如果顆超過最長持續時間,顆粒消失 elif self.cid is not None: cv.delete(self.cid) self.cid = None # 定義爆炸的時間 def expand(self): return self.age <= 1.2 # 檢查顆粒在生命周內是否還存在 def alive(self): return self.age <= self.lifespan
上面完成了一個通用的煙花顆粒類的實現,下面就開始煙花燃放的模擬循環過程:通過遞歸不斷循地在背景中產生新的煙花。
首先定義一個 simulate 模擬的函數,在函數中定了一些參數:
t:時間戳;
explode_points:煙花爆炸點列表,供后續更新使用;
num_explore:隨機的煙花數量;
然后在所有的煙花數量中循環創建所有的煙花顆粒類,當然在每次循環中顆粒類都需要設置一定的屬性參數,參數多是隨機產生:
objects:存放所有的顆粒對象;
x_cordi,y_cordi:隨機產生煙花在背景中的x,y坐標位置(50,550);
speed:隨機產生顆粒移動速度(0.5,1.5);
size:隨機產生顆粒大小(0.5,3);
color:選擇顏色隨機列表中的顏色;
total_particles:隨機產生每個煙花中所有顆粒的數量;
有了這些參數,我們就可以定義循環產生每個顆粒對象了,并將每個煙花的所有顆粒對象儲存在objects中。也就是說explore_points是列表中套列表,內層列表是每個煙花的所有顆粒對象,外層列表是所有煙花。
所有的顆粒對象完成后,就開始對每個顆粒的生命時間進行更新,且總時間設定在1.8秒以內。最后通過root遞歸使煙花可以一直在背景中燃放。
def simulate(cv): t = time() explode_points = [] wait_time = randint(10, 100) numb_explode = randint(6, 10) # 循環創建所有的煙花顆粒 for point in range(numb_explode): objects = [] x_cordi = randint(50, 550) 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 = part(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: 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, simulate, cv) def close(*ignore): """停止模擬循環,關閉窗口""" global root root.quit()
以上代碼部分均與Tkinter無關,只是定義了顆粒對象以及模擬顆粒生命周期的全過程,下面將使用Tkinter完成最終的效果。
root:Tkinter類的對象;
cv:定義了Tkinter中背景畫布對象,其中height和width參數可根據實際進行調整;
image:打開的圖像對象,圖像將被作為畫布中的背景,圖像可根據自己喜好自行選擇;
photo:使用ImageTk定義了Tkinter中的圖像對象;
然后將在畫布對象上創建一個圖像(使用定義的photo對象作為參數),最后調用Tkinter對象root進行持續不斷地simulate模擬過程。
if __name__ == "__main__": root = tk.Tk() cv = tk.Canvas(root, height=600, width=600) # 自己選擇一個好的圖像背景填充畫布 image = Image.open("image.jpg") photo = ImageTk.PhotoImage(image) cv.create_image(0, 0, image=photo, anchor="nw") cv.pack() root.protocol("WM_DELETE_WINDOW", close) root.after(100, simulate, cv) root.mainloop()
注意:背景圖片可根據自己的喜好進行更換,還不趕緊定制一個屬于自己的煙花秀?七夕總結
以上便是博主給大家的七夕節禮物了,代碼不到100行,但卻完成了一個超炫的GUI效果。完整代碼可在公眾號后臺回復 “七夕” 獲取,最后祝大家七夕節快樂。
https://github.com/tuangauss/...
關注微信公眾號:Python數據科學,發現更多精彩內容。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42258.html
摘要:讓我們來提示能力吧,最后會有安利詩句和視頻哦,溫馨屬于我們每個不放棄自我的人。自己選擇一個好的圖像背景填充畫布最終效果安利熱愛生命我不去想,是否能夠成功,既然選擇了遠方,便只顧風雨兼程。 紐約時間比加州時間早三個小時,New York is 3 hours ahead of California但加州時間并沒有變慢。but it does not make California slo...
摘要:復雜系統仿真的微博客虛假信息擴散模型研究面向影子分析的社交媒體競爭情報搜集面向人機協同的移動互聯網政務門戶探析經驗證。微博客的企業競爭情報搜集移動社交媒體用戶隱私保護對策研究注意這里的提示,原先的個文件沒有被再次抽取,只有個新文件被抽取。 showImg(https://segmentfault.com/img/bVbiU7y?w=1000&h=508); 本文為你展示,如何用Pyth...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
閱讀 2101·2021-11-18 10:02
閱讀 2849·2021-09-04 16:41
閱讀 1141·2019-08-30 15:55
閱讀 1405·2019-08-29 17:27
閱讀 1067·2019-08-29 17:12
閱讀 2534·2019-08-29 15:38
閱讀 2853·2019-08-29 13:02
閱讀 2829·2019-08-29 12:29