新闻动态

Python光学仿真wxpython透镜演示系统初始化与参数调节

发布日期:2021-12-23 08:47 | 文章来源:脚本之家

初始化与参数调节面板

这一节将绘制出如下图所示的参数调节面板

对于上图来说,BoxSizer布局十分傻瓜,所以这里主要有两个方面需要注意,其一是optisource这两个选项卡的实现,其二则是如何同时创建多个滚动条。

对于前者比较容易,无非是多用一个控件而已,即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],
 '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()  #设置光学元件
 self.getRay()#计算
 self.DrawPath() #绘图

在上面的代码中,关键之处在于使用了一个lambda表达式,使得事件函数可以传入两个参数,也就完成了一次性创建多个控件的目的。

分解来看,首先创建一个滚动条字典

 self.paraSliders = {}

其键为变量名称,值则对应一个滚动条控件。实现方式为

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透镜演示系统初始化与参数调节的资料请关注本站其它相关文章!

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部