def AddSpinFloat(self, label, min_value, max_value, increment, default, digits=2): c = wx.SpinCtrlDouble(self.panel, -1) c.SetRange(min_value, max_value) c.SetValue(default) c.SetIncrement(increment) c.SetDigits(digits) s1 = "%.*f" % (digits, min_value) s2 = "%.*f" % (digits, max_value) if len(s1) > len(s2): s = s1 else: s = s2 if hasattr(c, 'GetSizeFromText'): size = c.GetSizeFromText(s + " ") c.SetMinSize(size) self.AddControl(c, label, default) self.row.Add(wx.StaticText(self.panel, label=label), 0, wx.LEFT, 20) self.row.Add(c, 0, wx.LEFT, 20) self.row.Add(wx.StaticText(self.panel, label=""), 0, wx.LEFT, 20) self.Bind(wx.EVT_SPINCTRLDOUBLE, self.OnValue)
def __init__(self, title, graphdef, callback): wx.Dialog.__init__(self, None, -1, title, size=(900, 400)) self.callback = callback self.graphdef = graphdef self.panel = wx.Panel(self, -1) vbox = wx.BoxSizer(wx.VERTICAL) # name entry hbox_name = wx.BoxSizer(wx.HORIZONTAL) st_name = wx.StaticText(self.panel, -1, 'Name: ') self.tc_name = wx.TextCtrl(self.panel, -1, size=(400, -1)) self.tc_name.Value = self.graphdef.name hbox_name.Add(st_name, 0, wx.LEFT, 10) hbox_name.Add(self.tc_name, 0, wx.LEFT, 35) vbox.Add(hbox_name, 0, wx.TOP, 10) # expression entry st = wx.StaticText(self.panel, -1, 'Expressions: ') vbox.Add(st, 0, wx.LEFT, 10) hbox_expressions = wx.BoxSizer(wx.HORIZONTAL) self.tc_expressions = wx.TextCtrl(self.panel, -1, style=wx.TE_MULTILINE | wx.HSCROLL, size=(800, 80)) elist = [] for e in self.graphdef.expressions: e = ' '.join(e.split()) elist.append(e) self.tc_expressions.Value = '\n'.join(elist) vbox.Add(self.tc_expressions, 0, wx.LEFT, 15) # description entry st = wx.StaticText(self.panel, -1, 'Description: ') vbox.Add(st, 0, wx.LEFT, 10) self.tc_description = wx.TextCtrl(self.panel, -1, style=wx.TE_MULTILINE) vbox.Add(self.tc_description, 1, wx.EXPAND | wx.TOP | wx.RIGHT | wx.LEFT, 15) self.tc_description.Value = self.graphdef.description # buttons button_save = wx.Button(self.panel, 1, 'Save') button_cancel = wx.Button(self.panel, 2, 'Cancel') button_test = wx.Button(self.panel, 3, 'Test') hbox_buttons = wx.BoxSizer(wx.HORIZONTAL) hbox_buttons.Add(button_save, 0, wx.LEFT, 10) hbox_buttons.Add(button_cancel, 0, wx.LEFT, 10) hbox_buttons.Add(button_test, 0, wx.LEFT, 10) vbox.Add(hbox_buttons, 0, wx.TOP, 10) self.Bind(wx.EVT_BUTTON, self.OnSave, id=1) self.Bind(wx.EVT_BUTTON, self.OnCancel, id=2) self.Bind(wx.EVT_BUTTON, self.OnTest, id=3) self.panel.SetSizer(vbox) self.Centre()
def AddSpinInteger(self, label, min_value, max_value, default): c = wx.SpinCtrl(self.panel, -1) c.SetRange(min_value, max_value) c.SetValue(default) self.AddControl(c, label, default) self.row.Add(wx.StaticText(self.panel, label=label), 0, wx.LEFT, 20) self.row.Add(c, 0, wx.LEFT, 20) self.row.Add(wx.StaticText(self.panel, label=""), 0, wx.LEFT, 20) self.Bind(wx.EVT_SPINCTRL, self.OnValue)
def on_timer(self, event): state = self.state if state.close_event.wait(0.001): self.timer.Stop() self.Destroy() return while state.child_pipe_recv.poll(): try: obj = state.child_pipe_recv.recv() except EOFError: self.timer.Stop() self.Destroy() return if isinstance(obj, Value): # request to set a status field if not obj.name in self.values: # create a new status field value = wx.StaticText(self.panel, -1, obj.text) # possibly add more status rows for i in range(len(self.status), obj.row + 1): self.status.append(wx.BoxSizer(wx.HORIZONTAL)) self.vbox.Insert(len(self.status) - 1, self.status[i], 0, flag=wx.ALIGN_LEFT | wx.TOP) self.vbox.Layout() self.status[obj.row].Add(value, border=5) self.status[obj.row].AddSpacer(20) self.values[obj.name] = value value = self.values[obj.name] value.SetForegroundColour(obj.fg) value.SetBackgroundColour(obj.bg) value.SetLabel(obj.text) self.panel.Layout() #self.values_rest[obj.name] = {"text": obj.text, "fg": obj.fg, "bg": obj.bg, "row": obj.row} elif isinstance(obj, Text): '''request to add text to the console''' #self.text_rest.add({"text": obj.text, "fg": obj.fg, "bg": obj.bg}) self.pending.append(obj) for p in self.pending: # we're scrolled at the bottom oldstyle = self.control.GetDefaultStyle() style = wx.TextAttr() style.SetTextColour(p.fg) style.SetBackgroundColour(p.bg) self.control.SetDefaultStyle(style) self.control.AppendText(p.text) self.control.SetDefaultStyle(oldstyle) self.pending = [] elif isinstance(obj, mp_menu.MPMenuTop): if obj is not None: self.SetMenuBar(None) self.menu = obj self.SetMenuBar(self.menu.wx_menu()) self.Bind(wx.EVT_MENU, self.on_menu) self.Refresh() self.Update() elif isinstance(obj, win_layout.WinLayout): win_layout.set_wx_window_layout(self, obj)
def AddCombo(self, label, choices): c = wx.ComboBox(choices=choices, parent=self.panel, style=0, value=choices[0]) self.AddControl(c, label, choices[0]) c.Bind(wx.EVT_COMBOBOX, self.OnValue) self.row.Add(wx.StaticText(self.panel, label=label), 0, wx.LEFT, 20) self.row.Add(c, 0, wx.LEFT, 20)
def InitUI(self): color = wx.Colour() color.SetFromString(LIGHT_BACKGROUND) self.SetBackgroundColour(scale_color(color, 0.95)) font = self.GetFont() font.SetWeight(wx.FONTWEIGHT_BOLD) font.SetPointSize(24) self.SetFont(font) self.SetMinSize((400, -1)) self.compass_text = wx.StaticText(self) self.fitness_value_text = wx.StaticText(self) font.SetWeight(wx.FONTWEIGHT_NORMAL) self.fitness_value_text.SetFont(font) self.parameters_sizer = self.CalibrationParameters() fitness_sizer = wx.BoxSizer(wx.HORIZONTAL) text = wx.StaticText(self, label='Fitness') text.SetFont(self.fitness_value_text.GetFont()) fitness_sizer.Add(text, proportion=1, flag=wx.EXPAND) fitness_sizer.Add(self.fitness_value_text) sizer = wx.BoxSizer(wx.VERTICAL) self.SetSizer(sizer) sizer.AddSpacer(16) sizer.Add(self.compass_text, border=16, flag=wx.LEFT | wx.RIGHT) sizer.AddSpacer(16) sizer.Add(self.StatusPanel(), flag=wx.EXPAND) sizer.AddSpacer(16) sizer.Add(fitness_sizer, border=16, flag=wx.LEFT | wx.RIGHT | wx.EXPAND) sizer.AddSpacer(16) sizer.Add(self.parameters_sizer, border=16, flag=wx.LEFT | wx.RIGHT | wx.BOTTOM | wx.EXPAND) sizer.Hide(self.parameters_sizer)
def StartRow(self, label=None): if self.row: self.EndRow() if label: self.row = wx.BoxSizer(wx.HORIZONTAL) text = wx.StaticText(self.panel, label=label) font = wx.Font(16, wx.DEFAULT, wx.NORMAL, wx.BOLD) text.SetFont(font) self.row.Add(text, 0, wx.LEFT, 10) self.vbox.Add(self.row, 0, wx.TOP, 10) self.row = wx.BoxSizer(wx.HORIZONTAL)
def legend_panel(*k, **kw): if MagcalPanel._legend_panel: return MagcalPanel._legend_panel p = MagcalPanel._legend_panel = wx.Panel(*k, **kw) sizer = wx.BoxSizer(wx.HORIZONTAL) p.SetSizer(sizer) marker = wx.Panel(p, wx.ID_ANY, size=(10, 10)) marker.SetBackgroundColour(MagcalPanel._empty_color) sizer.Add(marker, flag=wx.ALIGN_CENTER) text = wx.StaticText(p, wx.ID_ANY) text.SetLabel('Sections not hit') sizer.Add(text, border=4, flag=wx.ALIGN_CENTER | wx.LEFT) marker = wx.Panel(p, wx.ID_ANY, size=(10, 10)) marker.SetBackgroundColour(MagcalPanel._filled_color) sizer.Add(marker, border=10, flag=wx.ALIGN_CENTER | wx.LEFT) text = wx.StaticText(p, wx.ID_ANY) text.SetLabel('Sections hit') sizer.Add(text, border=4, flag=wx.ALIGN_CENTER | wx.LEFT) return p
def __init__(self, *k, **kw): super(MagcalPanel, self).__init__(*k, **kw) facecolor = self.GetBackgroundColour().GetAsString(wx.C2S_HTML_SYNTAX) fig = plt.figure(facecolor=facecolor, figsize=(1, 1)) self._canvas = FigureCanvas(self, wx.ID_ANY, fig) self._canvas.SetMinSize((300, 300)) self._id_text = wx.StaticText(self, wx.ID_ANY) self._status_text = wx.StaticText(self, wx.ID_ANY) self._completion_pct_text = wx.StaticText(self, wx.ID_ANY) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self._id_text) sizer.Add(self._status_text) sizer.Add(self._completion_pct_text) sizer.Add(self._canvas, proportion=1, flag=wx.EXPAND) self.SetSizer(sizer) ax = fig.add_subplot(111, axis_bgcolor=facecolor, projection='3d') self.configure_plot(ax)
def Header(self, parent): header = Panel(parent) header.SetBackgroundColour(LIGHT_BACKGROUND) sizer = wx.BoxSizer(wx.VERTICAL) header.SetSizer(sizer) font = header.GetFont() font.SetWeight(wx.FONTWEIGHT_BOLD) text = wx.StaticText(header) text.SetLabel('Compass Calibration') text.SetForegroundColour(PRIMARY_HIGHLIGHT) font.SetPointSize(26) text.SetFont(font) sizer.Add(text, border=16, flag=wx.ALL & ~wx.BOTTOM) text = wx.StaticText(header) text.SetLabel('Follow the procedure to calibrate your compass') font.SetPointSize(14) text.SetFont(font) sizer.Add(text, border=16, flag=wx.ALL & ~wx.TOP) return header
def StatusPanel(self): panel = Panel(self) panel.SetBackgroundColour(ReportDialog.light_background) self.status_icon = ReportDialog.StatusIcon(panel, size=(44, 44)) self.status_text = wx.StaticText(panel) sizer = wx.BoxSizer(wx.HORIZONTAL) panel.SetSizer(sizer) sizer.AddSpacer(16) sizer.Add(self.status_icon, border=5, flag=wx.TOP | wx.BOTTOM) sizer.AddSpacer(16) sizer.Add(self.status_text, flag=wx.ALIGN_CENTER) sizer.AddSpacer(16) return panel
def _add_input(self, setting, ctrl, ctrl2=None, value=None): tab_name = setting.tab label = setting.label tab = self.panel(tab_name) box = wx.BoxSizer(wx.HORIZONTAL) labelctrl = wx.StaticText(tab, -1, label) box.Add(labelctrl, 0, wx.ALIGN_CENTRE | wx.ALL, 5) box.Add(ctrl, 1, wx.ALIGN_CENTRE | wx.ALL, 5) if ctrl2 is not None: box.Add(ctrl2, 0, wx.ALIGN_CENTRE | wx.ALL, 5) self.sizer(tab_name).Add(box, 0, wx.GROW | wx.ALL, 5) self.controls[label] = ctrl if value is not None: ctrl.Value = value else: ctrl.Value = str(setting.value) self.control_map[ctrl.GetId()] = label self.setting_map[label] = setting
def LoaderProgress(self, parent): panel = wx.Panel(parent) panel.SetBackgroundColour(parent.GetBackgroundColour()) font = panel.GetFont() font.MakeItalic() panel.SetFont(font) self.load_progress = wx.Gauge(panel, size=(-1, 10)) self.load_progress_last_time = time.time() self.load_text = wx.StaticText(panel) sizer = wx.BoxSizer(wx.VERTICAL) panel.SetSizer(sizer) sizer.Add(self.load_progress, border=10, flag=wx.EXPAND | wx.LEFT | wx.RIGHT) sizer.Add(self.load_text, border=10, flag=wx.LEFT | wx.RIGHT) return panel
def __init__(self, state, parent): wx.Panel.__init__(self, parent) # , style=wx.BORDER_SIMPLE) self.state = state self.sizer = wx.BoxSizer(wx.VERTICAL) self.titleText = wx.StaticText( self, label="Unassigned Vehicles -->\n\nTools:") self.sizer.Add(self.titleText, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=5) self.getParamsButton = wx.Button( self, label="Get offsets", size=wx.Size(100, 50)) self.Bind(wx.EVT_BUTTON, self.getParams, self.getParamsButton) self.resetButton = wx.Button( self, label="Reset layout", size=wx.Size(100, 50)) self.Bind(wx.EVT_BUTTON, self.reset, self.resetButton) self.sizer.Add(self.getParamsButton) self.sizer.Add(self.resetButton) # Do the sizer layout self.SetSizer(self.sizer)
def ProgressPanel(self, parent): panel = Panel(parent) panel.SetBackgroundColour(LIGHT_BACKGROUND) self.progress = wx.StaticText(panel, label='0%') font = self.progress.GetFont() font.SetPointSize(70) font.SetWeight(wx.FONTWEIGHT_BOLD) self.progress.SetFont(font) self.grid = GeodesicGrid(panel) self.grid.SetMinSize((365, 365)) sizer = wx.BoxSizer(wx.VERTICAL) panel.SetSizer(sizer) sizer.AddStretchSpacer() sizer.Add(self.grid, flag=wx.ALIGN_CENTER) sizer.AddStretchSpacer() sizer.AddSpacer(16) sizer.Add(self.progress, flag=wx.ALIGN_CENTER) sizer.AddStretchSpacer() return panel
def CalibrationParameters(self): self.offsets_texts = tuple(wx.StaticText(self) for _ in range(3)) self.diagonals_texts = tuple(wx.StaticText(self) for _ in range(3)) self.offdiagonals_texts = tuple( wx.StaticText(self) for _ in range(3)) table = ( ('Offsets', self.offsets_texts), ('Diagonals', self.diagonals_texts), ('Off-diagonals', self.offdiagonals_texts), ) sizer = wx.FlexGridSizer(len(table) + 1, 4, 4, 10) sizer.AddGrowableCol(0) font = self.GetFont() font.SetPointSize(14) font.MakeItalic() text = wx.StaticText(self, label='Parameter') text.SetFont(font) sizer.Add(text) for label in ('X', 'Y', 'Z'): text = wx.StaticText(self, label=label) text.SetFont(font) sizer.Add(text, flag=wx.ALIGN_CENTER) font.SetWeight(wx.FONTWEIGHT_NORMAL) for label, (x, y, z) in table: text = wx.StaticText(self) text.SetLabel(label) text.SetFont(font) x.SetFont(font) y.SetFont(font) z.SetFont(font) sizer.Add(text) sizer.Add(x, flag=wx.ALIGN_RIGHT) sizer.Add(y, flag=wx.ALIGN_RIGHT) sizer.Add(z, flag=wx.ALIGN_RIGHT) return sizer
def __init__(self, conn): super(MagcalFrame, self).__init__( None, wx.ID_ANY, title='Magcal Graph', ) self.SetMinSize((300, 300)) self._conn = conn self._main_panel = wx.ScrolledWindow(self, wx.ID_ANY) self._main_panel.SetScrollbars(1, 1, 1, 1) self._magcal_panels = {} self._sizer = wx.BoxSizer(wx.VERTICAL) self._main_panel.SetSizer(self._sizer) idle_text = wx.StaticText(self._main_panel, wx.ID_ANY) idle_text.SetLabelMarkup( '<i>No calibration messages received yet...</i>') idle_text.SetForegroundColour('#444444') self._sizer.AddStretchSpacer() self._sizer.Add( idle_text, proportion=0, flag=wx.ALIGN_CENTER | wx.ALL, border=10, ) self._sizer.AddStretchSpacer() self._timer = wx.Timer(self) self.Bind(wx.EVT_TIMER, self.timer_callback, self._timer) self._timer.Start(200)
def updateLayout(self, layout): '''Update (recreate) the GUI layout, based on known vehicles''' leaders = [] # array of (sysid, compid, followid, vehtype) # create list of leaders, another vehicle has it's sysid as leader for veh in layout: for vehL in layout: if vehL[2] == veh[0] and veh not in leaders: leaders.append(veh) # create list of followers followers = {} # dict of key=leadersysid, (sysid, compid, vehtype) maxfollowers = 0 for veh in layout: # don't include leaders in the follower list if veh[2] != 0: if veh[2] not in followers.keys(): followers[veh[2]] = [(veh[0], veh[1], veh[3])] else: followers[veh[2]].append((veh[0], veh[1], veh[3])) if len(followers[veh[2]]) > maxfollowers: maxfollowers = len(followers[veh[2]]) # sort followers by sysid increasing for fwr in followers.keys(): followers[fwr].sort(key=lambda tup: tup[0]) # Any unassigned vehicles: Leader with 0 followers OR leader not present # OR vehicles not present in either list (leftovers) unassignedVeh = [] # (sysid, compid, vehtype) # Leader with no followers for index, veh in enumerate(leaders): if veh[0] not in followers.keys(): del leaders[index] unassignedVeh.append((veh[0], veh[1], veh[3])) # Not present in either list allfollowersflat = [] for fl in followers.items(): for vv in fl[1]: allfollowersflat.append(vv[0]) for veh in layout: if (veh not in leaders) and veh[0] not in allfollowersflat: unassignedVeh.append((veh[0], veh[1], veh[3])) # Leader not present for leader in followers.copy().keys(): if leader not in [i[0] for i in leaders]: for veh in followers[leader]: unassignedVeh.append(veh) del followers[leader] # followers.remove(leader) self.sizer.Clear(True) colsVeh = max(maxfollowers, len(unassignedVeh)) self.sizer = wx.FlexGridSizer((len(leaders)*2) + 1, colsVeh+1+1, 5, 0) # start populating the grid # for each row: for leader in leaders: panelLeader = VehiclePanel( self.state, self.panel, leader[0], leader[1], leader[3], True, followers[leader[0]], self.takeoffalt) self.sizer.Add(panelLeader) # add vertical line line = wx.StaticLine(self.panel, style=wx.LI_VERTICAL) self.sizer.Add(line, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=5) for follower in range(colsVeh): if leader[0] in followers.keys() and len(followers[leader[0]]) > follower: panelFollower = VehiclePanel(self.state, self.panel, followers[leader[0]][follower][0], followers[ leader[0]][follower][1], followers[leader[0]][follower][2], False, None, self.takeoffalt) else: panelFollower = wx.StaticText(self.panel, label="N/A") self.sizer.Add(panelFollower, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=5) # add horizontal line, column by column for follower in range(colsVeh+1+1): line = wx.StaticLine(self.panel, style=wx.LI_HORIZONTAL) self.sizer.Add(line, proportion=0, flag=wx.EXPAND | wx.ALL, border=0) # add "unassigned" row panelUnassigned = UnassignedPanel(self.state, self.panel) self.sizer.Add(panelUnassigned, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=5) line = wx.StaticLine(self.panel, style=wx.LI_VERTICAL) self.sizer.Add(line, proportion=0, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=5) for veh in unassignedVeh: panelunassigned = VehiclePanel( self.state, self.panel, veh[0], veh[1], veh[2], False, None, self.takeoffalt) self.sizer.Add(panelunassigned) self.panel.SetSizer(self.sizer) self.panel.Layout() self.panel.SetupScrolling()
def on_timer(self, event): state = self.state if state.close_event.wait(0.001): self.timer.Stop() self.Destroy() return while state.child_pipe_recv.poll(): try: obj = state.child_pipe_recv.recv() except EOFError: self.timer.Stop() self.Destroy() return if isinstance(obj, Value): # request to set a status field if obj.name not in self.values: # create a new status field statictextbox = wx.StaticText(self.panel, -1, obj.text) font = wx.Font(18, wx.DEFAULT, wx.NORMAL, wx.NORMAL) statictextbox.SetFont(font) # possibly add more status rows for i in range(len(self.status), obj.row + 1): self.status.append(wx.BoxSizer(wx.HORIZONTAL)) self.vbox.Insert(len(self.status) - 1, self.status[i], 0, flag=wx.ALIGN_LEFT | wx.TOP) self.vbox.Layout() self.status[obj.row].Add(statictextbox, border=5) self.status[obj.row].AddSpacer(20) self.values[obj.name] = statictextbox statictextbox = self.values[obj.name] statictextbox.SetForegroundColour(obj.fg) statictextbox.SetBackgroundColour(obj.bg) statictextbox.SetLabel(obj.text) self.panel.Layout() elif isinstance(obj, Text): '''request to add text to the console''' self.pending.append(obj) for p in self.pending: # we're scrolled at the bottom oldstyle = self.control.GetDefaultStyle() style = wx.TextAttr() style.SetTextColour(p.fg) style.SetBackgroundColour(p.bg) self.control.SetDefaultStyle(style) self.control.AppendText(p.text) self.control.SetDefaultStyle(oldstyle) self.pending = [] elif isinstance(obj, mp_menu.MPMenuTop): if obj is not None: self.SetMenuBar(None) self.menu = obj self.SetMenuBar(self.menu.wx_menu()) self.Bind(wx.EVT_MENU, self.on_menu) self.Refresh() self.Update() elif isinstance(obj, mp_menu.MPButton): if obj is not None: newbtn = wx.Button(self.panel, label=obj.label) newbtn.Bind(wx.EVT_BUTTON, self.on_button) self.buttongridsizer.Add(newbtn, 0, wx.EXPAND) self.buttons.append(obj) elif isinstance(obj, win_layout.WinLayout): win_layout.set_wx_window_layout(self, obj)
def __init__(self, state, parent, sysid, compid, vehtype, isLeader, listFollowers, takeoffalt): wx.Panel.__init__(self, parent) self.state = state self.sysid = sysid self.compid = compid self.listFollowers = listFollowers self.isLeader = isLeader self.vehtype = vehtype self.takeoffalt = takeoffalt self.inLinkLoss = False # XYZ offsets. Filled are we get params self.offsetValues = [None, None, None] self.sizer = wx.BoxSizer(wx.VERTICAL) # Status boxes if self.isLeader: self.title = wx.StaticText(self, label="Leader {0}:{1} {2}".format( sysid, compid, get_vehicle_name(vehtype))) self.offsets = wx.StaticText(self, label="Offset: N/A") else: self.title = wx.StaticText(self, label="Veh {0}:{1} {2}".format( sysid, compid, get_vehicle_name(vehtype))) self.offsets = wx.StaticText(self, label="Offset: xxxxxx") self.armmode = wx.StaticText(self, label="armed/mode N/A ") self.thrAlt = wx.StaticText( self, label="Alt: {0}m Thr: {1}%".format(0, 0)) self.altRel = wx.StaticText(self, label="Rel Alt: {0}m".format(0)) self.battery = wx.StaticText(self, label="Battery: {0}V".format(0)) self.status = wx.StaticText(self, label="Status: N/A") self.prearm = wx.StaticText(self, label="Prearm: N/A") self.statusText = wx.TextCtrl( self, style=wx.TE_READONLY | wx.TE_MULTILINE, size=wx.Size(140, 100)) # Command buttons self.doArm = wx.Button(self, label="XXX", size=wx.Size(100, 50)) self.Bind(wx.EVT_BUTTON, self.arm, self.doArm) if self.isLeader: self.armSizer = wx.BoxSizer(wx.HORIZONTAL) self.doArmAll = wx.Button(self, label="ALL", size=wx.Size(70, 50)) self.Bind(wx.EVT_BUTTON, self.armAll, self.doArmAll) self.doGuided = wx.Button( self, label="Mode GUIDED", size=wx.Size(100, 50)) self.Bind(wx.EVT_BUTTON, self.guided, self.doGuided) if self.isLeader: self.guidedSizer = wx.BoxSizer(wx.HORIZONTAL) self.doGuidedAll = wx.Button( self, label="ALL", size=wx.Size(70, 50)) self.Bind(wx.EVT_BUTTON, self.guidedAll, self.doGuidedAll) if vehtype != mavutil.mavlink.MAV_TYPE_GROUND_ROVER: self.doGuidedTakeoff = wx.Button( self, label="GUIDED T/O {0}m".format(self.takeoffalt), size=wx.Size(130, 50)) self.Bind(wx.EVT_BUTTON, self.guidedTakeoff, self.doGuidedTakeoff) if self.isLeader: self.takeoffSizer = wx.BoxSizer(wx.HORIZONTAL) self.doGuidedTakeoffAll = wx.Button( self, label="ALL".format(self.takeoffalt), size=wx.Size(70, 50)) self.Bind(wx.EVT_BUTTON, self.guidedTakeoffAll, self.doGuidedTakeoffAll) self.doRTL = wx.Button(self, label="Mode RTL", size=wx.Size(100, 50)) self.Bind(wx.EVT_BUTTON, self.rtl, self.doRTL) if self.isLeader: self.rtlSizer = wx.BoxSizer(wx.HORIZONTAL) self.doRTLAll = wx.Button(self, label="ALL", size=wx.Size(70, 50)) self.Bind(wx.EVT_BUTTON, self.rtlAll, self.doRTLAll) self.doKill = wx.Button(self, label="KILL", size=wx.Size(100, 50)) self.killTimer = None self.Bind(wx.EVT_BUTTON, self.kill, self.doKill) if self.isLeader: self.killSizer = wx.BoxSizer(wx.HORIZONTAL) self.doKillAll = wx.Button(self, label="ALL", size=wx.Size(70, 50)) self.killAllTimer = None self.Bind(wx.EVT_BUTTON, self.killall, self.doKillAll) if self.isLeader: self.doFollowAll = wx.Button( self, label="All Follow Leader", size=wx.Size(130, 50)) self.Bind(wx.EVT_BUTTON, self.followAll, self.doFollowAll) self.doAUTO = wx.Button( self, label="Mode AUTO", size=wx.Size(100, 50)) self.Bind(wx.EVT_BUTTON, self.auto, self.doAUTO) else: self.doFollow = wx.Button( self, label="Mode Follow", size=wx.Size(100, 50)) self.Bind(wx.EVT_BUTTON, self.follow, self.doFollow) # Do the sizer layout self.doSizer() # get offset params. Needs to be after GUI elements are created time.sleep(0.05) self.state.child_pipe.send(("getoffsets", self.sysid, self.compid))