Python光学仿真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透镜演示系统初始化与参数调节的资料请关注我们其它相关文章!

(0)

相关推荐

  • python之wxPython菜单使用详解

    本文实例讲述了python中wxPython菜单的使用方法,分享给大家供大家参考.具体如下: 先来看看下面这段代码: import wx APP_EXIT=1 #定义一个控件ID class Example(wx.Frame): def __init__(self, parent, id, title): super(Example,self).__init__(parent, id, title) #调用你类的初始化 self.InitUI() #调用自身的函数 def InitUI(self

  • python之wxPython应用实例

    本文实例讲述了python之wxPython的使用方法,分享给大家供大家参考.具体方法如下: 先来看看效果,这里加载一张图片: 代码如下: #!/usr/bin/env python """hello wxPython program""" import wx class Frame(wx.Frame): #wxPrame subclass """Frame class that display a image&qu

  • wxpython布局的实现方法

    我们目前已经学会了四个控件,也编出了几个窗口实例,它们都有一个共同的特点,就是丑,主要原因是没有进行合理地布局. 此前的布局方式简单粗暴,即明确规定每个控件的大小和位置,从而使之固定.这种布局方式可称之为绝对定位布局,缺点是控件尺寸固定,并不会随着窗口的放缩而同步变化.而且所有的控件都处于同一层次中,逻辑混乱,难于修改. 一个比较初级但很直观的想法是,我们可不可以按照比例来调整控件的布局?我等菜鸟所能想到的需求,彼等大佬自然早已解决,BoxSizer便是为此而生. 我们可以将BoxSizer理解

  • wxPython 入门教程

    这篇文章是关于 wxPython,但 wxPython 实际是两件事物的组合体:Python 脚本语言和 GUI 功能的 wxWindows 库(关于 wxWindows 的介绍,请参阅 developerWorks上的 "细述 wxWindows" ).wxWindows 库是为了最大可移植性的 C/C++ 库,而抽取 GUI 功能.所以 wxWindows 应用程序与生俱来地可以运行在 Windows.带 X.KDE 或 Gnome 的 UNIX 或者 wxWindows 已移植到

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

    初始化与参数调节面板 这一节将绘制出如下图所示的参数调节面板 对于上图来说,BoxSizer布局十分傻瓜,所以这里主要有两个方面需要注意,其一是opti和source这两个选项卡的实现,其二则是如何同时创建多个滚动条. 对于前者比较容易,无非是多用一个控件而已,即wx.NoteBook,使用方法乏善可陈,看代码即可学会. 对于后者当然也可以很容易,只要无脑罗列即可,只不过对于五个不同的参数就意味着要新建五组滚动条,要就要新建五个控制函数,而这五个控制函数的功能几乎是完全一样的.显然,这很愚蠢,所

  • Python光学仿真wxpython透镜演示系统计算与绘图

    目录 计算与绘图 计算与绘图 这里的计算主要包括两个部分,分别是通过滚动条的参数得到光学器件的特征,这一点此前已经备述.其二则是光在传播过程中所产生的各种行为,反射折射函数也都已经讲过了,需要注意的就是确定边界. def getRay(self): self.rays,self.abcs,self.dots = [[],[],[]] sDot = self.source #光源为第一个点 sRay = rp.getABC(self.sourceDict['theta'],sDot) inPoin

  • Python光学仿真wxpython透镜演示系统框架

    透镜演示系统 框架 现在,我们可以做一个具备友好界面的透镜演示系统了.我们需要两个圆弧来表示透镜,一条线段表示主光轴,多条线段表示光线的传播路径.此外,还需要对光源和透镜的参数进行调节. 然而值得注意的一点是,我们在进行计算和画图过程中所用到的几何图形,在表达形式以及操作流程上可能并不相同.例如,对于光源发出的一条射线,它与透镜的作用流程为 寻找与透镜前表面的交点A 获取反射和透射直线 寻找透射直线与透镜后表面的交点B 计算透过透镜的直线 然而对于画图程序来说,光源S和A之间有一条线段,A和B之

  • Python光学仿真wxpython之DC绘图

    一般来说,系统与绘图程序之间的信息交换是由图形设备接口(Graphics Device Interface,GDI)实现的,在wxpython中,通过device context(DC)对象来实现GDI的功能. DC对象的创建非常简单,只需引用wx.PaintDC即可,而后则可通过dc来设置画笔dc.SetPen,有了画笔,就可以进行图形绘制了.于是,我们再考虑到图形的属性,包括形状.颜色与边框等,更细致地说,是图形形状.填充颜色.边框类型.边框颜色. 我们可以通过一个矩形的例子来说明: 上面的

  • python光学仿真学习wxpython创建手速测试程序

    滚动条是什么大家自然都是知道的,可以非常直观地显示数据的变化,或者可以非常方便地改变某些数值. 此前在介绍按钮.静态文本.输入文本这三个控件时,相对来说比较乏味,所以这次我们采用需求引导的模式.假如想编写一个软件用来检测打字速度,同时能够非常直观地通过滚动条来显示出来,应该怎么写? 我们大致需要三个控件,文本输入控件用来输入文字:静态文本控件用于显示速度:滚动条用来动态地显示速度.同时,还需要知道系统的时间,总之,代码如下 import wx import time #时间模块 class te

  • Python光学仿真教程实现光线追踪

    目录 光线追迹 几何抽象 光线 线段与圆弧 光线追迹 得益于计算机的计算的能力,通过追踪具有代表性的光线的传播轨迹,可以更加精确地描述光学系统的性能,光线追迹方法也因此大展其能,诸如Zemax.tracepro等软件便都提供了相应的功能. 而建立在折射定律基础之上的光线追迹方法,对数学功底要求较低,所以比较适合作为python初学者的入门项目.在接下来的这一章,希望通过对光线追迹的实现,掌握python中的列表.元组.字典.集合等数据类型的基本概念,并且对面向对象与函数式编程有一个基本的了解.

  • python光学仿真实现光线追迹之空间关系

    目录 空间关系 相交判定 射线排序 线弧关系 点弧关系 空间关系 变化始于相遇,所以交点是一切的核心. 相交判定 首先考察一束光线能否打在某个平面镜上.光线被抽象成了一个列表[a,b,c],平面镜则被抽象成为由两个点构成的线段[(x1,y1),(x2,y2)].两条直线的交点问题属于初等数学范畴,需要先将线段转换成直线的形式,然后再求交点.但是两条直线的交点可能落在线段的外面,从而不具有判定的意义. 如果我们的光学系统中有大量的光学元件,那么如果有一种方法可以快速判断光线是否与光学元件有交点,将

  • python光学仿真面向对象光学元件类的实现

    光学元件类 平面反射镜是一种极为简单的模型,因为我们只需要考虑一个平面即可.但是除此之外的其他光学元件,可能会变得有些复杂:我们必须考虑光在入射面和出射面的行为. 这当然是一句废话,而且我们也有了一个初步的解决方案:将光学元件拆成前表面和后表面即可.如果光需要在光学元件中反射多次,那就将光学元件拆成需要反射次数的表面个数即可,完美而无脑. 这说明我们已经熟悉了程序员的思维,我们眼中的世界已经不再是一个所见即所得的世界,我们看到的是一个个抽象零部件的表现.但是也不要惊慌,程序员和正常人也未必有很大

  • Python光学仿真光的偏振编程理解学习

    目录 光的偏振 光的偏振 由于光波是横波,所以对于任意一个光波,其振幅方向与传播方向在一个固定的平面内.换言之,一束光波可以存在振幅方向不同的一群光波,对于其中一个光波而言,其振幅方向即为偏振方向. 可以画出其示意图 #偏振光演示 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D as axd def polarShow(): z = np.arange(0,5,0

  • Python光学仿真之对光的干涉理解学习

    光的干涉 干涉即两束光在叠加过程中出现的强度周期性变化情况,其最简单的案例即为杨氏双缝干涉. 如图所示,光从 S S S点发出,通过两个狭缝 S 1 , S 2 S_1,S_2 S1​,S2​,最终汇聚在右侧的干涉屏上,在不同位置处将会产生不同的相位差. import numpy as np import matplotlib.pyplot as plt #两束光叠加 waveAdd = lambda I1,I2,theta : I1+I2+2*np.sqrt(I1*I2)*np.cos(the

随机推荐