def test_ipaddrctrlProperties(self): t = m.IpAddrCtrl(self.frame) t.DefaultStyle t.NumberOfLines t.Hint t.InsertionPoint t.LastPosition t.Margins t.StringSelection t.Value
def test_ipaddrctrlCtor(self): t = m.IpAddrCtrl(self.frame) t = m.IpAddrCtrl(self.frame, -1, "128.000.000.000") t = m.IpAddrCtrl(self.frame, style=wx.TE_READONLY)
def __init__(self, parent, log): self.log = log scroll.ScrolledPanel.__init__(self, parent, -1) self.sizer = wx.BoxSizer(wx.VERTICAL) labelMaskedCombos = wx.StaticText( self, -1, """\ These are some examples of masked.ComboBox:""") labelMaskedCombos.SetForegroundColour("Blue") label_statecode = wx.StaticText( self, -1, """\ A state selector; only "legal" values can be entered:""") statecode = masked.ComboBox(self, -1, masked.states[0], choices=masked.states, autoformat="USSTATE") label_statename = wx.StaticText( self, -1, """\ A state name selector, with auto-select:""") # Create this one using factory function: statename = masked.Ctrl(self, -1, masked.state_names[0], controlType=masked.controlTypes.COMBO, choices=masked.state_names, autoformat="USSTATENAME", autoSelect=True) statename.SetCtrlParameters(formatcodes='F!V_') numerators = [str(i) for i in range(1, 4)] denominators = [ string.ljust(str(i), 2) for i in [2, 3, 4, 5, 8, 16, 32, 64] ] fieldsDict = { 0: masked.Field(choices=numerators, choiceRequired=False), 1: masked.Field(choices=denominators, choiceRequired=True) } choices = [] for n in numerators: for d in denominators: if n != d: choices.append('%s/%s' % (n, d)) label_fraction = wx.StaticText( self, -1, """\ A masked ComboBox for fraction selection. Choices for each side of the fraction can be selected with PageUp/Down:""") fraction = masked.Ctrl(self, -1, "", controlType=masked.controlTypes.COMBO, choices=choices, choiceRequired=True, mask="#/##", formatcodes="F_", validRegex="^\d\/\d\d?", fields=fieldsDict) label_code = wx.StaticText( self, -1, """\ A masked ComboBox to validate text from a list of numeric codes:""") choices = ["91", "136", "305", "4579"] code = masked.ComboBox(self, -1, choices[0], choices=choices, choiceRequired=True, formatcodes="F_r", mask="####") label_selector = wx.StaticText( self, -1, """\ Programmatically set choice sets:""") self.list_selector = wx.ComboBox(self, -1, '', choices=['list1', 'list2', 'list3']) self.dynamicbox = masked.Ctrl( self, -1, ' ', controlType=masked.controlTypes.COMBO, mask='XXXX', formatcodes='F_', # these are to give dropdown some initial height, # as base control apparently only sets that size # during initial construction <sigh>: choices=['', '1', '2', '3', '4', '5']) self.dynamicbox.Clear( ) # get rid of initial choices used to size the dropdown labelIpAddrs = wx.StaticText( self, -1, """\ Here are some examples of IpAddrCtrl, a control derived from masked.TextCtrl:""" ) labelIpAddrs.SetForegroundColour("Blue") label_ipaddr1 = wx.StaticText(self, -1, "An empty control:") ipaddr1 = masked.IpAddrCtrl(self, -1, style=wx.TE_PROCESS_TAB) label_ipaddr2 = wx.StaticText(self, -1, "A restricted mask:") ipaddr2 = masked.IpAddrCtrl(self, -1, mask=" 10. 1.109.###") label_ipaddr3 = wx.StaticText( self, -1, """\ A control with restricted legal values: 10. (1|2) . (129..255) . (0..255)""") ipaddr3 = masked.Ctrl(self, -1, controlType=masked.controlTypes.IPADDR, mask=" 10. #.###.###") ipaddr3.SetFieldParameters( 0, validRegex="1|2", validRequired=False) # requires entry to match or not allowed # This allows any value in penultimate field, but colors anything outside of the range invalid: ipaddr3.SetFieldParameters(1, validRange=(129, 255), validRequired=False) labelNumerics = wx.StaticText( self, -1, """\ Here are some useful configurations of a masked.TextCtrl for integer and floating point input that still treat the control as a text control. (For a true numeric control, check out the masked.NumCtrl class!)""" ) labelNumerics.SetForegroundColour("Blue") label_intctrl1 = wx.StaticText( self, -1, """\ An integer entry control with shifting insert enabled:""") self.intctrl1 = masked.TextCtrl(self, -1, name='intctrl', mask="#{9}", formatcodes='_-,F>') label_intctrl2 = wx.StaticText( self, -1, """\ Right-insert integer entry:""") self.intctrl2 = masked.TextCtrl(self, -1, name='intctrl', mask="#{9}", formatcodes='_-,Fr') label_floatctrl = wx.StaticText( self, -1, """\ A floating point entry control with right-insert for ordinal:""") self.floatctrl = masked.TextCtrl(self, -1, name='floatctrl', mask="#{9}.#{2}", formatcodes="F,_-R", useParensForNegatives=False) self.floatctrl.SetFieldParameters( 0, formatcodes='r<', validRequired=True ) # right-insert, require explicit cursor movement to change fields self.floatctrl.SetFieldParameters( 1, defaultValue='00') # don't allow blank fraction label_numselect = wx.StaticText( self, -1, """\ <= Programmatically set the value of the float entry ctrl:""") numselect = wx.ComboBox(self, -1, choices=[ '', '111', '222.22', '-3', '54321.666666666', '-1353.978', '1234567', '-1234567', '123456789', '-123456789.1', '1234567890.', '-1234567890.1' ]) parens_check = wx.CheckBox( self, -1, "Use () to indicate negatives in above controls") gridCombos = wx.FlexGridSizer(cols=4, vgap=10, hgap=10) gridCombos.Add(label_statecode, 0, wx.ALIGN_LEFT) gridCombos.Add(statecode, 0, wx.ALIGN_LEFT) gridCombos.Add(label_fraction, 0, wx.ALIGN_LEFT) gridCombos.Add(fraction, 0, wx.ALIGN_LEFT) gridCombos.Add(label_statename, 0, wx.ALIGN_LEFT) gridCombos.Add(statename, 0, wx.ALIGN_LEFT) gridCombos.Add(label_code, 0, wx.ALIGN_LEFT) gridCombos.Add(code, 0, wx.ALIGN_LEFT) gridCombos.Add(label_selector, 0, wx.ALIGN_LEFT) hbox = wx.BoxSizer(wx.HORIZONTAL) hbox.Add(self.list_selector, 0, wx.ALIGN_LEFT) hbox.Add(wx.StaticText(self, -1, ' => '), 0, wx.ALIGN_LEFT) hbox.Add(self.dynamicbox, 0, wx.ALIGN_LEFT) gridCombos.Add(hbox, 0, wx.ALIGN_LEFT) gridIpAddrs = wx.FlexGridSizer(cols=4, vgap=10, hgap=15) gridIpAddrs.Add(label_ipaddr1, 0, wx.ALIGN_LEFT) gridIpAddrs.Add(ipaddr1, 0, wx.ALIGN_LEFT) gridIpAddrs.Add(label_ipaddr2, 0, wx.ALIGN_LEFT) gridIpAddrs.Add(ipaddr2, 0, wx.ALIGN_LEFT) gridIpAddrs.Add(label_ipaddr3, 0, wx.ALIGN_LEFT) gridIpAddrs.Add(ipaddr3, 0, wx.ALIGN_LEFT) gridNumerics = wx.FlexGridSizer(cols=4, vgap=10, hgap=10) gridNumerics.Add(label_intctrl1, 0, wx.ALIGN_LEFT) gridNumerics.Add(self.intctrl1, 0, wx.ALIGN_LEFT) gridNumerics.Add(label_intctrl2, 0, wx.ALIGN_RIGHT) gridNumerics.Add(self.intctrl2, 0, wx.ALIGN_LEFT) gridNumerics.Add(label_floatctrl, 0, wx.ALIGN_LEFT) gridNumerics.Add(self.floatctrl, 0, wx.ALIGN_LEFT) gridNumerics.Add(label_numselect, 0, wx.ALIGN_RIGHT) gridNumerics.Add(numselect, 0, wx.ALIGN_LEFT) self.sizer.Add(labelMaskedCombos, 0, wx.ALIGN_LEFT | wx.ALL, 5) self.sizer.Add(gridCombos, 0, wx.ALIGN_LEFT | wx.ALL, border=5) self.sizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.TOP | wx.BOTTOM, border=8) self.sizer.Add(labelIpAddrs, 0, wx.ALIGN_LEFT | wx.ALL, 5) self.sizer.Add(gridIpAddrs, 0, wx.ALIGN_LEFT | wx.ALL, border=5) self.sizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND | wx.TOP | wx.BOTTOM, border=8) self.sizer.Add(labelNumerics, 0, wx.ALIGN_LEFT | wx.ALL, 5) self.sizer.Add(gridNumerics, 0, wx.ALIGN_LEFT | wx.ALL, border=5) self.sizer.Add(parens_check, 0, wx.ALIGN_LEFT | wx.ALL, 5) self.SetSizer(self.sizer) self.SetAutoLayout(1) self.SetupScrolling() self.Bind(wx.EVT_COMBOBOX, self.OnComboSelection, id=fraction.GetId()) self.Bind(wx.EVT_COMBOBOX, self.OnComboSelection, id=code.GetId()) self.Bind(wx.EVT_COMBOBOX, self.OnComboSelection, id=statecode.GetId()) self.Bind(wx.EVT_COMBOBOX, self.OnComboSelection, id=statename.GetId()) self.Bind(wx.EVT_TEXT, self.OnTextChange, id=code.GetId()) self.Bind(wx.EVT_TEXT, self.OnTextChange, id=statecode.GetId()) self.Bind(wx.EVT_TEXT, self.OnTextChange, id=statename.GetId()) self.Bind(wx.EVT_COMBOBOX, self.OnListSelection, id=self.list_selector.GetId()) self.Bind(wx.EVT_TEXT, self.OnTextChange, id=self.intctrl1.GetId()) self.Bind(wx.EVT_TEXT, self.OnTextChange, id=self.intctrl2.GetId()) self.Bind(wx.EVT_TEXT, self.OnTextChange, id=self.floatctrl.GetId()) self.Bind(wx.EVT_COMBOBOX, self.OnNumberSelect, id=numselect.GetId()) self.Bind(wx.EVT_CHECKBOX, self.OnParensCheck, id=parens_check.GetId()) self.Bind(wx.EVT_TEXT, self.OnIpAddrChange, id=ipaddr1.GetId()) self.Bind(wx.EVT_TEXT, self.OnIpAddrChange, id=ipaddr2.GetId()) self.Bind(wx.EVT_TEXT, self.OnIpAddrChange, id=ipaddr3.GetId())
def __init__( self, parent, id = wx.ID_ANY, title='', size=(200,200) ): wx.Frame.__init__(self, parent, id, title, size=size) self.config = wx.Config(appName="CrossMgrImpinj", vendorName="SmartCyclingSolutions", style=wx.CONFIG_USE_LOCAL_FILE) self.SetBackgroundColour( wx.Colour(232,232,232) ) self.LightGreen = wx.Colour(153,255,153) self.LightRed = wx.Colour(255,153,153) font = self.GetFont() bigFont = wx.Font( font.GetPointSize() * 1.5, font.GetFamily(), font.GetStyle(), wx.FONTWEIGHT_BOLD ) italicFont = wx.Font( bigFont.GetPointSize()*2.2, bigFont.GetFamily(), wx.FONTSTYLE_ITALIC, bigFont.GetWeight() ) self.vbs = wx.BoxSizer( wx.VERTICAL ) bs = wx.BoxSizer( wx.HORIZONTAL ) self.reset = RoundButton(self, label='Reset', size=(80, 80)) self.reset.SetBackgroundColour( wx.WHITE ) self.reset.SetForegroundColour( wx.Colour(0,128,128) ) self.reset.SetFontToFitLabel() # Use the button's default font, but change the font size to fit the label. self.reset.Bind( wx.EVT_BUTTON, self.doReset ) self.reset.Refresh() bs.Add( self.reset, border = 8, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL ) bs.Add( setFont(italicFont,wx.StaticText(self, label='CrossMgrImpinj')), border = 8, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL ) bs.AddStretchSpacer() bitmap = wx.BitmapFromXPMData( clipboard_xpm ) self.copyToClipboard = wx.BitmapButton( self, bitmap=bitmap ) self.copyToClipboard.SetToolTip(wx.ToolTip('Copy Configuration and Logs to Clipboard...')) self.copyToClipboard.Bind( wx.EVT_BUTTON, self.doCopyToClipboard ) bs.Add( self.copyToClipboard, border = 32, flag = wx.LEFT|wx.ALIGN_CENTER_VERTICAL ) self.tStart = datetime.datetime.now() bs.Add( setFont(bigFont,wx.StaticText(self, label='Last Reset: %s' % self.tStart.strftime('%H:%M:%S'))), border = 10, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL ) self.runningTime = setFont(bigFont,wx.StaticText(self, label='00:00:00' )) bs.Add( self.runningTime, border = 20, flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL ) bs.Add( setFont(bigFont,wx.StaticText(self, label=' / ')), flag=wx.ALIGN_CENTER_VERTICAL ) self.time = setFont(bigFont, wx.StaticText(self, label='00:00:00' )) bs.Add( self.time, flag=wx.ALIGN_CENTER_VERTICAL ) self.vbs.Add( bs, flag=wx.ALL|wx.EXPAND, border = 4 ) fgs = wx.FlexGridSizer( rows = 2, cols = 2, vgap = 4, hgap = 4 ) fgs.AddGrowableRow( 1 ) fgs.AddGrowableCol( 0 ) fgs.AddGrowableCol( 1 ) fgs.SetFlexibleDirection( wx.BOTH ) self.vbs.Add( fgs, flag=wx.EXPAND, proportion=5 ) #------------------------------------------------------------------------------------------------ # Impinj configuration. # gbs = wx.GridBagSizer( 4, 4 ) fgs.Add( gbs, flag=wx.EXPAND|wx.ALL, border = 4 ) iRow = 0 hb = wx.BoxSizer( wx.HORIZONTAL ) hb.Add( setFont(bigFont,wx.StaticText(self, label='Impinj Configuration:')), flag=wx.ALIGN_CENTER_VERTICAL ) self.autoDetectButton = wx.Button(self, label='Auto Detect') self.autoDetectButton.Bind( wx.EVT_BUTTON, self.doAutoDetect ) hb.Add( self.autoDetectButton, flag=wx.LEFT, border = 6 ) self.advancedButton = wx.Button(self, label='Advanced...' ) self.advancedButton.Bind( wx.EVT_BUTTON, self.doAdvanced ) hb.Add( self.advancedButton, flag=wx.LEFT, border = 6 ) gbs.Add( hb, pos=(iRow,0), span=(1,2), flag=wx.ALIGN_LEFT ) iRow += 1 gs = wx.GridSizer( rows=0, cols=4, vgap=0, hgap=2 ) self.antennaLabels = [] self.antennas = [] for i in xrange(4): self.antennaLabels.append( wx.StaticText(self, label='{}'.format(i+1), style=wx.ALIGN_CENTER) ) gs.Add( self.antennaLabels[-1], flag=wx.ALIGN_CENTER|wx.EXPAND ) for i in xrange(4): cb = wx.CheckBox( self, wx.ID_ANY, '') if i < 2: cb.SetValue( True ) cb.Bind( wx.EVT_CHECKBOX, lambda x: self.getAntennaStr() ) gs.Add( cb, flag=wx.ALIGN_CENTER ) self.antennas.append( cb ) gbs.Add( wx.StaticText(self, label='ANT Ports:'), pos=(iRow,0), span=(1,1), flag=wx.ALIGN_RIGHT|wx.ALIGN_BOTTOM ) gbs.Add( gs, pos=(iRow,1), span=(1,1), flag=wx.ALIGN_CENTER_VERTICAL ) iRow += 1 self.useHostName = wx.RadioButton( self, label='Host Name:', style=wx.wx.RB_GROUP ) gbs.Add( self.useHostName, pos=(iRow,0), span=(1,1), flag=wx.ALIGN_CENTER_VERTICAL ) hb = wx.BoxSizer( wx.HORIZONTAL ) hb.Add( wx.StaticText(self, label=ImpinjHostNamePrefix), flag=wx.ALIGN_CENTER_VERTICAL ) self.impinjHostName = masked.TextCtrl( self, mask = 'NN-NN-NN', defaultValue = '00-00-00', useFixedWidthFont = True, size=(80, -1), ) hb.Add( self.impinjHostName ) hb.Add( wx.StaticText(self, label=ImpinjHostNameSuffix), flag=wx.ALIGN_CENTER_VERTICAL ) hb.Add( wx.StaticText(self, label=' : ' + '{}'.format(ImpinjInboundPort)), flag=wx.ALIGN_CENTER_VERTICAL ) gbs.Add( hb, pos=(iRow,1), span=(1,1), flag=wx.ALIGN_LEFT ) iRow += 1 self.useStaticAddress = wx.RadioButton( self, label='IP:' ) gbs.Add( self.useStaticAddress, pos=(iRow,0), span=(1,1), flag=wx.ALIGN_CENTER_VERTICAL ) hb = wx.BoxSizer( wx.HORIZONTAL ) self.impinjHost = masked.IpAddrCtrl( self, style=wx.TE_PROCESS_TAB ) hb.Add( self.impinjHost ) hb.Add( wx.StaticText(self, label=' : ' + '{}'.format(ImpinjInboundPort)), flag=wx.ALIGN_CENTER_VERTICAL ) gbs.Add( hb, pos=(iRow,1), span=(1,1), flag=wx.ALIGN_LEFT ) self.useHostName.SetValue( True ) self.useStaticAddress.SetValue( False ) iRow += 1 gbs.Add( wx.StaticText(self, label='ANT Reads:'), pos=(iRow,0), span=(1,1), flag=wx.ALIGN_RIGHT ) self.antennaReadCount = wx.StaticText( self, label='1:0 0% | 2:0 0% | 3:0 0% | 4:0 0% ' ) gbs.Add( self.antennaReadCount, pos=(iRow,1), span=(1,2), flag=wx.ALIGN_LEFT ) iRow += 1 gbs.Add( wx.StaticText(self, label='Backup File:'), pos=(iRow,0), span=(1,1), flag=wx.ALIGN_RIGHT ) self.backupFile = wx.StaticText( self, label=' ' ) gbs.Add( self.backupFile, pos=(iRow,1), span=(1,2), flag=wx.ALIGN_LEFT ) #------------------------------------------------------------------------------------------------ # CrossMgr configuration. # gbs = wx.GridBagSizer( 4, 4 ) fgs.Add( gbs, flag=wx.EXPAND|wx.ALL, border = 4 ) gbs.Add( setFont(bigFont,wx.StaticText(self, label='CrossMgr Configuration:')), pos=(0,0), span=(1,2), flag=wx.ALIGN_LEFT|wx.ALIGN_CENTER_VERTICAL ) gbs.Add( wx.StaticText(self, label='CrossMgr Address:'), pos=(1,0), span=(1,1), flag=wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL ) hb = wx.BoxSizer( wx.HORIZONTAL ) self.crossMgrHost = masked.IpAddrCtrl( self, style = wx.TE_PROCESS_TAB ) hb.Add( self.crossMgrHost, flag=wx.ALIGN_LEFT ) hb.Add( wx.StaticText( self, label=' : 53135' ), flag=wx.ALIGN_CENTER_VERTICAL ) gbs.Add( hb, pos=(1,1), span=(1,1), flag=wx.ALIGN_LEFT ) #------------------------------------------------------------------------------------------------ # Add messages # self.impinjMessagesText = wx.TextCtrl( self, style=wx.TE_READONLY|wx.TE_MULTILINE|wx.HSCROLL, size=(-1,400) ) fgs.Add( self.impinjMessagesText, flag=wx.EXPAND, proportion=2 ) self.impinjMessages = MessageManager( self.impinjMessagesText ) self.crossMgrMessagesText = wx.TextCtrl( self, style=wx.TE_READONLY|wx.TE_MULTILINE|wx.HSCROLL, size=(-1,400) ) fgs.Add( self.crossMgrMessagesText, flag=wx.EXPAND, proportion=2 ) self.crossMgrMessages = MessageManager( self.crossMgrMessagesText ) self.fgs = fgs #------------------------------------------------------------------------------------------------ # Create a timer to update the messages. # self.timer = wx.Timer() self.timer.Bind( wx.EVT_TIMER, self.updateMessages ) self.timer.Start( 1000, False ) self.Bind(wx.EVT_CLOSE, self.onCloseWindow) self.readOptions() self.SetSizer( self.vbs ) self.start()
def __init__(self, parent, id=wx.ID_ANY, title='', size=(200, 200)): wx.Frame.__init__(self, parent, id, title, size=size) self.config = wx.Config(appName="CrossMgrAlien", vendorName="SmartCyclingSolutions", style=wx.CONFIG_USE_LOCAL_FILE) self.SetBackgroundColour(wx.Colour(232, 232, 232)) self.LightGreen = wx.Colour(153, 255, 153) self.LightRed = wx.Colour(255, 153, 153) font = self.GetFont() bigFont = wx.Font(font.GetPointSize() * 1.5, font.GetFamily(), font.GetStyle(), wx.FONTWEIGHT_BOLD) italicFont = wx.Font(bigFont.GetPointSize() * 2.2, bigFont.GetFamily(), wx.FONTSTYLE_ITALIC, bigFont.GetWeight()) self.vbs = wx.BoxSizer(wx.VERTICAL) bs = wx.BoxSizer(wx.HORIZONTAL) self.reset = RoundButton(self, wx.ID_ANY, 'Reset', size=(80, 80)) self.reset.SetBackgroundColour(wx.WHITE) self.reset.SetForegroundColour(wx.Colour(0, 128, 128)) self.reset.SetFontToFitLabel( ) # Use the button's default font, but change the font size to fit the label. self.reset.Bind(wx.EVT_BUTTON, self.doReset) self.reset.Refresh() bs.Add(self.reset, border=8, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL) bs.Add(setFont(italicFont, wx.StaticText(self, wx.ID_ANY, 'CrossMgrAlien')), border=8, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL) bs.AddStretchSpacer() bitmap = wx.BitmapFromXPMData(clipboard_xpm) self.copyToClipboard = wx.BitmapButton(self, wx.ID_ANY, bitmap) self.copyToClipboard.SetToolTip( wx.ToolTip('Copy Configuration and Logs to Clipboard...')) self.copyToClipboard.Bind(wx.EVT_BUTTON, self.doCopyToClipboard) bs.Add(self.copyToClipboard, border=32, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL) self.tStart = datetime.datetime.now() bs.Add(setFont( bigFont, wx.StaticText( self, wx.ID_ANY, 'Last Reset: {}'.format(self.tStart.strftime('%H:%M:%S')))), border=10, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL) self.runningTime = setFont(bigFont, wx.StaticText(self, wx.ID_ANY, '00:00:00')) bs.Add(self.runningTime, border=20, flag=wx.LEFT | wx.ALIGN_CENTER_VERTICAL) bs.Add(setFont(bigFont, wx.StaticText(self, wx.ID_ANY, ' / ')), flag=wx.ALIGN_CENTER_VERTICAL) self.time = setFont(bigFont, wx.StaticText(self, wx.ID_ANY, '00:00:00')) bs.Add(self.time, flag=wx.ALIGN_CENTER_VERTICAL) self.vbs.Add(bs, flag=wx.ALL | wx.EXPAND, border=4) fgs = wx.FlexGridSizer(rows=0, cols=2, vgap=4, hgap=4) fgs.AddGrowableRow(1) fgs.AddGrowableCol(0) fgs.AddGrowableCol(1) fgs.SetFlexibleDirection(wx.BOTH) self.vbs.Add(fgs, flag=wx.EXPAND, proportion=5) #------------------------------------------------------------------------------------------------ # Alien configuration. # gbs = wx.GridBagSizer(4, 4) fgs.Add(gbs, flag=wx.EXPAND | wx.ALL, border=4) iRow = 0 hs = wx.BoxSizer(wx.HORIZONTAL) hs.Add(setFont(bigFont, wx.StaticText(self, wx.ID_ANY, 'Alien Configuration:')), flag=wx.ALIGN_CENTER_VERTICAL) self.autoDetectButton = wx.Button(self, wx.ID_ANY, 'Auto Detect') self.autoDetectButton.Bind(wx.EVT_BUTTON, self.doAutoDetect) hs.Add(self.autoDetectButton, flag=wx.ALIGN_CENTER_VERTICAL | wx.LEFT, border=6) self.advancedButton = wx.Button(self, wx.ID_ANY, 'Advanced...') self.advancedButton.Bind(wx.EVT_BUTTON, self.doAdvanced) hs.Add(self.advancedButton, flag=wx.LEFT, border=6) gbs.Add(hs, pos=(iRow, 0), span=(1, 2), flag=wx.ALIGN_LEFT) iRow += 1 gbs.Add(wx.StaticText(self, wx.ID_ANY, 'Antennas:'), pos=(iRow, 0), span=(1, 1), flag=wx.ALIGN_RIGHT | wx.ALIGN_BOTTOM) gs = wx.GridSizer(rows=0, cols=4, hgap=2, vgap=2) self.antennas = [] for i in xrange(4): gs.Add(wx.StaticText(self, wx.ID_ANY, '{}'.format(i)), flag=wx.ALIGN_CENTER) for i in xrange(4): cb = wx.CheckBox(self, wx.ID_ANY, '') if i < 2: cb.SetValue(True) cb.Bind(wx.EVT_CHECKBOX, lambda x: self.getAntennaStr()) gs.Add(cb, flag=wx.ALIGN_CENTER) self.antennas.append(cb) gbs.Add(gs, pos=(iRow, 1), span=(1, 1), flag=wx.ALIGN_CENTER_VERTICAL) iRow += 1 gbs.Add(wx.StaticText(self, wx.ID_ANY, 'Notify Address:'), pos=(iRow, 0), span=(1, 1), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL) hb = wx.BoxSizer(wx.HORIZONTAL) ips = Utils.GetAllIps() self.notifyHost = wx.Choice(self, wx.ID_ANY, choices=ips) hb.Add(self.notifyHost) hb.Add(wx.StaticText(self, wx.ID_ANY, ' : {}'.format(NotifyPort)), flag=wx.ALIGN_CENTER_VERTICAL) gbs.Add(hb, pos=(iRow, 1), span=(1, 1)) iRow += 1 self.listenForHeartbeat = wx.CheckBox( self, wx.ID_ANY, 'Listen for Alien Heartbeat on Port: {}'.format(HeartbeatPort), style=wx.ALIGN_LEFT) self.listenForHeartbeat.SetValue(True) gbs.Add(self.listenForHeartbeat, pos=(iRow, 0), span=(1, 2)) iRow += 1 gbs.Add(wx.StaticText(self, wx.ID_ANY, 'Alien Cmd Address:'), pos=(iRow, 0), span=(1, 1), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL) hb = wx.BoxSizer(wx.HORIZONTAL) self.cmdHost = masked.IpAddrCtrl(self, wx.ID_ANY, style=wx.TE_PROCESS_TAB) hb.Add(self.cmdHost) hb.Add(wx.StaticText(self, wx.ID_ANY, ' : '), flag=wx.ALIGN_CENTER_VERTICAL) self.cmdPort = intctrl.IntCtrl(self, size=(50, -1), min=0, max=999999) hb.Add(self.cmdPort, flag=wx.ALIGN_CENTER_VERTICAL) gbs.Add(hb, pos=(iRow, 1), span=(1, 1), flag=wx.ALIGN_LEFT) iRow += 1 gbs.Add(wx.StaticText(self, wx.ID_ANY, 'Backup File:'), pos=(iRow, 0), span=(1, 1), flag=wx.ALIGN_RIGHT) self.backupFile = wx.StaticText(self, wx.ID_ANY, '') gbs.Add(self.backupFile, pos=(iRow, 1), span=(1, 1), flag=wx.ALIGN_LEFT) #------------------------------------------------------------------------------------------------ # CrossMgr configuration. # gbs = wx.GridBagSizer(4, 4) fgs.Add(gbs, flag=wx.EXPAND | wx.ALL, border=4) gbs.Add(setFont( bigFont, wx.StaticText(self, wx.ID_ANY, 'CrossMgr Configuration:')), pos=(0, 0), span=(1, 2), flag=wx.ALIGN_LEFT) gbs.Add(wx.StaticText(self, wx.ID_ANY, 'CrossMgr Address:'), pos=(1, 0), span=(1, 1), flag=wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL) hb = wx.BoxSizer(wx.HORIZONTAL) self.crossMgrHost = masked.IpAddrCtrl(self, wx.ID_ANY, style=wx.TE_PROCESS_TAB) hb.Add(self.crossMgrHost, flag=wx.ALIGN_LEFT) hb.Add(wx.StaticText(self, wx.ID_ANY, ' : 53135'), flag=wx.ALIGN_CENTER_VERTICAL) gbs.Add(hb, pos=(1, 1), span=(1, 1), flag=wx.ALIGN_LEFT) #------------------------------------------------------------------------------------------------ # Add messages # self.alienMessagesText = wx.TextCtrl(self, wx.ID_ANY, style=wx.TE_READONLY | wx.TE_MULTILINE | wx.HSCROLL, size=(-1, 400)) fgs.Add(self.alienMessagesText, flag=wx.EXPAND, proportion=2) self.alienMessages = MessageManager(self.alienMessagesText) self.crossMgrMessagesText = wx.TextCtrl(self, wx.ID_ANY, style=wx.TE_READONLY | wx.TE_MULTILINE | wx.HSCROLL, size=(-1, 400)) fgs.Add(self.crossMgrMessagesText, flag=wx.EXPAND, proportion=2) self.crossMgrMessages = MessageManager(self.crossMgrMessagesText) self.fgs = fgs #------------------------------------------------------------------------------------------------ # Create a timer to update the messages. # self.timer = wx.Timer() self.timer.Bind(wx.EVT_TIMER, self.updateMessages) self.timer.Start(1000, False) self.Bind(wx.EVT_CLOSE, self.onCloseWindow) self.readOptions() self.SetSizer(self.vbs) self.start()