基于Python實(shí)現(xiàn)四維圖像繪制系統(tǒng)
動(dòng)圖繪制系統(tǒng)的實(shí)現(xiàn)
所謂動(dòng)圖繪制,其實(shí)只需要一個(gè)循環(huán),并且每次繪圖之前,要有一定的延時(shí)。啟用多線程和延時(shí),需要導(dǎo)入下面兩個(gè)模塊
from threading import Thread import time
接下來,就是self.btnAniStart函數(shù)和具體的動(dòng)圖繪制函數(shù)了
def btnAniStart(self):
Thread(target=self.btnDrawCycle, daemon=True).start()
def btnDrawCycle(self):
dt = self.aniDelay.get()/1000.0
for i in range(self.aniFrameNum.get()):
self.tIndex = i
self.btnDrawImg()
time.sleep(dt)點(diǎn)擊播放按鈕后效果如下

播放控制
從圖像播放的角度來說,這個(gè)設(shè)計(jì)并不十分合理,因?yàn)辄c(diǎn)擊播放的三角號(hào)之后,應(yīng)該要給出一個(gè)停止播放的按鈕,相應(yīng)地DrawCycle函數(shù)也應(yīng)該新增一個(gè)無盡循環(huán)模式。
為了實(shí)現(xiàn)播放控制,為播放按鈕綁定一個(gè)可變字符串
self.btnStartText = tk.StringVar()
self.btnStartText.set("?")
ttk.Button(frm, width=3, textvariable=self.btnStartText,
command=self.btnAniStart).pack(**pDct)然后修改btnAniStart,大致改成下面的形式,但這里只是添加了暫停的邏輯,但并沒有真正實(shí)現(xiàn)暫停的功能
def btnAniStart(self):
if self.btnStartText.get() == "?":
Thread(target=self.drawCycle, daemon=True).start()
self.btnStartText.set("?")
else:
self.btnStartText.set("?")而真正實(shí)現(xiàn)暫停功能,就需要修改drawCycle函數(shù)了
def drawCycle(self):
dt = self.aniDelay.get()/1000.0
num = self.aniFrameNum.get()
while self.btnStartText.get() == "?":
self.tIndex = (self.tIndex + 1) % num
self.btnDrawImg()
time.sleep(dt)
至此,就完成了一個(gè)動(dòng)態(tài)圖像繪制系統(tǒng)。
接口優(yōu)化
開發(fā)過程中會(huì)經(jīng)常遇到新增的需求,這些需求的實(shí)現(xiàn),會(huì)對(duì)原來的設(shè)計(jì)形成干擾,而且這些需求累加在一起,會(huì)導(dǎo)致代碼變得十分畸形。比如一開始DrawType類只包含繪圖類型和維度,所以在AxisList中做對(duì)象的時(shí)候,變量名取為drawTypeDim。但后來DrawType又加入了其他功能,使得drawTypeDim這個(gè)變量變得很蠢,所以接下來要重新命名。
主要變更如下
1.AxisList類
drawTypeDim 變?yōu)?drawType
2.DrawSystem類
drawTypeDim 變?yōu)?drawType
3.AxisList類中定義的函數(shù),但DrawSystem中有調(diào)用
getDrawType -> getType
getDrawDim -> getDim
另外,由于t軸和xyz在繪圖時(shí)的作用相去甚遠(yuǎn),所以將getDim函數(shù)拆分成xyz和t兩個(gè)函數(shù)。在AxisList中新增兩個(gè)函數(shù)
def getXYZ(self):
return self.getDim().replace("t", "")
def hasTimeAxis(self):
return "t" in self.getDim()更改DrawSystem中的調(diào)用, btnDrawImg 中 al.getDim().replace('t',"") 改為 al.getXYZ() ; readDatas 改寫如下
def readDatas(self, al):
dct = {}
data = {}
if al.hasTimeAxis():
data['t'] = al.setData('t')
dct['t'] = data['t'][self.tIndex]
for flag in al.getXYZ():
data[flag] = al.setData(flag, **dct)
dct[flag] = data[flag]
return data總結(jié)
目前,這個(gè)繪圖系統(tǒng)可以繪制二維Plot,三維Plot,極坐標(biāo)Plot,而且支持子圖的繪制。而今又添加了動(dòng)態(tài)圖形的繪制功能。
盡管從目前來說,這段程序稱不上是一個(gè)完備的軟件,因?yàn)檫@里沒有基本的報(bào)錯(cuò)系統(tǒng),也沒有日志管理系統(tǒng),但作為一個(gè)快速入門的基礎(chǔ)項(xiàng)目來說,卻是非常適宜的。同時(shí),這個(gè)系統(tǒng)已經(jīng)具備了初步的骨架,基于這套代碼,可以進(jìn)一步實(shí)現(xiàn)更加復(fù)雜的繪圖功能,換言之,從極客的角度來說,這個(gè)繪圖系統(tǒng)已經(jīng)具備了“可玩性”。
這個(gè)項(xiàng)目雖然體量很小,目前只有不到500行代碼,但對(duì)于一個(gè)0到5年碼零的Pythoner來說,看了必會(huì)有所得。
到此這篇關(guān)于基于Python實(shí)現(xiàn)四維圖像繪制系統(tǒng)的文章就介紹到這了,更多相關(guān)Python四維圖像內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python跨平臺(tái)識(shí)別周圍WiFi的代碼實(shí)現(xiàn)與技巧分享
在物聯(lián)網(wǎng)設(shè)備管理、網(wǎng)絡(luò)安全審計(jì)或智能家居場(chǎng)景中,識(shí)別周圍WiFi網(wǎng)絡(luò)是基礎(chǔ)需求,Python憑借其豐富的生態(tài)庫(kù),能夠跨平臺(tái)實(shí)現(xiàn)WiFi掃描、信號(hào)強(qiáng)度檢測(cè)及網(wǎng)絡(luò)分析,本文將系統(tǒng)梳理主流方法,幫助開發(fā)者快速構(gòu)建可靠的WiFi識(shí)別工具,需要的朋友可以參考下2026-01-01
python使用pynput捕獲單個(gè)按鍵的步驟詳解(包括組合鍵和功能鍵)
在數(shù)字時(shí)代,鍵盤是與計(jì)算機(jī)交流的主要工具,鍵盤的每一次敲擊都承載著信息,而在某些場(chǎng)景下,可能需要記錄這些信息,這時(shí)候,pynput庫(kù)就派上了大用場(chǎng),它可以輕松地幫捕獲并記錄鍵盤上的每一個(gè)操作,所以本文給大家介紹了python使用pynput捕獲鍵的操作步驟2024-05-05
利用python實(shí)現(xiàn)xml與數(shù)據(jù)庫(kù)讀取轉(zhuǎn)換的方法
這篇文章主要給大家介紹了關(guān)于利用python實(shí)現(xiàn)xml與數(shù)據(jù)庫(kù)讀取轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-06-06
Python使用python-pptx實(shí)現(xiàn)設(shè)置PPT頁(yè)面與文檔屬性
這篇文章主要為大家詳細(xì)介紹了Python如何使用python-pptx實(shí)現(xiàn)設(shè)置PPT頁(yè)面與文檔屬性,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2026-04-04
Python處理JSON時(shí)的值報(bào)錯(cuò)及編碼報(bào)錯(cuò)的兩則解決實(shí)錄
這篇文章主要介紹了Python處理JSON時(shí)的值報(bào)錯(cuò)及編碼報(bào)錯(cuò)的兩則解決實(shí)錄,在這里還是想建議一下使用Python 3.x版本,Python 3默認(rèn)的Unicode編碼能在實(shí)際使用中為我們省去不少問題,需要的朋友可以參考下2016-06-06
利用python在Word文檔中創(chuàng)建和執(zhí)行條件郵件合并
郵件合并域和IF域是Word文檔中兩種非常實(shí)用的域,前者可以用來進(jìn)行郵件合并,根據(jù)數(shù)據(jù)批量創(chuàng)建定制的Word文檔,本文講介紹如何使用Python在Word文檔中創(chuàng)建條件郵件合并域以及執(zhí)行條件郵件合并,需要的朋友可以參考下2024-08-08
conda與jupyter notebook kernel核環(huán)境不一致的問題解決
本文記錄在使用conda時(shí)候出現(xiàn)的問題,jupter notebook中的環(huán)境不一致導(dǎo)致的,具有一定的參考價(jià)值,感興趣的可以了解一下2023-05-05

