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

 更新时间:2021年10月19日 14:50:26   作者:微小冷  
这篇文章主要为大家介绍了Python光学仿真wxpython透镜演示系统的初始化与参数调节,同样在学习wxpython透镜演示系统的入门同学可以借鉴参考下,希望能够有所帮助

初始化与参数调节面板

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

在这里插入图片描述

对于上图来说,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透镜演示系统初始化与参数调节的资料请关注脚本之家其它相关文章!

相关文章

  • python 标准库原理与用法详解之os.path篇

    python 标准库原理与用法详解之os.path篇

    os.path模块主要用于文件的属性获取,在编程中经常用到,本文将带你熟悉这个模块并掌握它的用法,感兴趣的朋友跟小编来看看吧
    2021-10-10
  • TensorFlow保存TensorBoard图像操作

    TensorFlow保存TensorBoard图像操作

    这篇文章主要介绍了TensorFlow保存TensorBoard图像操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python邮件中附加文字、html、图片、附件实现方法

    python邮件中附加文字、html、图片、附件实现方法

    在本篇文章里小编给大家整理了一篇关于python邮件中附加文字、html、图片、附件实现方法,有兴趣的朋友们跟着学习下。
    2021-01-01
  • 使用Python开发一个图像标注与OCR识别工具

    使用Python开发一个图像标注与OCR识别工具

    这篇文章主要介绍了一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用 OCR 对标注区域进行文本识别,并将结果保存为 Excel 文件,感兴趣的可以了解下
    2025-03-03
  • Python操作mongodb数据库的方法详解

    Python操作mongodb数据库的方法详解

    这篇文章主要介绍了Python操作mongodb数据库的方法,结合实例形式详细分析了Python下载、安装pymongo及操作MongoDB数据库相关实现技巧,需要的朋友可以参考下
    2018-12-12
  • Python中经常使用的代码片段

    Python中经常使用的代码片段

    大家好,本篇文章主要讲的是Python中经常使用的代码片段,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • 使用Pandas的ExcelWriter操作excel的方法

    使用Pandas的ExcelWriter操作excel的方法

    这篇文章主要介绍了使用Pandas的ExcelWriter操作excel的方法,ExcelWriter这个插件有个坑,就是已经设置好的格式是无法更改的,因此,由pandas转成excel的时候,必须将格式清除,尤其是表头的格式需要大家多多注意,本文结合示例代码讲解的非常详细,需要的朋友参考下吧
    2023-11-11
  • python检测服务器端口代码实例

    python检测服务器端口代码实例

    这篇文章主要介绍了python检测服务器端口代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Python计算质数的方法总结

    Python计算质数的方法总结

    质数(Prime Number)是指大于1且只能被1和自身整除的正整数,计算质数是数论中的一个经典问题,本文将介绍python中多种计算质数的方法,希望对大家有所帮助
    2023-11-11
  • 用Python的Django框架来制作一个RSS阅读器

    用Python的Django框架来制作一个RSS阅读器

    这篇文章主要介绍了用Python的Django框架来制作一个RSS阅读器,通过url feeds来制作订阅类应用同样是Django之所长,需要的朋友可以参考下
    2015-07-07

最新评论