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