Python光學(xué)仿真wxpython透鏡演示系統(tǒng)初始化與參數(shù)調(diào)節(jié)
初始化與參數(shù)調(diào)節(jié)面板
這一節(jié)將繪制出如下圖所示的參數(shù)調(diào)節(jié)面板
對(duì)于上圖來說,BoxSizer布局十分傻瓜,所以這里主要有兩個(gè)方面需要注意,其一是opti
和source
這兩個(gè)選項(xiàng)卡的實(shí)現(xiàn),其二則是如何同時(shí)創(chuàng)建多個(gè)滾動(dòng)條。
對(duì)于前者比較容易,無非是多用一個(gè)控件而已,即wx.NoteBook
,使用方法乏善可陳,看代碼即可學(xué)會(huì)。
對(duì)于后者當(dāng)然也可以很容易,只要無腦羅列即可,只不過對(duì)于五個(gè)不同的參數(shù)就意味著要新建五組滾動(dòng)條,要就要新建五個(gè)控制函數(shù),而這五個(gè)控制函數(shù)的功能幾乎是完全一樣的。顯然,這很愚蠢,所以我們采用了如下的辦法對(duì)代碼進(jìn)行精簡(jiǎn)。
def InitPanel(self): self.drawPanel = wx.Panel(self) #繪圖面板 #########初始化paraBook paraBook = wx.Notebook(self,size=(300,-1)) optiPanel = wx.Panel(paraBook) sourcePanel = wx.Panel(paraBook) paraBook.AddPage(optiPanel,'opti') paraBook.AddPage(sourcePanel,'source') ###需要初始化edge self.setEdge() ####################optiBox################### self.paraSliders = {} optiBox = wx.BoxSizer(wx.VERTICAL) for key in self.optiDict: self.paraSliders[key]=wx.Slider( optiPanel,minValue=1,maxValue=1000,size=(200,-1)) self.paraSliders[key].Bind(wx.EVT_SCROLL, lambda evt,mark=key: self.OnSliderScroll(evt,mark)) optiBox.Add(self.paraSliders[key],proportion=1, flag=wx.LEFT|wx.CENTER) optiBox.Add(wx.StaticText(optiPanel,size=(120,30),label=key, style=wx.ALIGN_RIGHT),proportion=1, flag=wx.ALIGN_CENTER, border=10) self.testFlag = wx.TextCtrl( optiPanel,size=(250,400),value='hellos',style=wx.TE_MULTILINE) optiBox.Add(self.testFlag,proportion=1, flag=wx.ALIGN_CENTER|wx.ALL|wx.ALIGN_RIGHT,border=0) optiPanel.SetSizer(optiBox) ####################sourceBox################### sourceBox = wx.BoxSizer(wx.VERTICAL) for key in self.sourceDict: self.paraSliders[key]=wx.Slider( sourcePanel,minValue=1,maxValue=1000,size=(200,-1)) self.paraSliders[key].Bind(wx.EVT_SCROLL, lambda evt,mark=key: self.OnSliderScroll(evt,mark)) sourceBox.Add(self.paraSliders[key],proportion=1, flag=wx.LEFT|wx.CENTER) sourceBox.Add(wx.StaticText(sourcePanel,size=(120,30),label=key, style=wx.ALIGN_RIGHT),proportion=1, flag=wx.ALIGN_CENTER, border=10) sourcePanel.SetSizer(sourceBox) mainBox = wx.BoxSizer() mainBox.Add(self.drawPanel,proportion=1,flag=wx.ALL|wx.EXPAND,border=10) mainBox.Add(paraBook,proportion=0,flag=wx.ALL|wx.EXPAND,border=10) self.SetSizer(mainBox) def OnSliderScroll(self,evt,mark): paraArea = {'ySource':[-300,300],'xSource':[0,1000], 'xPos':[0,1200],'Diameter':[0,500], 'lFocal':[-1000,1000],'rFocal':[-1000,1000], 'theta':[0,np.pi*2],'nOpti':[0.1,10]} pValue = self.paraSliders[mark].GetValue() pMin,pMax=paraArea[mark] if mark in self.optiDict: self.optiDict[mark] = pMin+(pMax-pMin)/1000*pValue elif mark in self.sourceDict: self.sourceDict[mark]=pMin+(pMax-pMin)/1000*pValue pStr = '' for key in self.optiDict: pStr += key+':'+str(self.optiDict[key])+'\n' self.setEdge() #設(shè)置光學(xué)元件 self.getRay() #計(jì)算 self.DrawPath() #繪圖
在上面的代碼中,關(guān)鍵之處在于使用了一個(gè)lambda
表達(dá)式,使得事件函數(shù)可以傳入兩個(gè)參數(shù),也就完成了一次性創(chuàng)建多個(gè)控件的目的。
分解來看,首先創(chuàng)建一個(gè)滾動(dòng)條字典
self.paraSliders = {}
其鍵為變量名稱,值則對(duì)應(yīng)一個(gè)滾動(dòng)條控件。實(shí)現(xiàn)方式為
self.paraSliders[key]=wx.Slider(optiPanel,minValue=1,maxValue=1000,size=(200,-1))
然后對(duì)于每個(gè)滾動(dòng)條,通過lambda
綁定事件函數(shù):
self.paraSliders[key].Bind(wx.EVT_SCROLL,lambda evt,mark=key: self.OnSliderScroll(evt,mark))
其中,wx.EVT_SCROLL
為滾動(dòng)事件,lambda方法將evt和mark分別傳入到事件函數(shù)self.OnSliderScroll(evt,mark)
中,其中mark的值即為當(dāng)前的鍵值。
最后,將滾動(dòng)條壓入到Boxsizer中。
在其調(diào)用的OnSliderScroll中,首先定義參數(shù)字典,從而確定了不同滾動(dòng)條的滾動(dòng)范圍,通過mark值,使得參數(shù)和滾動(dòng)條能夠一一對(duì)應(yīng)。然后然后設(shè)置成員變量self.optiDict
以及self.sourceDict
。
以上就是Python光學(xué)仿真wxpython透鏡演示系統(tǒng)初始化與參數(shù)調(diào)節(jié)的詳細(xì)內(nèi)容,更多關(guān)于wxpython透鏡演示系統(tǒng)初始化與參數(shù)調(diào)節(jié)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python numpy數(shù)組中的復(fù)制知識(shí)解析
這篇文章主要介紹了python numpy數(shù)組中的復(fù)制知識(shí)解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02Pythony運(yùn)維入門之Socket網(wǎng)絡(luò)編程詳解
這篇文章主要介紹了Pythony運(yùn)維入門之Socket網(wǎng)絡(luò)編程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-045種Python統(tǒng)計(jì)次數(shù)方法技巧
這篇文章主要給大家分享的是5種Python統(tǒng)計(jì)次數(shù)方法技巧,文章主要包括字典 dict 統(tǒng)計(jì)、collections.defaultdict 統(tǒng)計(jì)、List count方法、集合(set)和列表(list)統(tǒng)計(jì)、collections.Counter方法,感興趣的小伙伴一起進(jìn)入下面文章內(nèi)容吧2021-11-11詳解Python常用標(biāo)準(zhǔn)庫(kù)之os模塊與shutil模塊
os系統(tǒng)模塊與shutil文件操作模塊是Python常用的標(biāo)準(zhǔn)庫(kù),本文將通過示例詳細(xì)講解一下二者的使用,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-06-06解決python 未發(fā)現(xiàn)數(shù)據(jù)源名稱并且未指定默認(rèn)驅(qū)動(dòng)程序的問題
今天小編就為大家分享一篇解決python 未發(fā)現(xiàn)數(shù)據(jù)源名稱并且未指定默認(rèn)驅(qū)動(dòng)程序的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12