wxpython制作解包工具(二)

工具中使用对话框从用户采集数据,对话框大致可以分为以下几类:

1:报文信息采集对话框,使用的是wxpyhon自带的wx.TextEntryDialog,在用户输入信息并确定后,程序依次完成以下几个工作:

self.Upb.StrHandle()函数处理用户输入的信息,此工具可以识别用户输入的各种形式的报文,如0X9012FF、0X90 0X12 0XFF、0X90;0X12;0XFF、0X90-12-FF均等为合法的输入;
self.Upb.Unpack()函数解析报文并存入数据结构中,这里如果用户输入的报文时不完整的,或者是错误的,并不会影响软件的工作,程序会从头开始解析,并显示正确的那一部分,直到遇到错误,从输出窗口提示用户输入报文存在问题,方便用户定位错误;
self.ModifyGrid()函数根据解析的报文数据更新界面在界面中显示;

self.CreatPacketTree()函数创建一个wx.TreeCtrl()用于显示解析的报文的目录,方便用户了解报文的组成,并可以决定删除或者添加其中某个或几个包;
self.OutputText.AppendText('You entered: %s \n' % dialog.GetValue())用于向输出窗口吐出信息;
dialog.Destroy()消除窗口。
这一部分的主要代码如下所示:

    def ShowTextEntryDialog(self, evt):  
        dialog = wx.TextEntryDialog(None,
                "Please Enter 830(bit) Balise Info:",
                "Balise Entry", "", style=wx.OK|wx.CANCEL|wx.CENTER,pos=wx.DefaultPosition)
        if dialog.ShowModal() == wx.ID_OK:
            try: 
                self.ClearInfo(None)
                self.Upb.StrHandle(dialog.GetValue())
                self.Upb.Unpack()
                self.ModifyGrid(UnpackFunc)
                self.ModityPacketTree()
                self.OutputText.AppendText('You entered: %s \n' % dialog.GetValue())
            except:
                self.OutputText.AppendText("Warning:Unpack Balise!\n")
        dialog.Destroy() 


2:根据具体报文信息定制的对话框,有如下信息包需要用户提供额外的信息从而进行组包,而这些对话框根据输入的形式有可以分为一下四组:

            第一组:"ETCS-5", "ETCS-41","ETCS-46","ETCS-79"

            第二组 "ETCS-72"

            第三组 "ETCS-68"

            第四组 "ETCS-21","ETCS-27","CTCS-1","CTCS-2","CTCS-4"

第一组首先通过wx.MyListBox获取用户附加的信息的个数,然后根据这个数目在对话框中添加相应个数的wx.RadioBox。这里在使用的时候,将需要动态添加的wx.RadioBox放在一个Sizer里面,命名为RighterSizer,当用户改变附加信息的个数的时候,首先清空RighterSizer中的所有wx.RadioBox,然后根据新的个数再次添加,同时新建一个List用于放置新增的wx.RadioBox。当用户输入信息完毕,按下Ok按钮,遍历Radiolist和MyListBox ,采集用户数据,并记录在字典中。具体的实现和显示如下:

class ETCS_5_41_46_79Dialog(wx.Dialog):
    def __init__(self, parent,DialogName,StaticBoxText,radioboxText):
        wx.Dialog.__init__(self, parent, -1,DialogName)
        self.InfoDict = {}
        self.RadioboxText = radioboxText
        self.Mainsizer = wx.BoxSizer(wx.HORIZONTAL)
        self.Mainsizer.SetMinSize((240,160))
        self.Leftsizer = wx.BoxSizer(wx.VERTICAL)
        self.Rightsizer = wx.BoxSizer(wx.VERTICAL)
        self.ButtonSizer = wx.BoxSizer(wx.HORIZONTAL)

        self.Radiolist = []
        NumList = ['0','1','2','3','4','5','6','7','8','9']
        
        StaticText = wx.StaticBox(self,-1,StaticBoxText)
        self.Leftsizer= wx.StaticBoxSizer(StaticText,wx.VERTICAL)

        self.MyListBox = wx.Choice(self, -1, choices=NumList)
        self.MyListBox.SetSelection(0)
          
        self.Okbutton = wx.Button(self, wx.ID_OK, "OK")
        self.Cancelbutton = wx.Button(self, wx.ID_CANCEL, "Cancel")
        self.ButtonSizer.Add(self.Okbutton, 1, wx.ALIGN_CENTER, 5) 
        self.ButtonSizer.Add(self.Cancelbutton, 1, wx.ALIGN_CENTER, 5) 
        
        self.Leftsizer.Add((10,10))
        self.Leftsizer.Add(self.MyListBox,0,wx.ALIGN_LEFT|wx.EXPAND,5)
        self.Leftsizer.Add((10,10))
        self.AddChoice(self.Leftsizer)                                                                                                                                                                                                                                                                                                                                    
        self.Leftsizer.Add((10,10))
        self.Leftsizer.Add(self.ButtonSizer, 0, wx.ALIGN_BOTTOM|wx.EXPAND, 5)          
        
        self.Mainsizer.Add(self.Leftsizer,1, wx.ALL,5)
        self.Mainsizer.Add(self.Rightsizer ,0, wx.ALIGN_CENTER|wx.ALL,5)
        
        self.SetSizer(self.Mainsizer)
        self.Layout()
        self.Mainsizer.Fit(self) 
        self.Bind(wx.EVT_CHOICE,self.RadioNumsControl)
        self.Bind(wx.EVT_BUTTON,self.OkbuttonClick,self.Okbutton)
        
    def RadioNumsControl(self,event): 
        Nums = self.MyListBox.GetSelection()
        self.DelChoice()
        for i in range(0,int(Nums)):
            self.AddChoice(self.Rightsizer)
        self.Mainsizer.Fit(self)
        self.Layout()
            
    def AddChoice(self,Mysizer):
        if "ETCS-5" == self.RadioboxText:
            ChoiceList = [u"0:相同", u"1:不同"]
            radiobox = wx.RadioBox(self, -1, u"下一个链接应答器组与前一个地区关系:", (20, 20), wx.DefaultSize,
                         ChoiceList, 2, wx.RA_SPECIFY_COLS)
        elif "ETCS-41" == self.RadioboxText:
            ChoiceList = [u"000:ETCS-0", u"001:STM",u"010:ETCS-1", u"011:CTCS-3", u"100:CTCS-4"]
            radiobox = wx.RadioBox(self, -1, u"转换的列控等级:", (20, 20), wx.DefaultSize,
                         ChoiceList, 1, wx.RA_SPECIFY_COLS)
        elif "ETCS-46" == self.RadioboxText:
            ChoiceList = [u"000:ETCS-0", u"001:STM",u"010:ETCS-1", u"011:CTCS-3", u"100:CTCS-4"]
            radiobox = wx.RadioBox(self, -1, u"转换的列控等级:", (20, 20), wx.DefaultSize,
                         ChoiceList, 1, wx.RA_SPECIFY_COLS)
        elif "ETCS-79" == self.RadioboxText:
            ChoiceList = [u"0:相同", u"1:不同"]
            radiobox = wx.RadioBox(self, -1, u"参考应答器组与本应答器组的关系:", (20, 20), wx.DefaultSize,
                         ChoiceList, 1, wx.RA_SPECIFY_COLS)
        self.Radiolist.append(radiobox)
        Mysizer.Add(radiobox, 1, wx.EXPAND|wx.ALL, 5)

    def DelChoice(self):
        while(self.Rightsizer.GetChildren()):
            self.Rightsizer.Hide(0)
            self.Rightsizer.Remove(0)
            self.Radiolist.pop()
    
    def OkbuttonClick(self,event):
        for index, item in enumerate(self.Radiolist):
            self.InfoDict[index] = item.GetSelection()
        self.InfoDict['num'] = len(self.Radiolist) 
        print self.InfoDict
        self.Close()


 

第二组、第三组、第四组对话框与第一组类似,不过不用根据用户的输入信息而在对话框中增加控件,只需在用户输入之后采集数。这些对话框界面如下:

第二组:

第三、四组:          

                       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值