欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python光學仿真wxpython透鏡演示系統(tǒng)初始化與參數(shù)調(diào)節(jié)

 更新時間:2021年10月19日 14:50:26   作者:微小冷  
這篇文章主要為大家介紹了Python光學仿真wxpython透鏡演示系統(tǒng)的初始化與參數(shù)調(diào)節(jié),同樣在學習wxpython透鏡演示系統(tǒng)的入門同學可以借鑒參考下,希望能夠有所幫助

初始化與參數(shù)調(diào)節(jié)面板

這一節(jié)將繪制出如下圖所示的參數(shù)調(diào)節(jié)面板

在這里插入圖片描述

對于上圖來說,BoxSizer布局十分傻瓜,所以這里主要有兩個方面需要注意,其一是optisource這兩個選項卡的實現(xiàn),其二則是如何同時創(chuàng)建多個滾動條。

對于前者比較容易,無非是多用一個控件而已,即wx.NoteBook,使用方法乏善可陳,看代碼即可學會。

對于后者當然也可以很容易,只要無腦羅列即可,只不過對于五個不同的參數(shù)就意味著要新建五組滾動條,要就要新建五個控制函數(shù),而這五個控制函數(shù)的功能幾乎是完全一樣的。顯然,這很愚蠢,所以我們采用了如下的辦法對代碼進行精簡。

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表達式,使得事件函數(shù)可以傳入兩個參數(shù),也就完成了一次性創(chuàng)建多個控件的目的。

分解來看,首先創(chuàng)建一個滾動條字典

 self.paraSliders = {}

其鍵為變量名稱,值則對應一個滾動條控件。實現(xiàn)方式為

self.paraSliders[key]=wx.Slider(optiPanel,minValue=1,maxValue=1000,size=(200,-1))

然后對于每個滾動條,通過lambda綁定事件函數(shù):

self.paraSliders[key].Bind(wx.EVT_SCROLL,lambda evt,mark=key: self.OnSliderScroll(evt,mark))

其中,wx.EVT_SCROLL為滾動事件,lambda方法將evt和mark分別傳入到事件函數(shù)self.OnSliderScroll(evt,mark)中,其中mark的值即為當前的鍵值。

最后,將滾動條壓入到Boxsizer中。

在其調(diào)用的OnSliderScroll中,首先定義參數(shù)字典,從而確定了不同滾動條的滾動范圍,通過mark值,使得參數(shù)和滾動條能夠一一對應。然后然后設置成員變量self.optiDict以及self.sourceDict。

以上就是Python光學仿真wxpython透鏡演示系統(tǒng)初始化與參數(shù)調(diào)節(jié)的詳細內(nèi)容,更多關于wxpython透鏡演示系統(tǒng)初始化與參數(shù)調(diào)節(jié)的資料請關注腳本之家其它相關文章!

相關文章

  • 深入解析Python中的urllib2模塊

    深入解析Python中的urllib2模塊

    這篇文章主要介紹了Python中的urllib2模塊,包括一個利用其抓取網(wǎng)站生成RSS的小例子,需要的朋友可以參考下
    2015-11-11
  • python numpy數(shù)組中的復制知識解析

    python numpy數(shù)組中的復制知識解析

    這篇文章主要介紹了python numpy數(shù)組中的復制知識解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • python openssl模塊安裝及用法

    python openssl模塊安裝及用法

    在本篇文章里小編給大家整理的是一篇關于python openssl模塊安裝及用法,有需要的朋友們可以學習下。
    2020-12-12
  • 淺析Python中線程以及線程阻塞

    淺析Python中線程以及線程阻塞

    這篇文章主要為大家簡單介紹一下Python中線程以及線程阻塞的相關知識,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2023-04-04
  • Pythony運維入門之Socket網(wǎng)絡編程詳解

    Pythony運維入門之Socket網(wǎng)絡編程詳解

    這篇文章主要介紹了Pythony運維入門之Socket網(wǎng)絡編程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • 5種Python統(tǒng)計次數(shù)方法技巧

    5種Python統(tǒng)計次數(shù)方法技巧

    這篇文章主要給大家分享的是5種Python統(tǒng)計次數(shù)方法技巧,文章主要包括字典 dict 統(tǒng)計、collections.defaultdict 統(tǒng)計、List count方法、集合(set)和列表(list)統(tǒng)計、collections.Counter方法,感興趣的小伙伴一起進入下面文章內(nèi)容吧
    2021-11-11
  • 詳解Python常用標準庫之os模塊與shutil模塊

    詳解Python常用標準庫之os模塊與shutil模塊

    os系統(tǒng)模塊與shutil文件操作模塊是Python常用的標準庫,本文將通過示例詳細講解一下二者的使用,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-06-06
  • 解決python 未發(fā)現(xiàn)數(shù)據(jù)源名稱并且未指定默認驅(qū)動程序的問題

    解決python 未發(fā)現(xiàn)數(shù)據(jù)源名稱并且未指定默認驅(qū)動程序的問題

    今天小編就為大家分享一篇解決python 未發(fā)現(xiàn)數(shù)據(jù)源名稱并且未指定默認驅(qū)動程序的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python構建網(wǎng)頁爬蟲原理分析

    Python構建網(wǎng)頁爬蟲原理分析

    這篇文章主要給大家講解了構建網(wǎng)頁爬蟲的技術原理以及實現(xiàn)的邏輯關系,有興趣的朋友閱讀下吧。
    2017-12-12
  • Matplotlib繪圖基礎之刻度詳解

    Matplotlib繪圖基礎之刻度詳解

    Matplotlib中刻度是用于在繪圖中表示數(shù)據(jù)大小的工具,通常以整數(shù)或小數(shù)表示,具體取決于坐標軸的類型和限制,下面就為大家介紹一下Matplotlib中刻度是具體設置與使用吧
    2023-07-07

最新評論