def __init__(self, parent, table_a, table_b, col_a=None, col_b=None, allow_delete=True, **kwargs): wx.Panel.__init__(self, parent, **kwargs) self.table_a = table_a self.table_b = table_b self.aChoice = ComboBox(self, choices=db.GetColumnNames(table_a), size=(100,-1), style=wx.CB_READONLY) self.bChoice = ComboBox(self, choices=db.GetColumnNames(table_b), size=(100,-1), style=wx.CB_READONLY) if col_a in self.aChoice.Strings: self.aChoice.Select(self.aChoice.Strings.index(col_a)) if col_b in self.bChoice.Strings: self.bChoice.Select(self.bChoice.Strings.index(col_b)) if allow_delete: self.x_btn = wx.Button(self, -1, 'x', size=(30,-1)) self.Sizer = wx.BoxSizer(wx.HORIZONTAL) self.Sizer.Add(wx.StaticText(self, -1, table_a+'.'), 0, wx.TOP, 4) self.Sizer.Add(self.aChoice, 1, wx.EXPAND) self.Sizer.AddSpacer((10,-1)) self.Sizer.Add(wx.StaticText(self, -1, '<=>'), 0, wx.TOP, 4) self.Sizer.AddSpacer((10,-1)) self.Sizer.Add(wx.StaticText(self, -1, table_b+'.'), 0, wx.TOP, 4) self.Sizer.Add(self.bChoice, 1, wx.EXPAND) if allow_delete: self.Sizer.AddSpacer((10,-1)) self.Sizer.Add(self.x_btn) self.x_btn.Bind(wx.EVT_BUTTON, self.GrandParent.on_remove_panel)
def __init__(self, parent, figpanel, **kwargs): wx.Panel.__init__(self, parent, **kwargs) # the panel to draw charts on self.SetBackgroundColour('white') # color for the background of panel self.figpanel = figpanel sizer = wx.BoxSizer(wx.VERTICAL) self.x_columns = [] # column names to plot if selecting multiple columns self.table_choice = ui.TableComboBox(self, -1, style=wx.CB_READONLY) self.x_choice = ComboBox(self, -1, size=(200,-1)) self.x_multiple = wx.Button(self, -1, 'select multiple') self.group_choice = ComboBox(self, -1, choices=[NO_GROUP]+p._groups_ordered, style=wx.CB_READONLY) self.group_choice.Select(0) self.filter_choice = ui.FilterComboBox(self, style=wx.CB_READONLY) self.filter_choice.Select(0) self.update_chart_btn = wx.Button(self, -1, "Update Chart") self.update_column_fields() sz = wx.BoxSizer(wx.HORIZONTAL) sz.Add(wx.StaticText(self, -1, "table:"), 0, wx.TOP, 4) sz.AddSpacer((3,-1)) sz.Add(self.table_choice, 1, wx.EXPAND) sz.AddSpacer((3,-1)) sz.Add(wx.StaticText(self, -1, "measurement:"), 0, wx.TOP, 4) sz.AddSpacer((3,-1)) sz.Add(self.x_choice, 2, wx.EXPAND) sz.AddSpacer((3,-1)) sz.Add(self.x_multiple, 0, wx.EXPAND|wx.TOP, 2) sizer.Add(sz, 1, wx.EXPAND) sizer.AddSpacer((-1,3)) sz = wx.BoxSizer(wx.HORIZONTAL) sz.Add(wx.StaticText(self, -1, "group x-axis by:"), 0, wx.TOP, 4) sz.AddSpacer((3,-1)) sz.Add(self.group_choice, 1, wx.EXPAND) sizer.Add(sz, 1, wx.EXPAND) sizer.AddSpacer((-1,3)) sz = wx.BoxSizer(wx.HORIZONTAL) sz.Add(wx.StaticText(self, -1, "filter:"), 0, wx.TOP, 4) sz.AddSpacer((3,-1)) sz.Add(self.filter_choice, 1, wx.EXPAND) sizer.Add(sz, 1, wx.EXPAND) sizer.AddSpacer((-1,3)) sizer.Add(self.update_chart_btn) wx.EVT_BUTTON(self.x_multiple, -1, self.on_select_multiple) wx.EVT_COMBOBOX(self.table_choice, -1, self.on_table_selected) wx.EVT_COMBOBOX(self.x_choice, -1, self.on_column_selected) wx.EVT_BUTTON(self.update_chart_btn, -1, self.update_figpanel) self.SetSizer(sizer) self.Show(1)
def __init__(self, parent, tables, allow_delete=True, expression=None, **kwargs): wx.Panel.__init__(self, parent, **kwargs) self.fieldSets = [] self.tables = tables self.types = {} self.types[p.image_table] = db.GetColumnTypes(p.image_table) self.tableChoice = ComboBox(self, choices=self.tables, size=(150, -1), style=wx.CB_READONLY) self.tableChoice.Select(0) self.colChoice = ComboBox(self, choices=db.GetColumnNames(p.image_table), size=(150, -1), style=wx.CB_READONLY) self.colChoice.Select(0) self.comparatorChoice = ComboBox(self, size=(80, -1)) self.update_comparator_choice() self.valueField = wx.ComboBox(self, -1, value='') if allow_delete: self.x_btn = wx.Button(self, -1, 'x', size=(30, -1)) ## if expression is not None: ## self.set_expression(expression) colSizer = wx.BoxSizer(wx.HORIZONTAL) colSizer.Add(self.tableChoice, 1, wx.EXPAND) colSizer.AddSpacer((5, -1)) colSizer.Add(self.colChoice, 1, wx.EXPAND) colSizer.AddSpacer((5, -1)) colSizer.Add(self.comparatorChoice, 0.5, wx.EXPAND) colSizer.AddSpacer((5, -1)) colSizer.Add(self.valueField, 1, wx.EXPAND) if allow_delete: colSizer.AddSpacer((5, -1)) colSizer.Add(self.x_btn, 0, wx.EXPAND) self.SetSizer(colSizer) self.tableChoice.Bind(wx.EVT_COMBOBOX, self.on_select_table) self.colChoice.Bind(wx.EVT_COMBOBOX, self.on_select_col) if allow_delete: self.x_btn.Bind(wx.EVT_BUTTON, self.on_remove) self.Fit()
def AddPlateMap(self, plateIndex=0): ''' Adds a new blank plateMap to the PlateMapSizer. ''' data = np.ones(p.plate_shape) # Try to get explicit labels for all wells. res = db.execute('SELECT DISTINCT %s FROM %s WHERE %s != "" and %s IS NOT NULL'% (dbconnect.UniqueWellClause(), p.image_table, p.well_id, p.well_id)) if p.plate_id: self.plateMapChoices += [ComboBox(self, choices=db.GetPlateNames(), size=(400,-1))] self.plateMapChoices[-1].Select(plateIndex) self.plateMapChoices[-1].Bind(wx.EVT_COMBOBOX, self.OnSelectPlate) #plate_col_type = db.GetColumnType(p.image_table, p.plate_id) #plate_id = plate_col_type(self.plateMapChoices[-1].GetString(plateIndex)) plateMapChoiceSizer = wx.BoxSizer(wx.HORIZONTAL) plateMapChoiceSizer.Add(wx.StaticText(self, label='Plate:'), flag=wx.ALIGN_CENTER_VERTICAL) plateMapChoiceSizer.Add(self.plateMapChoices[-1], flag=wx.ALIGN_CENTER_VERTICAL) well_keys = res platemap = pmp.PlateMapPanel(self, data, well_keys, p.plate_shape, colormap = self.colorMapsChoice.Value, well_disp = self.wellDisplayChoice.Value) platemap.add_well_selection_handler(self.OnSelectWell) self.plateMaps += [platemap] singlePlateMapSizer = wx.BoxSizer(wx.VERTICAL) if p.plate_id: singlePlateMapSizer.Add(plateMapChoiceSizer, 0, wx.ALIGN_CENTER) singlePlateMapSizer.Add(platemap, 1, wx.EXPAND|wx.ALIGN_CENTER) self.plateMapSizer.Add(singlePlateMapSizer, 1, wx.EXPAND|wx.ALIGN_CENTER)
def __init__(self, parent, fig_sco, fig_load, **kwargs): wx.Panel.__init__(self, parent, **kwargs) self.fig_sco = fig_sco self.fig_load = fig_load sizer = wx.BoxSizer(wx.VERTICAL) self.method_choice = ComboBox(self, -1, choices=[SVD, TSNE], style=wx.CB_READONLY) self.method_choice.Select(0) self.update_chart_btn = wx.Button(self, -1, "Show plot") self.help_btn = wx.Button(self, -1, "About") sz = wx.BoxSizer(wx.HORIZONTAL) sz.Add(wx.StaticText(self, -1, "Method:")) sz.AddSpacer((5, -1)) sz.Add(self.method_choice, 1, wx.EXPAND) sizer.Add(sz, 1, wx.EXPAND) sizer.AddSpacer((-1, 5)) sz2 = wx.BoxSizer(wx.HORIZONTAL) sz2.Add(self.help_btn, wx.LEFT) sz2.AddSpacer((400, -1)) sz2.Add(self.update_chart_btn, wx.RIGHT) sizer.Add(sz2, 1, wx.EXPAND) sizer.AddSpacer((-1, 5)) wx.EVT_BUTTON(self.update_chart_btn, -1, self.on_show_pressed) wx.EVT_BUTTON(self.help_btn, -1, self.on_show_about) self.SetSizer(sizer) self.Show(1)
def __init__(self, parent, size=(800,-1), **kwargs): wx.Frame.__init__(self, parent, -1, size=size, title='Plate Viewer', **kwargs) CPATool.__init__(self) self.SetName(self.tool_name) self.SetBackgroundColour("white") # Fixing the color # Check for required properties fields. fail = False for field in required_fields: if not p.field_defined(field): fail = True raise Exception('Properties field "%s" is required for PlateViewer.'%(field)) if fail: self.Destroy() return self.chMap = p.image_channel_colors[:] self.menuBar = wx.MenuBar() self.SetMenuBar(self.menuBar) self.fileMenu = wx.Menu() self.exitMenuItem = self.fileMenu.Append(id=wx.ID_EXIT, text='Exit\tCtrl+Q', help='Close Plate Viewer') self.GetMenuBar().Append(self.fileMenu, 'File') self.menuBar.Append(cpa.helpmenu.make_help_menu(self), 'Help') save_csv_menu_item = self.fileMenu.Append(-1, 'Save table to CSV\tCtrl+S') self.Bind(wx.EVT_MENU, self.on_save_csv, save_csv_menu_item) wx.EVT_MENU(self, wx.ID_EXIT, lambda _:self.Close()) dataSourceSizer = wx.StaticBoxSizer(wx.StaticBox(self, label='Source:'), wx.VERTICAL) dataSourceSizer.Add(wx.StaticText(self, label='Data source:')) self.sourceChoice = TableComboBox(self, -1, size=fixed_width) dataSourceSizer.Add(self.sourceChoice) dataSourceSizer.AddSpacer((-1,3)) dataSourceSizer.Add(wx.StaticText(self, label='Measurement:')) measurements = get_non_blob_types_from_table(p.image_table) self.measurementsChoice = ComboBox(self, choices=measurements, size=fixed_width) self.measurementsChoice.Select(0) dataSourceSizer.Add(self.measurementsChoice) dataSourceSizer.Add(wx.StaticText(self, label='Filter:')) self.filterChoice = FilterComboBox(self, size=fixed_width) dataSourceSizer.Add(self.filterChoice) groupingSizer = wx.StaticBoxSizer(wx.StaticBox(self, label='Data aggregation:'), wx.VERTICAL) groupingSizer.Add(wx.StaticText(self, label='Aggregation method:')) aggregation = ['mean', 'sum', 'median', 'stdev', 'cv%', 'min', 'max'] self.aggregationMethodsChoice = ComboBox(self, choices=aggregation, size=fixed_width) self.aggregationMethodsChoice.Select(0) groupingSizer.Add(self.aggregationMethodsChoice) viewSizer = wx.StaticBoxSizer(wx.StaticBox(self, label='View options:'), wx.VERTICAL) viewSizer.Add(wx.StaticText(self, label='Color map:')) maps = [m for m in matplotlib.cm.datad.keys() if not m.endswith("_r")] maps.sort() self.colorMapsChoice = ComboBox(self, choices=maps, size=fixed_width) self.colorMapsChoice.SetSelection(maps.index('jet')) viewSizer.Add(self.colorMapsChoice) viewSizer.AddSpacer((-1,3)) viewSizer.Add(wx.StaticText(self, label='Well display:')) if p.image_thumbnail_cols: choices = pmp.all_well_shapes else: choices = list(pmp.all_well_shapes) choices.remove(pmp.THUMBNAIL) self.wellDisplayChoice = ComboBox(self, choices=choices, size=fixed_width) self.wellDisplayChoice.Select(0) viewSizer.Add(self.wellDisplayChoice) viewSizer.AddSpacer((-1,3)) viewSizer.Add(wx.StaticText(self, label='Number of plates:')) self.numberOfPlatesTE = wx.TextCtrl(self, -1, '1', style=wx.TE_PROCESS_ENTER) viewSizer.Add(self.numberOfPlatesTE) if not p.plate_id: self.numberOfPlatesTE.Disable() annotationSizer = wx.StaticBoxSizer(wx.StaticBox(self, label='Annotation:'), wx.VERTICAL) annotationSizer.Add(wx.StaticText(self, label='Annotation column:')) annotationColSizer = wx.BoxSizer(wx.HORIZONTAL) self.annotation_cols = dict([(col, db.GetColumnType(p.image_table, col)) for col in db.GetUserColumnNames(p.image_table)]) self.annotationCol = ComboBox(self, choices=self.annotation_cols.keys(), size=(120,-1)) if len(self.annotation_cols) > 0: self.annotationCol.SetSelection(0) annotationColSizer.Add(self.annotationCol, flag=wx.ALIGN_CENTER_VERTICAL) annotationColSizer.AddSpacer((3,-1)) self.addAnnotationColBtn = wx.Button(self, -1, 'Add', size=(44,-1)) annotationColSizer.Add(self.addAnnotationColBtn, flag=wx.ALIGN_CENTER_VERTICAL) annotationSizer.Add(annotationColSizer) annotationSizer.AddSpacer((-1,3)) annotationSizer.Add(wx.StaticText(self, label='Label:')) self.annotationLabel = wx.TextCtrl(self, -1, 'Select wells')#, style=wx.TE_PROCESS_ENTER) self.annotationLabel.Disable() self.annotationLabel.SetForegroundColour(wx.Colour(80,80,80)) self.annotationLabel.SetBackgroundColour(wx.LIGHT_GREY) annotationSizer.Add(self.annotationLabel) annotationSizer.AddSpacer((-1,3)) self.outlineMarked = wx.CheckBox(self, -1, label='Outline annotated wells') annotationSizer.Add(self.outlineMarked) annotationSizer.AddSpacer((-1,3)) self.annotationShowVals = wx.CheckBox(self, -1, label='Show values on plate') annotationSizer.Add(self.annotationShowVals) if len(db.GetUserColumnNames(p.image_table)) == 0: self.outlineMarked.Disable() self.annotationShowVals.Disable() controlSizer = wx.BoxSizer(wx.VERTICAL) controlSizer.Add(dataSourceSizer, 0, wx.EXPAND) controlSizer.AddSpacer((-1,3)) controlSizer.Add(groupingSizer, 0, wx.EXPAND) controlSizer.AddSpacer((-1,3)) controlSizer.Add(viewSizer, 0, wx.EXPAND) controlSizer.AddSpacer((-1,3)) controlSizer.Add(annotationSizer, 0 , wx.EXPAND) self.plateMapSizer = wx.GridSizer(1,1,5,5) self.plateMaps = [] self.plateMapChoices = [] self.rightSizer = wx.BoxSizer(wx.VERTICAL) self.rightSizer.Add(self.plateMapSizer, 1, wx.EXPAND|wx.BOTTOM, 10) self.colorBar = ColorBarPanel(self, 'jet', size=(-1,25)) self.rightSizer.Add(self.colorBar, 0, wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL) mainSizer = wx.BoxSizer(wx.HORIZONTAL) mainSizer.Add(controlSizer, 0, wx.LEFT|wx.TOP|wx.BOTTOM, 10) mainSizer.Add(self.rightSizer, 1, wx.EXPAND|wx.ALL, 10) self.SetSizer(mainSizer) self.SetClientSize((self.Size[0],self.Sizer.CalcMin()[1])) self.sourceChoice.Bind(wx.EVT_COMBOBOX, self.UpdateMeasurementChoice) self.measurementsChoice.Bind(wx.EVT_COMBOBOX, self.OnSelectMeasurement) self.measurementsChoice.Select(0) self.aggregationMethodsChoice.Bind(wx.EVT_COMBOBOX, self.OnSelectAggregationMethod) self.colorMapsChoice.Bind(wx.EVT_COMBOBOX, self.OnSelectColorMap) self.numberOfPlatesTE.Bind(wx.EVT_TEXT_ENTER, self.OnEnterNumberOfPlates) self.wellDisplayChoice.Bind(wx.EVT_COMBOBOX, self.OnSelectWellDisplay) self.annotationCol.Bind(wx.EVT_COMBOBOX, self.OnSelectAnnotationCol) self.addAnnotationColBtn.Bind(wx.EVT_BUTTON, self.OnAddAnnotationCol) self.annotationLabel.Bind(wx.EVT_KEY_UP, self.OnEnterAnnotation) self.outlineMarked.Bind(wx.EVT_CHECKBOX, self.OnOutlineMarked) self.annotationShowVals.Bind(wx.EVT_CHECKBOX, self.OnShowAnnotationValues) self.filterChoice.Bind(wx.EVT_COMBOBOX, self.OnSelectFilter) self.AddPlateMap() self.OnSelectMeasurement()
def __init__(self, parent, figpanel, **kwargs): wx.Panel.__init__(self, parent, **kwargs) # the panel to draw charts on self.figpanel = figpanel sizer = wx.BoxSizer(wx.VERTICAL) self.x_table_choice = ui.TableComboBox(self, -1, style=wx.CB_READONLY) self.y_table_choice = ui.TableComboBox(self, -1, style=wx.CB_READONLY) self.x_choice = ComboBox(self, -1, size=(200, -1), style=wx.CB_READONLY) self.y_choice = ComboBox(self, -1, size=(200, -1), style=wx.CB_READONLY) self.gridsize_input = wx.TextCtrl(self, -1, '50') maps = [m for m in matplotlib.cm.datad.keys() if not m.endswith("_r")] maps.sort() self.colormap_choice = ComboBox(self, -1, choices=maps, style=wx.CB_READONLY) self.colormap_choice.SetSelection(maps.index('jet')) self.color_scale_choice = ComboBox(self, -1, choices=[LINEAR_SCALE, LOG_SCALE], style=wx.CB_READONLY) self.color_scale_choice.Select(0) self.x_scale_choice = ComboBox(self, -1, choices=[LINEAR_SCALE, LOG_SCALE], style=wx.CB_READONLY) self.x_scale_choice.Select(0) self.y_scale_choice = ComboBox(self, -1, choices=[LINEAR_SCALE, LOG_SCALE], style=wx.CB_READONLY) self.y_scale_choice.Select(0) self.filter_choice = ui.FilterComboBox(self, style=wx.CB_READONLY) self.gate_choice = ui.GateComboBox(self, style=wx.CB_READONLY) self.update_chart_btn = wx.Button(self, -1, "Update Chart") self.update_x_choices() self.update_y_choices() sz = wx.BoxSizer(wx.HORIZONTAL) sz.Add(wx.StaticText(self, -1, "x-axis:"), 0, wx.TOP, 4) sz.AddSpacer((3, -1)) sz.Add(self.x_table_choice, 1, wx.EXPAND) sz.AddSpacer((3, -1)) sz.Add(self.x_choice, 2, wx.EXPAND) sz.AddSpacer((5, -1)) sz.Add(wx.StaticText(self, -1, "scale:"), 0, wx.TOP, 4) sz.AddSpacer((3, -1)) sz.Add(self.x_scale_choice) sizer.Add(sz, 1, wx.EXPAND) sizer.AddSpacer((-1, 2)) sz = wx.BoxSizer(wx.HORIZONTAL) sz.Add(wx.StaticText(self, -1, "y-axis:"), 0, wx.TOP, 4) sz.AddSpacer((3, -1)) sz.Add(self.y_table_choice, 1, wx.EXPAND) sz.AddSpacer((3, -1)) sz.Add(self.y_choice, 2, wx.EXPAND) sz.AddSpacer((5, -1)) sz.Add(wx.StaticText(self, -1, "scale:"), 0, wx.TOP, 4) sz.AddSpacer((3, -1)) sz.Add(self.y_scale_choice) sizer.Add(sz, 1, wx.EXPAND) sizer.AddSpacer((-1, 2)) sz = wx.BoxSizer(wx.HORIZONTAL) sz.Add(wx.StaticText(self, -1, "grid size:"), 0, wx.TOP, 4) sz.AddSpacer((3, -1)) sz.Add(self.gridsize_input, 1, wx.TOP, 3) sz.AddSpacer((5, -1)) sz.Add(wx.StaticText(self, label='color map:'), 0, wx.TOP, 4) sz.AddSpacer((3, -1)) sz.Add(self.colormap_choice, 1, wx.EXPAND) sz.AddSpacer((5, -1)) sz.Add(wx.StaticText(self, label='color scale:'), 0, wx.TOP, 4) sz.AddSpacer((3, -1)) sz.Add(self.color_scale_choice, 1, wx.EXPAND) sizer.Add(sz, 1, wx.EXPAND) sizer.AddSpacer((-1, 5)) sz = wx.BoxSizer(wx.HORIZONTAL) sz.Add(wx.StaticText(self, -1, "filter:"), 0, wx.TOP, 4) sz.AddSpacer((3, -1)) sz.Add(self.filter_choice, 1, wx.EXPAND) sz.AddSpacer((5, -1)) sz.Add(wx.StaticText(self, -1, "gate:"), 0, wx.TOP, 4) sz.AddSpacer((3, -1)) sz.Add(self.gate_choice, 1, wx.EXPAND) sizer.Add(sz, 1, wx.EXPAND) sizer.AddSpacer((-1, 5)) sizer.Add(self.update_chart_btn) wx.EVT_COMBOBOX(self.x_table_choice, -1, self.on_x_table_selected) wx.EVT_COMBOBOX(self.y_table_choice, -1, self.on_y_table_selected) self.gate_choice.addobserver(self.on_gate_selected) wx.EVT_COMBOBOX(self.colormap_choice, -1, self.on_cmap_selected) wx.EVT_BUTTON(self.update_chart_btn, -1, self.update_figpanel) self.SetSizer(sizer) self.Show(1)
def __init__(self, parent, figpanel, **kwargs): wx.Panel.__init__(self, parent, **kwargs) # the panel to draw charts on self.SetBackgroundColour('white') # color for the background of panel self.figpanel = figpanel sizer = wx.BoxSizer(wx.VERTICAL) self.table_choice = ui.TableComboBox(self, -1, style=wx.CB_READONLY) self.x_choice = ComboBox(self, -1, size=(200, -1), choices=[''], style=wx.CB_READONLY) self.x_choice.Select(0) self.bins_input = wx.SpinCtrl(self, -1, '100') self.bins_input.SetRange(1, 400) self.x_scale_choice = ComboBox( self, -1, choices=[LINEAR_SCALE, LOG_SCALE, LOG2_SCALE], style=wx.CB_READONLY) self.x_scale_choice.Select(0) self.y_scale_choice = ComboBox(self, -1, choices=[LINEAR_SCALE, LOG_SCALE], style=wx.CB_READONLY) self.y_scale_choice.Select(0) self.filter_choice = ui.FilterComboBox(self, style=wx.CB_READONLY) self.filter_choice.Select(0) self.gate_choice = ui.GateComboBox(self, style=wx.CB_READONLY) self.gate_choice.set_gatable_columns([self.x_column]) self.update_chart_btn = wx.Button(self, -1, "Update Chart") self.update_column_fields() sz = wx.BoxSizer(wx.HORIZONTAL) sz.Add(wx.StaticText(self, -1, "x-axis:"), 0, wx.TOP, 4) sz.AddSpacer((2, -1)) sz.Add(self.table_choice, 1, wx.EXPAND) sz.AddSpacer((3, -1)) sz.Add(self.x_choice, 2, wx.EXPAND) sizer.Add(sz, 1, wx.EXPAND) sizer.AddSpacer((-1, 2)) sz = wx.BoxSizer(wx.HORIZONTAL) sz.Add(wx.StaticText(self, -1, "x-scale:"), 0, wx.TOP, 4) sz.AddSpacer((2, -1)) sz.Add(self.x_scale_choice, 1, wx.EXPAND) sz.AddSpacer((5, -1)) sz.Add(wx.StaticText(self, -1, "y-scale:"), 0, wx.TOP, 4) sz.AddSpacer((2, -1)) sz.Add(self.y_scale_choice, 1, wx.EXPAND) sz.AddSpacer((5, -1)) sz.Add(wx.StaticText(self, -1, "bins:"), 0, wx.TOP, 4) sz.AddSpacer((2, -1)) sz.Add(self.bins_input) sizer.Add(sz, 1, wx.EXPAND) sizer.AddSpacer((-1, 2)) sz = wx.BoxSizer(wx.HORIZONTAL) sz.Add(wx.StaticText(self, -1, "filter:"), 0, wx.TOP, 4) sz.AddSpacer((2, -1)) sz.Add(self.filter_choice, 1, wx.EXPAND) sz.AddSpacer((5, -1)) sz.Add(wx.StaticText(self, -1, "gate:"), 0, wx.TOP, 4) sz.AddSpacer((2, -1)) sz.Add(self.gate_choice, 1, wx.EXPAND) sizer.Add(sz, 1, wx.EXPAND) sizer.AddSpacer((-1, 2)) sizer.Add(self.update_chart_btn) wx.EVT_COMBOBOX(self.table_choice, -1, self.on_table_selected) wx.EVT_BUTTON(self.update_chart_btn, -1, self.update_figpanel) self.gate_choice.addobserver(self.on_gate_selected) self.SetSizer(sizer) self.Show(1)