Python光学仿真wxpython透镜演示系统初始化与参数调节
初始化与参数调节面板
这一节将绘制出如下图所示的参数调节面板
对于上图来说,BoxSizer布局十分傻瓜,所以这里主要有两个方面需要注意,其一是opti
和source
这两个选项卡的实现,其二则是如何同时创建多个滚动条。
对于前者比较容易,无非是多用一个控件而已,即wx.NoteBook
,使用方法乏善可陈,看代码即可学会。
对于后者当然也可以很容易,只要无脑罗列即可,只不过对于五个不同的参数就意味着要新建五组滚动条,要就要新建五个控制函数,而这五个控制函数的功能几乎是完全一样的。显然,这很愚蠢,所以我们采用了如下的办法对代码进行精简。
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], 'xPhttp://www.cppcns.comos':[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() #设置光学元件 self.getRay() #计算 self.DrawPath() #绘图
在上面的代码中,关键之处在于使用了一个lambda
表达式,使得事件函数可以传入两个参数,也就完成了一次性创建多个控件的目的。
分解来看,首先创建一个滚动条字典
self.pa编程客栈raSliders编程客栈 = {}
其键为变量名称,值则对应一个滚动条控件。实现方式为
self.paraSliders[key]=wx.Slider(optiPanel,minValue=1,maxValue=1000,size=(200,-1))
然后对于每个滚动条,通过lambda
绑定事件函数:
self.paraSliders[key].Bind(wx.EVT_SCROLL,lambda evt,mark=key: self.OnSliderScroll(evt,mark))
其中,wx.EVT_SCROLL
为滚动事件,lambda方法将evt和mark分别传入到事件函数self.OnSliderScroll(evt,mark)
中,其中mark的值即为当前的键值。
最后,将滚动条压入到Boxsizer中。
在其调用的OnSliderScroll中,首先定义参数字典,从而确定了不同滚动条的滚动范围,通过mark值,使得参数和滚动条能够一一对应。然后然后设置成员变量self.optiDict
以及self.sourceDict
。
以上就是python光学仿真wxpython透镜演示系统初始化与参数调节的详细内容,更多关于wxpython透镜演示系统初始化与参数调节的资料请关注我们其它相关文章!
精彩评论