初始化與參數(shù)調(diào)節(jié)面板
這一節(jié)將繪制出如下圖所示的參數(shù)調(diào)節(jié)面板
對(duì)于上圖來(lái)說(shuō),BoxSizer布局十分傻瓜,所以這里主要有兩個(gè)方面需要注意,其一是opti
和source
這兩個(gè)選項(xiàng)卡的實(shí)現(xiàn),其二則是如何同時(shí)創(chuàng)建多個(gè)滾動(dòng)條。
對(duì)于前者比較容易,無(wú)非是多用一個(gè)控件而已,即wx.NoteBook
,使用方法乏善可陳,看代碼即可學(xué)會(huì)。
對(duì)于后者當(dāng)然也可以很容易,只要無(wú)腦羅列即可,只不過(guò)對(duì)于五個(gè)不同的參數(shù)就意味著要新建五組滾動(dòng)條,要就要新建五個(gè)控制函數(shù),而這五個(gè)控制函數(shù)的功能幾乎是完全一樣的。顯然,這很愚蠢,所以我們采用了如下的辦法對(duì)代碼進(jìn)行精簡(jiǎn)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
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è)控件的目的。
分解來(lái)看,首先創(chuàng)建一個(gè)滾動(dòng)條字典
1
|
self .paraSliders = {} |
其鍵為變量名稱,值則對(duì)應(yīng)一個(gè)滾動(dòng)條控件。實(shí)現(xiàn)方式為
1
|
self .paraSliders[key] = wx.Slider(optiPanel,minValue = 1 ,maxValue = 1000 ,size = ( 200 , - 1 )) |
然后對(duì)于每個(gè)滾動(dòng)條,通過(guò)lambda
綁定事件函數(shù):
1
|
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)范圍,通過(guò)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)注服務(wù)器之家其它相關(guān)文章!
原文鏈接:https://blog.csdn.net/m0_37816922/article/details/100534642