工具中使用对话框从用户采集数据,对话框大致可以分为以下几类:
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()
第二组、第三组、第四组对话框与第一组类似,不过不用根据用户的输入信息而在对话框中增加控件,只需在用户输入之后采集数。这些对话框界面如下:
第二组:
第三、四组: