基于Python實現(xiàn)四維圖像繪制系統(tǒng)
動圖繪制系統(tǒng)的實現(xiàn)
所謂動圖繪制,其實只需要一個循環(huán),并且每次繪圖之前,要有一定的延時。啟用多線程和延時,需要導入下面兩個模塊
from threading import Thread import time
接下來,就是self.btnAniStart函數(shù)和具體的動圖繪制函數(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)
點擊播放按鈕后效果如下
播放控制
從圖像播放的角度來說,這個設計并不十分合理,因為點擊播放的三角號之后,應該要給出一個停止播放的按鈕,相應地DrawCycle函數(shù)也應該新增一個無盡循環(huán)模式。
為了實現(xiàn)播放控制,為播放按鈕綁定一個可變字符串
self.btnStartText = tk.StringVar() self.btnStartText.set("?") ttk.Button(frm, width=3, textvariable=self.btnStartText, command=self.btnAniStart).pack(**pDct)
然后修改btnAniStart,大致改成下面的形式,但這里只是添加了暫停的邏輯,但并沒有真正實現(xiàn)暫停的功能
def btnAniStart(self): if self.btnStartText.get() == "?": Thread(target=self.drawCycle, daemon=True).start() self.btnStartText.set("?") else: self.btnStartText.set("?")
而真正實現(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)
至此,就完成了一個動態(tài)圖像繪制系統(tǒng)。
接口優(yōu)化
開發(fā)過程中會經(jīng)常遇到新增的需求,這些需求的實現(xiàn),會對原來的設計形成干擾,而且這些需求累加在一起,會導致代碼變得十分畸形。比如一開始DrawType類只包含繪圖類型和維度,所以在AxisList中做對象的時候,變量名取為drawTypeDim。但后來DrawType又加入了其他功能,使得drawTypeDim這個變量變得很蠢,所以接下來要重新命名。
主要變更如下
1.AxisList類
drawTypeDim 變?yōu)?drawType
2.DrawSystem類
drawTypeDim 變?yōu)?drawType
3.AxisList類中定義的函數(shù),但DrawSystem中有調(diào)用
getDrawType -> getType
getDrawDim -> getDim
另外,由于t軸和xyz在繪圖時的作用相去甚遠,所以將getDim函數(shù)拆分成xyz和t兩個函數(shù)。在AxisList中新增兩個函數(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é)
目前,這個繪圖系統(tǒng)可以繪制二維Plot,三維Plot,極坐標Plot,而且支持子圖的繪制。而今又添加了動態(tài)圖形的繪制功能。
盡管從目前來說,這段程序稱不上是一個完備的軟件,因為這里沒有基本的報錯系統(tǒng),也沒有日志管理系統(tǒng),但作為一個快速入門的基礎項目來說,卻是非常適宜的。同時,這個系統(tǒng)已經(jīng)具備了初步的骨架,基于這套代碼,可以進一步實現(xiàn)更加復雜的繪圖功能,換言之,從極客的角度來說,這個繪圖系統(tǒng)已經(jīng)具備了“可玩性”。
這個項目雖然體量很小,目前只有不到500行代碼,但對于一個0到5年碼零的Pythoner來說,看了必會有所得。
到此這篇關于基于Python實現(xiàn)四維圖像繪制系統(tǒng)的文章就介紹到這了,更多相關Python四維圖像內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python實現(xiàn)批量壓縮文件/文件夾zipfile的使用
本文主要介紹了Python實現(xiàn)批量壓縮文件/文件夾zipfile的使用,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09