def build_gui(self, container): """ This method is called when the plugin is invoked. It builds the GUI used by the plugin into the widget layout passed as ``container``. This method may be called many times as the plugin is opened and closed for modal operations. The method may be omitted if there is no GUI for the plugin. This specific example uses the GUI widget set agnostic wrappers to build the GUI, but you can also just as easily use explicit toolkit calls here if you only want to support one widget set. """ top = Widgets.VBox() top.set_border_width(4) # this is a little trick for making plugins that work either in # a vertical or horizontal orientation. It returns a box container, # a scroll widget and an orientation ('vertical', 'horizontal') vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) # Take a text widget to show some instructions self.msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msgFont) self.tw = tw # Frame for instructions and add the text widget with another # blank widget to stretch as needed to fill emp fr = Widgets.Frame("Instructions") vbox2 = Widgets.VBox() vbox2.add_widget(tw) vbox2.add_widget(Widgets.Label(''), stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) # Add a spacer to stretch the rest of the way to the end of the # plugin space spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) # scroll bars will allow lots of content to be accessed top.add_widget(sw, stretch=1) # A button box that is always visible at the bottom btns = Widgets.HBox() btns.set_spacing(3) # Add a close button for the convenience of the user btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) # Add our GUI to the container container.add_widget(top, stretch=1)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) self.msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msgFont) self.tw = tw fr = Widgets.Frame("Instructions") vbox2 = Widgets.VBox() vbox2.add_widget(tw) vbox2.add_widget(Widgets.Label(''), stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Ruler") captions = (('Units:', 'label', 'Units', 'combobox'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w = b combobox = b.units for name in self.unittypes: combobox.append_text(name) index = self.unittypes.index(self.units) combobox.set_index(index) combobox.add_callback('activated', lambda w, idx: self.set_units()) fr.set_widget(w) vbox.add_widget(fr, stretch=0) spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(3) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1)
def add_db_default_values_to_gui(self): ''' This functions adds the components for the entry of default values of the database to the GUI ''' db_default_values_frame = Widgets.Frame("Options") db_default_values_vbox = Widgets.VBox() # Wrapping Default Wavelength Label and ComboBox in a HBox default_wavelength_hbox = Widgets.HBox() default_wavelength_hbox.set_spacing(3) default_wavelength_label = Widgets.Label(text="Default Wavelength") self.default_wavelength_label = default_wavelength_label default_wavelength = Widgets.ComboBox() default_wavelength.insert_alpha('angstrom') default_wavelength.append_text('nm') self.default_wavelength = default_wavelength default_wavelength_hbox.add_widget(default_wavelength_label, stretch=0) default_wavelength_hbox.add_widget(default_wavelength, stretch=0) default_wavelength_hbox.add_widget(Widgets.Label(''), stretch=1) db_default_values_vbox.add_widget(default_wavelength_hbox, stretch=0) set_default_box = Widgets.CheckBox("Set Current Database as default") self.set_default_box = set_default_box db_default_values_vbox.add_widget(set_default_box) db_default_values_vbox.add_widget(Widgets.Label(''), stretch=1) db_default_values_frame.set_widget(db_default_values_vbox) return db_default_values_frame
def build_gui(self, container): vbox = Widgets.VBox() self.msgFont = self.fv.getFont("fixedFont", 12) tw = Widgets.TextArea(wrap=False, editable=False) tw.set_font(self.msgFont) tw.set_limit(self.histlimit) self.tw = tw sw = Widgets.ScrollArea() sw.set_widget(self.tw) vbox.add_widget(sw, stretch=1) captions = (('Level', 'combobox', 'History', 'spinbutton'), ('Auto scroll', 'checkbutton', 'Clear', 'button')) w, b = Widgets.build_info(captions) self.w.update(b) combobox = b.level for (name, level) in self.levels: combobox.append_text(name) combobox.set_index(1) combobox.add_callback('activated', self.set_loglevel_cb) combobox.set_tooltip("Set the logging level") spinbox = b.history spinbox.set_limits(100, self.histmax, incr_value=10) spinbox.set_value(self.histlimit) spinbox.add_callback('value-changed', self.set_history_cb) spinbox.set_tooltip("Set the logging history line limit") btn = b.auto_scroll btn.set_state(self.autoscroll) btn.set_tooltip("Scroll the log window automatically") btn.add_callback('activated', self.set_autoscroll_cb) btn = b.clear btn.add_callback('activated', lambda w: self.clear()) btn.set_tooltip("Clear the log history") vbox.add_widget(w, stretch=0) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(btns, stretch=0) container.add_widget(vbox, stretch=1)
def build_gui(self, container): self.msgFont = self.fv.getFont("fixedFont", 10) vbox = Widgets.VBox() mlst = Widgets.VBox() mlst.set_spacing(2) self.msgList = mlst sw = Widgets.ScrollArea() sw.set_widget(self.msgList) vbox.add_widget(sw, stretch=1) hbox = Widgets.HBox() btn = Widgets.Button("Remove All") btn.add_callback('activated', lambda w: self.remove_all()) hbox.add_widget(btn, stretch=0) hbox.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(hbox, stretch=0) container.add_widget(vbox, stretch=1)
def build_gui(self, container): if not have_samp: raise GingaPlugin.PluginError( "To run this plugin you need to install the astropy.vo.samp module" ) vbox = Widgets.VBox() vbox.set_border_width(4) vbox.set_spacing(2) msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(msgFont) self.tw = tw fr = Widgets.Frame("Instructions") fr.set_widget(tw) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("SAMP") captions = [ ('Start hub', 'checkbutton'), ('Connect client', 'checkbutton'), ] w, b = Widgets.build_info(captions) self.w.update(b) b.start_hub.set_tooltip("Start a SAMP hub") b.start_hub.set_state(self.settings.get('start_hub', True)) b.start_hub.add_callback('activated', self.start_hub_cb) b.connect_client.set_tooltip("Register with a SAMP hub") b.connect_client.set_state(self.settings.get('default_connect', True)) b.connect_client.add_callback('activated', self.connect_client_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) # stretch vbox.add_widget(Widgets.Label(''), stretch=1) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(btns, stretch=0) container.add_widget(vbox, stretch=1)
def build_gui(self, container): vbox = Widgets.VBox() self.msgFont = self.fv.getFont("fixedFont", 12) tw = Widgets.TextArea(wrap=False, editable=False) tw.set_font(self.msgFont) self.tw = tw self.history = [] self.histmax = 10 sw = Widgets.ScrollArea() sw.set_widget(self.tw) vbox.add_widget(sw, stretch=1) captions = ( ('Local plugin:', 'label', 'Local plugin', 'entry', 'Reload', 'button'), ('Global plugin:', 'label', 'Global plugin', 'entry', 'ReloadG', 'button'), ) w, b = Widgets.build_info(captions) self.w.update(b) b.local_plugin.set_tooltip("Name of a local plugin to reload") b.local_plugin.set_length(14) b.reload.add_callback('activated', self.reload_local_cb) b.global_plugin.set_tooltip("Name of a global plugin to reload") b.global_plugin.set_length(14) b.reloadg.add_callback('activated', self.reload_global_cb) vbox.add_widget(w, stretch=1) self.entry = Widgets.TextEntry() vbox.add_widget(self.entry, stretch=0) self.entry.add_callback('activated', self.command_cb) btns = Widgets.HBox() btns.set_spacing(4) btns.set_border_width(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(btns) container.add_widget(vbox, stretch=1)
def add_db_parameters_to_gui(self): ''' This functions adds the components for the entry of Database parameters to the GUI ''' db_parameters_frame = Widgets.Frame("Database Parameters") db_parameters_vbox = Widgets.VBox() db_driver = Widgets.TextEntry("sqlite") db_name = Widgets.TextEntry("sunpydb") db_user = Widgets.TextEntry() db_passwd = Widgets.TextEntry() self.db_driver = db_driver self.db_name = db_name self.db_user = db_user self.db_passwd = db_passwd db_driver_label = Widgets.Label(text="Driver Name") db_name_label = Widgets.Label(text="Database Name") db_user_label = Widgets.Label(text="User Name") db_passwd_label = Widgets.Label(text="Password") self.db_driver_label = db_driver_label self.db_name_label = db_name_label self.db_user_label = db_user_label self.db_passwd_label = db_passwd_label db_parameters_vbox.add_widget(db_driver_label) db_parameters_vbox.add_widget(db_driver) db_parameters_vbox.add_widget(db_name_label) db_parameters_vbox.add_widget(db_name) db_parameters_vbox.add_widget(db_user_label) db_parameters_vbox.add_widget(db_user) db_parameters_vbox.add_widget(db_passwd_label) db_parameters_vbox.add_widget(db_passwd) db_parameters_vbox.add_widget(Widgets.Label(''), stretch=1) db_parameters_frame.set_widget(db_parameters_vbox) return db_parameters_frame
def build_gui(self, container): vbox = Widgets.VBox() fr = Widgets.Frame("Remote Control") captions = [ ("Addr:", 'label', "Addr", 'llabel', 'Restart', 'button'), ("Set Addr:", 'label', "Set Addr", 'entry'), ] w, b = Widgets.build_info(captions) self.w.update(b) addr = self.host + ':' + str(self.port) b.addr.set_text(addr) b.restart.set_tooltip("Restart the server") b.restart.add_callback('activated', self.restart_cb) b.set_addr.set_length(100) b.set_addr.set_text(addr) b.set_addr.set_tooltip("Set address to run remote control server") b.set_addr.add_callback('activated', self.set_addr_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) # stretch vbox.add_widget(Widgets.Label(''), stretch=1) btns = Widgets.HBox() btns.set_spacing(4) btns.set_border_width(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(btns) container.add_widget(vbox, stretch=1)
def add_error(self, errmsg): vbox = Widgets.VBox() hbox = Widgets.HBox() # Add the time the error occurred ts = time.strftime("%m/%d %H:%M:%S", time.localtime()) lbl = Widgets.Label(ts) hbox.add_widget(lbl, stretch=1) vbox.add_widget(hbox, stretch=0) tw = Widgets.TextArea(editable=False, wrap=False) tw.set_font(self.msgFont) tw.set_text(errmsg) vbox.add_widget(tw, stretch=0) hbox = Widgets.HBox() btn = Widgets.Button("Remove") btn.add_callback('activated', lambda w: self.remove_error(vbox)) hbox.add_widget(btn) hbox.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(hbox, stretch=0) self.msgList.add_widget(vbox, stretch=0)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) # Make the cuts plot vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(msgFont) self.tw = tw fr = Widgets.Frame("Instructions") vbox2 = Widgets.VBox() vbox2.add_widget(tw) vbox2.add_widget(Widgets.Label(''), stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) self.plot = Plot.Plot(self.logger, width=2, height=3, dpi=100) ax = self.plot.add_axis() ax.grid(True) # for now we need to wrap this native widget w = Widgets.wrap(self.plot.get_widget()) vbox.add_widget(w, stretch=1) captions = ( ('Cut Low:', 'label', 'Cut Low', 'entry'), ('Cut High:', 'label', 'Cut High', 'entry', 'Cut Levels', 'button'), ('Auto Levels', 'button'), ('Log Histogram', 'checkbutton', 'Plot By Cuts', 'checkbutton'), ('NumBins:', 'label', 'NumBins', 'entry'), ('Full Image', 'button'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.cut_levels.set_tooltip("Set cut levels manually") b.auto_levels.set_tooltip("Set cut levels by algorithm") b.cut_low.set_tooltip("Set low cut level (press Enter)") b.cut_high.set_tooltip("Set high cut level (press Enter)") b.log_histogram.set_tooltip( "Use the log of the pixel values for the histogram (empty bins map to 10^-1)" ) b.plot_by_cuts.set_tooltip( "Only show the part of the histogram between the cuts") b.numbins.set_tooltip("Number of bins for the histogram") b.full_image.set_tooltip( "Use the full image for calculating the histogram") b.numbins.set_text(str(self.numbins)) b.cut_low.add_callback('activated', lambda w: self.cut_levels()) b.cut_high.add_callback('activated', lambda w: self.cut_levels()) b.cut_levels.add_callback('activated', lambda w: self.cut_levels()) b.auto_levels.add_callback('activated', lambda w: self.auto_levels()) b.log_histogram.set_state(self.plot.logy) b.log_histogram.add_callback('activated', self.log_histogram_cb) b.plot_by_cuts.set_state(self.xlimbycuts) b.plot_by_cuts.add_callback('activated', self.plot_by_cuts_cb) b.numbins.add_callback('activated', lambda w: self.set_numbins_cb()) b.full_image.add_callback('activated', lambda w: self.full_image_cb()) vbox.add_widget(w, stretch=0) ## spacer = Widgets.Label('') ## vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(3) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.gui_up = True
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) self.msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msgFont) self.tw = tw fr = Widgets.Frame("Instructions") vbox2 = Widgets.VBox() vbox2.add_widget(tw) vbox2.add_widget(Widgets.Label(''), stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Limits") captions = (('Opacity:', 'label', 'Opacity', 'spinfloat'), ('Hi color:', 'label', 'Hi color', 'combobox'), ('Hi limit:', 'label', 'Hi value', 'entry'), ('Lo color:', 'label', 'Lo color', 'combobox'), ('Lo limit:', 'label', 'Lo value', 'entry'), ('Redo', 'button')) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.opacity.set_decimals(2) b.opacity.set_limits(0.0, 1.0, incr_value=0.1) b.opacity.set_value(self.opacity) b.opacity.add_callback('value-changed', lambda *args: self.redo()) combobox = b.hi_color for name in self.colornames: combobox.append_text(name) index = self.colornames.index(self.hi_color) combobox.set_index(index) combobox.add_callback('activated', lambda *args: self.redo()) b.hi_value.set_length(22) if self.hi_value != None: b.hi_value.set_text(str(self.hi_value)) b.hi_value.add_callback('activated', lambda *args: self.redo()) combobox = b.lo_color for name in self.colornames: combobox.append_text(name) index = self.colornames.index(self.lo_color) combobox.set_index(index) combobox.add_callback('activated', lambda *args: self.redo()) b.lo_value.set_length(22) if self.lo_value != None: b.lo_value.set_text(str(self.lo_value)) b.lo_value.add_callback('activated', lambda *args: self.redo()) b.redo.add_callback('activated', lambda *args: self.redo()) fr.set_widget(w) vbox.add_widget(fr, stretch=0) spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(3) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) # Make the cuts plot vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_margins(4, 4, 4, 4) vbox.set_spacing(2) msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(msgFont) self.tw = tw fr = Widgets.Frame("Instructions") vbox2 = Widgets.VBox() vbox2.add_widget(tw) vbox2.add_widget(Widgets.Label(''), stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) self.plot = Plot.Cuts(self.logger, width=2, height=3, dpi=100) ax = self.plot.add_axis() ax.grid(True) # for now we need to wrap this native widget w = Widgets.wrap(self.plot.get_widget()) vbox.add_widget(w, stretch=1) hbox = Widgets.HBox() hbox.set_spacing(4) hbox.set_border_width(4) # control for selecting a cut combobox = Widgets.ComboBox() for tag in self.tags: combobox.append_text(tag) if self.cutstag == None: combobox.set_index(0) else: combobox.show_text(self.cutstag) combobox.add_callback('activated', self.cut_select_cb) self.w.cuts = combobox combobox.set_tooltip("Select a cut") hbox.add_widget(combobox) btn = Widgets.Button("Delete") btn.add_callback('activated', self.delete_cut_cb) btn.set_tooltip("Delete selected cut") hbox.add_widget(btn) btn = Widgets.Button("Delete All") btn.add_callback('activated', self.delete_all_cb) btn.set_tooltip("Clear all cuts") hbox.add_widget(btn) combobox = Widgets.ComboBox() for cuttype in self.cuttypes: combobox.append_text(cuttype) self.w.cuts_type = combobox index = self.cuttypes.index(self.cuttype) combobox.set_index(index) combobox.add_callback('activated', self.set_cutsdrawtype_cb) combobox.set_tooltip("Choose the cut type") hbox.add_widget(combobox) vbox2 = Widgets.VBox() vbox2.add_widget(hbox, stretch=0) vbox2.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(vbox2, stretch=0) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(3) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.gui_up = True
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(msgFont) self.tw = tw fr = Widgets.Frame("Instructions") vbox2 = Widgets.VBox() vbox2.add_widget(tw) vbox2.add_widget(Widgets.Label(''), stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Drawing") captions = (("Draw type:", 'label', "Draw type", 'combobox'), ("Draw color:", 'label', "Draw color", 'combobox'), ("Line width:", 'label', "Line width", 'spinbutton'), ("Line style:", 'label', "Line style", 'combobox'), ("Alpha:", 'label', "Alpha", 'spinfloat'), ("Fill", 'checkbutton', "Fill color", 'combobox'), ("Fill Alpha:", 'label', "Fill Alpha", 'spinfloat'), ("Text:", 'label', "Text", 'entry'), ("Clear canvas", 'button')) w, b = Widgets.build_info(captions) self.w = b combobox = b.draw_type for name in self.drawtypes: combobox.append_text(name) index = self.drawtypes.index(default_drawtype) combobox.set_index(index) combobox.add_callback('activated', lambda w, idx: self.set_drawparams()) combobox = b.draw_color self.drawcolors = draw_colors for name in self.drawcolors: combobox.append_text(name) index = self.drawcolors.index(default_drawcolor) combobox.set_index(index) combobox.add_callback('activated', lambda w, idx: self.set_drawparams()) combobox = b.fill_color for name in self.drawcolors: combobox.append_text(name) index = self.drawcolors.index(default_drawcolor) combobox.set_index(index) combobox.add_callback('activated', lambda w, idx: self.set_drawparams()) b.line_width.set_limits(0, 10, 1) #b.line_width.set_decimals(0) b.line_width.set_value(1) b.line_width.add_callback('value-changed', lambda w, val: self.set_drawparams()) combobox = b.line_style for name in self.linestyles: combobox.append_text(name) combobox.set_index(0) combobox.add_callback('activated', lambda w, idx: self.set_drawparams()) b.fill.add_callback('activated', lambda w, tf: self.set_drawparams()) b.fill.set_state(False) b.alpha.set_limits(0.0, 1.0, 0.1) b.alpha.set_decimals(2) b.alpha.set_value(1.0) b.alpha.add_callback('value-changed', lambda w, val: self.set_drawparams()) b.fill_alpha.set_limits(0.0, 1.0, 0.1) b.fill_alpha.set_decimals(2) b.fill_alpha.set_value(0.3) b.fill_alpha.add_callback('value-changed', lambda w, val: self.set_drawparams()) b.text.add_callback('activated', lambda w: self.set_drawparams()) b.text.set_text('EDIT ME') b.text.set_length(60) b.clear_canvas.add_callback('activated', lambda w: self.clear_canvas()) fr.set_widget(w) vbox.add_widget(fr, stretch=0) spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) self.msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msgFont) self.tw = tw fr = Widgets.Frame("Instructions") vbox2 = Widgets.VBox() vbox2.add_widget(tw) vbox2.add_widget(Widgets.Label(''), stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Mosaic") captions = [ ("FOV (deg):", 'label', 'Fov', 'llabel', 'set_fov', 'entry'), ("New Mosaic", 'button'), ("Label images", 'checkbutton', "Match bg", 'checkbutton'), ("Trim Pixels:", 'label', 'Trim Px', 'llabel', 'trim_pixels', 'entry'), ("Num Threads:", 'label', 'Num Threads', 'llabel', 'set_num_threads', 'entry'), ("Merge data", 'checkbutton', "Drop new", 'checkbutton'), ("Mosaic HDUs", 'checkbutton'), ] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) fov_deg = self.settings.get('fov_deg', 1.0) b.fov.set_text(str(fov_deg)) b.set_fov.set_length(8) b.set_fov.set_text(str(fov_deg)) b.set_fov.add_callback('activated', self.set_fov_cb) b.set_fov.set_tooltip("Set size of mosaic FOV (deg)") b.new_mosaic.add_callback('activated', lambda w: self.new_mosaic_cb()) labelem = self.settings.get('annotate_images', False) b.label_images.set_state(labelem) b.label_images.set_tooltip("Label tiles with their names") b.label_images.add_callback('activated', self.annotate_cb) trim_px = self.settings.get('trim_px', 0) match_bg = self.settings.get('match_bg', False) b.match_bg.set_tooltip("Try to match background levels") b.match_bg.set_state(match_bg) b.match_bg.add_callback('activated', self.match_bg_cb) b.trim_pixels.set_tooltip("Set number of pixels to trim from each edge") b.trim_px.set_text(str(trim_px)) b.trim_pixels.add_callback('activated', self.trim_pixels_cb) b.trim_pixels.set_length(8) b.trim_pixels.set_text(str(trim_px)) num_threads = self.settings.get('num_threads', 4) b.num_threads.set_text(str(num_threads)) b.set_num_threads.set_length(8) b.set_num_threads.set_text(str(num_threads)) b.set_num_threads.set_tooltip("Number of threads to use for mosaicing") b.set_num_threads.add_callback('activated', self.set_num_threads_cb) merge = self.settings.get('merge', False) b.merge_data.set_tooltip("Merge data instead of overlay") b.merge_data.set_state(merge) b.merge_data.add_callback('activated', self.merge_cb) drop_new = self.settings.get('drop_creates_new_mosaic', False) b.drop_new.set_tooltip("Dropping files on image starts a new mosaic") b.drop_new.set_state(drop_new) b.drop_new.add_callback('activated', self.drop_new_cb) mosaic_hdus = self.settings.get('mosaic_hdus', False) b.mosaic_hdus.set_tooltip("Mosaic data HDUs in each file") b.mosaic_hdus.set_state(mosaic_hdus) b.mosaic_hdus.add_callback('activated', self.mosaic_hdus_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) vbox2 = Widgets.VBox() # Mosaic evaluation status hbox = Widgets.HBox() hbox.set_spacing(4) hbox.set_border_width(4) label = Widgets.Label() self.w.eval_status = label hbox.add_widget(self.w.eval_status, stretch=0) hbox.add_widget(Widgets.Label(''), stretch=1) vbox2.add_widget(hbox, stretch=0) # Mosaic evaluation progress bar and stop button hbox = Widgets.HBox() hbox.set_spacing(4) hbox.set_border_width(4) btn = Widgets.Button("Stop") btn.add_callback('activated', lambda w: self.eval_intr()) btn.set_enabled(False) self.w.btn_intr_eval = btn hbox.add_widget(btn, stretch=0) self.w.eval_pgs = Widgets.ProgressBar() hbox.add_widget(self.w.eval_pgs, stretch=1) vbox2.add_widget(hbox, stretch=0) vbox2.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(vbox2, stretch=1) self.w.vbox = Widgets.VBox() vbox.add_widget(self.w.vbox, stretch=0) spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(3) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.gui_up = True
def build_gui(self, container): # Create a scrollable area sw = Widgets.ScrollArea() # Create a vertical box into which our widgets will be placed vbox = Widgets.VBox() vbox.set_border_width(4) vbox.set_spacing(2) # Place the vertical box inside the scrollable area sw.set_widget(vbox) # Create a frame for the program name and the OB ID. prog_ob_frame = Widgets.Frame() # Create some label widgets to display the program and the OB # ID captions = (('Program:', 'label', 'Program', 'label', 'OB ID:', 'label', 'OB ID', 'label', 'Dup All OB', 'checkbutton'), ) w, b = Widgets.build_info(captions, orientation='vertical') self.w_prog_ob = b # Set the inital text for the program and OB ID to N/A b.program.set_text('N/A') b.ob_id.set_text('N/A') b.dup_all_ob.set_state(False) # Place the label widgets into the frame prog_ob_frame.set_widget(w) # Add the frame to the vertical box vbox.add_widget(prog_ob_frame, stretch=0) # Create a frame for the resolution comments comment_frame = Widgets.Frame('OB Comments') # Create a text area into which comments can be entered captions = (('Comment entry', 'textarea'), ) w, b = Widgets.build_info(captions, orientation='vertical') self.w_comments = b # Place the text area into the frame comment_frame.set_widget(w) # Add the frame to the vertical box vbox.add_widget(comment_frame, stretch=0) # Create a frame for the data quality buttons data_button_frame = Widgets.Frame() # Create some radio buttons to describe the data quality buttonList = [] self.qualityButtonVals = {} for i, name in enumerate(self.qualityButtons): buttonList.append(name) buttonList.append('radiobutton') self.qualityButtonVals[name] = len(self.qualityButtons) - i captions = (('Data Quality:', 'label'), buttonList) w, b = Widgets.build_info(captions, orientation='vertical') self.w_data_buttons = b # Set the callback method for the data quality radio buttons for name in self.qualityButtons: b[name.lower()].add_callback('activated', self.rate_cb, self.qualityButtonVals[name]) # Put the quality buttons into a QButtonGroup so that we set # up the buttons as "exclusive", i.e., only one button can be # selected at a time. self.data_bg = QtGui.QButtonGroup() for name in self.qualityButtons: self.data_bg.addButton( self.w_data_buttons[name.lower()].get_widget()) # Place the radio buttons into the frame data_button_frame.set_widget(w) # Add the frame to the vertical box vbox.add_widget(data_button_frame, stretch=0) # Create a frame for the clear button clear_button_frame = Widgets.Frame() # Create the Clear button captions = (('Clear', 'button'), ) w, b = Widgets.build_info(captions, orientation='vertical') self.w_clear = b # Connect the button-click event to the callback method b.clear.add_callback('activated', self.clear_cb) # Place the radio buttons into the frame clear_button_frame.set_widget(w) # Add the frame to the vertical box vbox.add_widget(clear_button_frame, stretch=0) # Create a frame for the slider bar slider_frame = Widgets.Frame() captions = (('ob list index', 'hscale'), ) w, b = Widgets.build_info(captions, orientation='vertical') self.w_slider = b b.ob_list_index.set_limits(0, 1) b.ob_list_index.set_tracking(True) b.ob_list_index.add_callback('value-changed', self.ob_list_index_cb) # Place the slider bar into the frame slider_frame.set_widget(w) # Add the frame to the vertical box vbox.add_widget(slider_frame, stretch=0) # Create a frame for the first/prev/next/last buttons prev_next_button_frame = Widgets.Frame() # Create the First, Prev, Next, and Last buttons captions = (('First', 'button', 'Prev', 'button', 'Next', 'button', 'Last', 'button'), ) w, b = Widgets.build_info(captions, orientation='vertical') self.w_prev_next = b # Connect the button-click event to the callback method b.first.add_callback('activated', self.first_cb) b.next.add_callback('activated', self.next_cb) b.prev.add_callback('activated', self.prev_cb) b.last.add_callback('activated', self.last_cb) # Place the radio buttons into the frame prev_next_button_frame.set_widget(w) # Add the frame to the vertical box vbox.add_widget(prev_next_button_frame, stretch=0) # Create a frame for the save buttons save_button_frame = Widgets.Frame() # Create the Save button captions = (('Save', 'button'), ) w, b = Widgets.build_info(captions, orientation='vertical') self.w_save_button = b # Connect the button-click event to the callback method b.save.add_callback('activated', self.save_cb) # Place the button into the frame save_button_frame.set_widget(w) # Add the frame to the vertical box vbox.add_widget(save_button_frame, stretch=0) # Create a layout for the container that was supplied to us layout = QtGui.QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(4) # Set the supplied container to have the layout we just # created container.setLayout(layout) # Get the widget for the scrollable area top_w = sw.get_widget() # Add the widget for the scrollable area to the layout we just # created for the supplied container layout.addWidget(top_w, stretch=1)
def _create_info_window(self): sw = Widgets.ScrollArea() vbox = Widgets.VBox() captions = (('Name:', 'label', 'Name', 'llabel'), ('Object:', 'label', 'Object', 'llabel'), ('X:', 'label', 'X', 'llabel'), ('Y:', 'label', 'Y', 'llabel'), ('Value:', 'label', 'Value', 'llabel'), ('RA:', 'label', 'RA', 'llabel'), ('DEC:', 'label', 'DEC', 'llabel'), ('Equinox:', 'label', 'Equinox', 'llabel'), ('Dimensions:', 'label', 'Dimensions', 'llabel'), ('Min:', 'label', 'Min', 'llabel'), ('Max:', 'label', 'Max', 'llabel'), ) w, b = Widgets.build_info(captions) col = Widgets.VBox() row = Widgets.HBox() row.set_spacing(0) row.set_border_width(0) row.add_widget(w, stretch=0) row.add_widget(Widgets.Label(''), stretch=1) col.add_widget(row, stretch=1) col.add_widget(Widgets.Label(''), stretch=1) sw2 = Widgets.ScrollArea() sw2.set_widget(col) vbox.add_widget(sw2, stretch=2) captions = (('Zoom:', 'label', 'Zoom', 'llabel'), ('Cut Low:', 'label', 'Cut Low Value', 'llabel', 'Cut Low', 'entry'), ('Cut High:', 'label', 'Cut High Value', 'llabel', 'Cut High', 'entry'), ('Auto Levels', 'button', 'spacer1', 'spacer', 'Cut Levels', 'button'), ('Cut New:', 'label', 'Cut New', 'llabel'), ('Zoom New:', 'label', 'Zoom New', 'llabel'), ('Center New:', 'label', 'Center New', 'llabel'), ) w, b2 = Widgets.build_info(captions) b.update(b2) # TODO: need a more general solution to gtk labels resizing their # parent window #b.object.set_length(12) b.cut_levels.set_tooltip("Set cut levels manually") b.auto_levels.set_tooltip("Set cut levels by algorithm") b.cut_low.set_tooltip("Set low cut level (press Enter)") b.cut_high.set_tooltip("Set high cut level (press Enter)") row = Widgets.HBox() row.set_spacing(0) row.set_border_width(0) row.add_widget(w, stretch=0) row.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(row, stretch=1) # stretcher vbox.add_widget(Widgets.Label(''), stretch=1) sw.set_widget(vbox) return sw, b
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(msgFont) self.tw = tw fr = Widgets.Frame("Instructions") vbox2 = Widgets.VBox() vbox2.add_widget(tw) vbox2.add_widget(Widgets.Label(''), stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Drawing") captions = (('Draw type:', 'label', 'Draw type', 'combobox'), ('Draw color:', 'label', 'Draw color', 'combobox'), ('Clear canvas', 'button')) w, b = Widgets.build_info(captions) self.w = b combobox = b.draw_type options = [] index = 0 for name in self.drawtypes: options.append(name) combobox.append_text(name) index += 1 index = self.drawtypes.index(default_drawtype) combobox.set_index(index) combobox.add_callback('activated', lambda w, idx: self.set_drawparams()) self.w.draw_color = b.draw_color combobox = b.draw_color options = [] index = 0 self.drawcolors = draw_colors for name in self.drawcolors: options.append(name) combobox.append_text(name) index += 1 index = self.drawcolors.index(default_drawcolor) combobox.set_index(index) combobox.add_callback('activated', lambda w, idx: self.set_drawparams()) b.clear_canvas.add_callback('activated', lambda w: self.clear_canvas()) fr.set_widget(w) vbox.add_widget(fr, stretch=0) spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_margins(4, 4, 4, 4) vbox.set_spacing(2) self.msg_font = self.fv.get_font("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msg_font) self.tw = tw fr = Widgets.Expander("Instructions") vbox2 = Widgets.VBox() vbox2.add_widget(tw) vbox2.add_widget(Widgets.Label(''), stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) self.plot = plots.Plot(logger=self.logger, width=400, height=300) ax = self.plot.add_axis() ax.grid(False) w = Plot.PlotWidget(self.plot) w.resize(400, 300) vbox.add_widget(w, stretch=0) fr = Widgets.Frame("Axes controls") self.hbox_axes = Widgets.HBox() self.hbox_axes.set_border_width(4) self.hbox_axes.set_spacing(1) fr.set_widget(self.hbox_axes) vbox.add_widget(fr, stretch=0) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) # control for selecting a mark cbox2 = Widgets.ComboBox() for tag in self.marks: cbox2.append_text(tag) if self.mark_selected is None: cbox2.set_index(0) else: cbox2.show_text(self.mark_selected) cbox2.add_callback('activated', self.mark_select_cb) self.w.marks = cbox2 cbox2.set_tooltip("Select a mark") btns.add_widget(cbox2, stretch=0) btn1 = Widgets.CheckBox("Pan to mark") btn1.set_state(self.pan2mark) btn1.add_callback('activated', self.pan2mark_cb) btn1.set_tooltip("Pan follows selected mark") btns.add_widget(btn1) btns.add_widget(Widgets.Label(''), stretch=1) btn2 = Widgets.Button("Delete") self.del_btn = btn2 btn2.add_callback('activated', lambda w: self.clear_mark_cb()) btn2.set_tooltip("Delete selected mark") btn2.set_enabled(False) btns.add_widget(btn2, stretch=0) btn3 = Widgets.Button("Delete All") self.del_all_btn = btn3 btn3.add_callback('activated', lambda w: self.clear_all()) btn3.set_tooltip("Clear all marks") btn3.set_enabled(False) btns.add_widget(btn3, stretch=0) vbox2 = Widgets.VBox() vbox2.add_widget(btns, stretch=0) vbox2.add_widget(Widgets.Label(''), stretch=1) fr = Widgets.Frame("Mark controls") fr.set_widget(vbox2) vbox.add_widget(fr, stretch=1) # scroll bars will allow lots of content to be accessed top.add_widget(sw, stretch=1) # A button box that is always visible at the bottom btns = Widgets.HBox() btns.set_spacing(3) # Add a close button for the convenience of the user btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) # Add our GUI to the container container.add_widget(top, stretch=1) self.gui_up = True self.build_axes()
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox1, sw, orientation = Widgets.get_oriented_box(container) vbox1.set_border_width(4) vbox1.set_spacing(2) self.msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msgFont) self.tw = tw fr = Widgets.Frame("Instructions") vbox2 = Widgets.VBox() vbox2.add_widget(tw) vbox2.add_widget(Widgets.Label(''), stretch=1) fr.set_widget(vbox2) vbox1.add_widget(fr, stretch=0) # Main pipeline control area captions = [ ("Subtract Bias", 'button', "Bias Image:", 'label', 'bias_image', 'llabel'), ("Apply Flat Field", 'button', "Flat Image:", 'label', 'flat_image', 'llabel'), ] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) fr = Widgets.Frame("Pipeline") fr.set_widget(w) vbox1.add_widget(fr, stretch=0) b.subtract_bias.add_callback('activated', self.subtract_bias_cb) b.subtract_bias.set_tooltip("Subtract a bias image") bias_name = 'None' if self.bias != None: bias_name = self.bias.get('name', "NoName") b.bias_image.set_text(bias_name) b.apply_flat_field.add_callback('activated', self.apply_flat_cb) b.apply_flat_field.set_tooltip("Apply a flat field correction") flat_name = 'None' if self.flat != None: flat_name = self.flat.get('name', "NoName") b.flat_image.set_text(flat_name) vbox2 = Widgets.VBox() # Pipeline status hbox = Widgets.HBox() hbox.set_spacing(4) hbox.set_border_width(4) label = Widgets.Label() self.w.eval_status = label hbox.add_widget(self.w.eval_status, stretch=0) hbox.add_widget(Widgets.Label(''), stretch=1) vbox2.add_widget(hbox, stretch=0) # progress bar and stop button hbox = Widgets.HBox() hbox.set_spacing(4) hbox.set_border_width(4) btn = Widgets.Button("Stop") btn.add_callback('activated', lambda w: self.eval_intr()) btn.set_enabled(False) self.w.btn_intr_eval = btn hbox.add_widget(btn, stretch=0) self.w.eval_pgs = Widgets.ProgressBar() hbox.add_widget(self.w.eval_pgs, stretch=1) vbox2.add_widget(hbox, stretch=0) vbox2.add_widget(Widgets.Label(''), stretch=1) vbox1.add_widget(vbox2, stretch=0) # Image list captions = [ ("Append", 'button', "Prepend", 'button', "Clear", 'button'), ] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) fr = Widgets.Frame("Image Stack") vbox = Widgets.VBox() hbox = Widgets.HBox() self.w.stack = Widgets.Label('') hbox.add_widget(self.w.stack, stretch=0) vbox.add_widget(hbox, stretch=0) vbox.add_widget(w, stretch=0) fr.set_widget(vbox) vbox1.add_widget(fr, stretch=0) self.update_stack_gui() b.append.add_callback('activated', self.append_image_cb) b.append.set_tooltip("Append an individual image to the stack") b.prepend.add_callback('activated', self.prepend_image_cb) b.prepend.set_tooltip("Prepend an individual image to the stack") b.clear.add_callback('activated', self.clear_stack_cb) b.clear.set_tooltip("Clear the stack of images") # Bias captions = [ ("Make Bias", 'button', "Set Bias", 'button'), ] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) fr = Widgets.Frame("Bias Subtraction") fr.set_widget(w) vbox1.add_widget(fr, stretch=0) b.make_bias.add_callback('activated', self.make_bias_cb) b.make_bias.set_tooltip("Makes a bias image from a stack of individual images") b.set_bias.add_callback('activated', self.set_bias_cb) b.set_bias.set_tooltip("Set the currently loaded image as the bias image") # Flat fielding captions = [ ("Make Flat Field", 'button', "Set Flat Field", 'button'), ] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) fr = Widgets.Frame("Flat Fielding") fr.set_widget(w) vbox1.add_widget(fr, stretch=0) b.make_flat_field.add_callback('activated', self.make_flat_cb) b.make_flat_field.set_tooltip("Makes a flat field from a stack of individual flats") b.set_flat_field.add_callback('activated', self.set_flat_cb) b.set_flat_field.set_tooltip("Set the currently loaded image as the flat field") spacer = Widgets.Label('') vbox1.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(3) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.gui_up = True
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) fr = Widgets.Frame("Pixel Values") # Make the values table as a text widget msgFont = self.fv.getFont('fixedFont', 10) tw = Widgets.TextArea(wrap=False, editable=False) tw.set_font(msgFont) self.tw = tw vbox2 = Widgets.VBox() vbox2.add_widget(tw) vbox2.add_widget(Widgets.Label(''), stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=1) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) cbox1 = Widgets.ComboBox() index = 0 for i in self.sizes: j = 1 + i * 2 name = "%dx%d" % (j, j) cbox1.append_text(name) index += 1 index = self.sizes.index(self.pixtbl_radius) cbox1.set_index(index) cbox1.add_callback('activated', self.set_cutout_size) cbox1.set_tooltip("Select size of pixel table") btns.add_widget(cbox1, stretch=0) # control for selecting a mark cbox2 = Widgets.ComboBox() for tag in self.marks: cbox2.append_text(tag) if self.mark_selected == None: cbox2.set_index(0) else: cbox2.show_text(self.mark_selected) cbox2.add_callback('activated', self.mark_select_cb) self.w.marks = cbox2 cbox2.set_tooltip("Select a mark") #cbox2.setMinimumContentsLength(8) btns.add_widget(cbox2, stretch=0) btn1 = Widgets.Button("Delete") btn1.add_callback('activated', lambda w: self.clear_mark_cb()) btn1.set_tooltip("Delete selected mark") btns.add_widget(btn1, stretch=0) btn2 = Widgets.Button("Delete All") btn2.add_callback('activated', lambda w: self.clear_all()) btn2.set_tooltip("Clear all marks") btns.add_widget(btn2, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) vbox2 = Widgets.VBox() vbox2.add_widget(btns, stretch=0) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) btn3 = Widgets.CheckBox("Pan to mark") btn3.set_state(self.pan2mark) btn3.add_callback('activated', self.pan2mark_cb) btn3.set_tooltip("Pan follows selected mark") btns.add_widget(btn3) btns.add_widget(Widgets.Label(''), stretch=1) vbox2.add_widget(btns, stretch=0) vbox2.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(vbox2, stretch=1) ## spacer = Widgets.Label('') ## vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) self.orientation = orientation #vbox.set_border_width(4) vbox.set_spacing(2) # COLOR DISTRIBUTION OPTIONS fr = Widgets.Frame("Color Distribution") captions = (('Algorithm:', 'label', 'Algorithm', 'combobox'), #('Table Size:', 'label', 'Table Size', 'entry'), ('Dist Defaults', 'button')) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) self.w.calg_choice = b.algorithm #self.w.table_size = b.table_size b.algorithm.set_tooltip("Choose a color distribution algorithm") #b.table_size.set_tooltip("Set size of the distribution hash table") b.dist_defaults.set_tooltip("Restore color distribution defaults") b.dist_defaults.add_callback('activated', lambda w: self.set_default_distmaps()) combobox = b.algorithm options = [] index = 0 for name in self.calg_names: options.append(name) combobox.append_text(name) index += 1 index = self.calg_names.index(self.t_.get('color_algorithm', "linear")) combobox.set_index(index) combobox.add_callback('activated', self.set_calg_cb) ## entry = b.table_size ## entry.set_text(str(self.t_.get('color_hashsize', 65535))) ## entry.add_callback('activated', self.set_tablesize_cb) fr.set_widget(w) vbox.add_widget(fr) # COLOR MAPPING OPTIONS fr = Widgets.Frame("Color Mapping") captions = (('Colormap:', 'label', 'Colormap', 'combobox'), ('Intensity:', 'label', 'Intensity', 'combobox'), ('Color Defaults', 'button')) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) self.w.cmap_choice = b.colormap self.w.imap_choice = b.intensity b.color_defaults.add_callback('activated', lambda w: self.set_default_cmaps()) b.colormap.set_tooltip("Choose a color map for this image") b.intensity.set_tooltip("Choose an intensity map for this image") b.color_defaults.set_tooltip("Restore default color and intensity maps") fr.set_widget(w) vbox.add_widget(fr) combobox = b.colormap options = [] index = 0 for name in self.cmap_names: options.append(name) combobox.append_text(name) index += 1 cmap_name = self.t_.get('color_map', "ramp") try: index = self.cmap_names.index(cmap_name) except Exception: index = self.cmap_names.index('ramp') combobox.set_index(index) combobox.add_callback('activated', self.set_cmap_cb) combobox = b.intensity options = [] index = 0 for name in self.imap_names: options.append(name) combobox.append_text(name) index += 1 imap_name = self.t_.get('intensity_map', "ramp") try: index = self.imap_names.index(imap_name) except Exception: index = self.imap_names.index('ramp') combobox.set_index(index) combobox.add_callback('activated', self.set_imap_cb) # AUTOCUTS OPTIONS fr = Widgets.Frame("Auto Cuts") vbox2 = Widgets.VBox() fr.set_widget(vbox2) captions = (('Auto Method:', 'label', 'Auto Method', 'combobox'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) # Setup auto cuts method choice combobox = b.auto_method index = 0 method = self.t_.get('autocut_method', "histogram") for name in self.autocut_methods: combobox.append_text(name) index += 1 index = self.autocut_methods.index(method) combobox.set_index(index) combobox.add_callback('activated', self.set_autocut_method_cb) b.auto_method.set_tooltip("Choose algorithm for auto levels") vbox2.add_widget(w, stretch=0) self.w.acvbox = Widgets.VBox() vbox2.add_widget(self.w.acvbox, stretch=1) vbox.add_widget(fr, stretch=0) # TRANSFORM OPTIONS fr = Widgets.Frame("Transform") captions = (('Flip X', 'checkbutton', 'Flip Y', 'checkbutton', 'Swap XY', 'checkbutton'), ('Rotate:', 'label', 'Rotate', 'spinfloat'), ('Restore', 'button'),) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) for name in ('flip_x', 'flip_y', 'swap_xy'): btn = b[name] btn.set_state(self.t_.get(name, False)) btn.add_callback('activated', self.set_transforms_cb) b.flip_x.set_tooltip("Flip the image around the X axis") b.flip_y.set_tooltip("Flip the image around the Y axis") b.swap_xy.set_tooltip("Swap the X and Y axes in the image") b.rotate.set_tooltip("Rotate the image around the pan position") b.restore.set_tooltip("Clear any transforms and center image") b.restore.add_callback('activated', self.restore_cb) b.rotate.set_limits(0.00, 359.99999999, incr_value=10.0) b.rotate.set_value(0.00) b.rotate.set_decimals(8) b.rotate.add_callback('value-changed', self.rotate_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) # WCS OPTIONS fr = Widgets.Frame("WCS") captions = (('WCS Coords:', 'label', 'WCS Coords', 'combobox'), ('WCS Display:', 'label', 'WCS Display', 'combobox'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.wcs_coords.set_tooltip("Set WCS coordinate system") b.wcs_display.set_tooltip("Set WCS display format") # Setup WCS coords method choice combobox = b.wcs_coords index = 0 for name in wcsmod.coord_types: combobox.append_text(name) index += 1 method = self.t_.get('wcs_coords', "") try: index = wcsmod.coord_types.index(method) combobox.set_index(index) except ValueError: pass combobox.add_callback('activated', self.set_wcs_params_cb) # Setup WCS display format method choice combobox = b.wcs_display index = 0 for name in wcsmod.display_types: combobox.append_text(name) index += 1 method = self.t_.get('wcs_display', "sexagesimal") try: index = wcsmod.display_types.index(method) combobox.set_index(index) except ValueError: pass combobox.add_callback('activated', self.set_wcs_params_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) # ZOOM OPTIONS fr = Widgets.Frame("Zoom") captions = (('Zoom Alg:', 'label', 'Zoom Alg', 'combobox'), ('Zoom Rate:', 'label', 'Zoom Rate', 'spinfloat'), ('Stretch XY:', 'label', 'Stretch XY', 'combobox'), ('Stretch Factor:', 'label', 'Stretch Factor', 'spinfloat'), ('Scale X:', 'label', 'Scale X', 'entry'), ('Scale Y:', 'label', 'Scale Y', 'entry'), ('Scale Min:', 'label', 'Scale Min', 'spinfloat'), ('Scale Max:', 'label', 'Scale Max', 'spinfloat'), ('Zoom Defaults', 'button')) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) index = 0 for name in self.zoomalg_names: b.zoom_alg.append_text(name.capitalize()) index += 1 zoomalg = self.t_.get('zoom_algorithm', "step") index = self.zoomalg_names.index(zoomalg) b.zoom_alg.set_index(index) b.zoom_alg.set_tooltip("Choose Zoom algorithm") b.zoom_alg.add_callback('activated', self.set_zoomalg_cb) index = 0 for name in ('X', 'Y'): b.stretch_xy.append_text(name) index += 1 b.stretch_xy.set_index(0) b.stretch_xy.set_tooltip("Stretch pixels in X or Y") b.stretch_xy.add_callback('activated', self.set_stretch_cb) b.stretch_factor.set_limits(1.0, 10.0, incr_value=0.10) b.stretch_factor.set_value(1.0) b.stretch_factor.set_decimals(8) b.stretch_factor.add_callback('value-changed', self.set_stretch_cb) b.stretch_factor.set_tooltip("Length of pixel relative to 1 on other side") b.stretch_factor.set_enabled(zoomalg != 'step') zoomrate = self.t_.get('zoom_rate', math.sqrt(2.0)) b.zoom_rate.set_limits(1.1, 3.0, incr_value=0.1) b.zoom_rate.set_value(zoomrate) b.zoom_rate.set_decimals(8) b.zoom_rate.set_enabled(zoomalg != 'step') b.zoom_rate.set_tooltip("Step rate of increase/decrease per zoom level") b.zoom_rate.add_callback('value-changed', self.set_zoomrate_cb) b.zoom_defaults.add_callback('activated', self.set_zoom_defaults_cb) scale_x, scale_y = self.fitsimage.get_scale_xy() b.scale_x.set_tooltip("Set the scale in X axis") b.scale_x.set_text(str(scale_x)) b.scale_x.add_callback('activated', self.set_scale_cb) b.scale_y.set_tooltip("Set the scale in Y axis") b.scale_y.set_text(str(scale_y)) b.scale_y.add_callback('activated', self.set_scale_cb) scale_min, scale_max = self.t_['scale_min'], self.t_['scale_max'] b.scale_min.set_limits(0.00001, 1.0, incr_value=1.0) b.scale_min.set_value(scale_min) b.scale_min.set_decimals(8) b.scale_min.add_callback('value-changed', self.set_scale_limit_cb) b.scale_min.set_tooltip("Set the minimum allowed scale in any axis") b.scale_max.set_limits(1.0, 10000.0, incr_value=1.0) b.scale_max.set_value(scale_max) b.scale_max.set_decimals(8) b.scale_max.add_callback('value-changed', self.set_scale_limit_cb) b.scale_min.set_tooltip("Set the maximum allowed scale in any axis") fr.set_widget(w) vbox.add_widget(fr, stretch=0) # PAN OPTIONS fr = Widgets.Frame("Panning") captions = (('Pan X:', 'label', 'Pan X', 'entry'), ('Pan Y:', 'label', 'Pan Y', 'entry'), ('Center Image', 'button'), ('Mark Center', 'checkbutton')) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) pan_x, pan_y = self.fitsimage.get_pan() b.pan_x.set_tooltip("Set the pan position in X axis") b.pan_x.set_text(str(pan_x+0.5)) b.pan_x.add_callback('activated', self.set_pan_cb) b.pan_y.set_tooltip("Set the pan position in Y axis") b.pan_y.set_text(str(pan_y+0.5)) b.pan_y.add_callback('activated', self.set_pan_cb) b.center_image.set_tooltip("Set the pan position to center of the image") b.center_image.add_callback('activated', self.center_image_cb) b.mark_center.set_tooltip("Mark the center (pan locator)") b.mark_center.add_callback('activated', self.set_misc_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("New Images") captions = (('Cut New:', 'label', 'Cut New', 'combobox'), ('Zoom New:', 'label', 'Zoom New', 'combobox'), ('Center New', 'checkbutton', 'Follow New', 'checkbutton'), ('Raise New', 'checkbutton', 'Create thumbnail', 'checkbutton'),) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) combobox = b.cut_new index = 0 for name in self.autocut_options: combobox.append_text(name) index += 1 option = self.t_.get('autocuts', "off") index = self.autocut_options.index(option) combobox.set_index(index) combobox.add_callback('activated', self.set_autocuts_cb) b.cut_new.set_tooltip("Automatically set cut levels for new images") combobox = b.zoom_new index = 0 for name in self.autozoom_options: combobox.append_text(name) index += 1 option = self.t_.get('autozoom', "off") index = self.autozoom_options.index(option) combobox.set_index(index) combobox.add_callback('activated', self.set_autozoom_cb) b.zoom_new.set_tooltip("Automatically fit new images to window") b.center_new.set_tooltip("Automatically center new images") b.follow_new.set_tooltip("View new images as they arrive") b.raise_new.set_tooltip("Raise and focus tab for new images") b.create_thumbnail.set_tooltip("Create thumbnail for new images") self.w.center_new.set_state(True) self.w.center_new.add_callback('activated', self.set_chprefs_cb) self.w.follow_new.set_state(True) self.w.follow_new.add_callback('activated', self.set_chprefs_cb) self.w.raise_new.set_state(True) self.w.raise_new.add_callback('activated', self.set_chprefs_cb) self.w.create_thumbnail.set_state(True) self.w.create_thumbnail.add_callback('activated', self.set_chprefs_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(4) btns.set_border_width(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btn = Widgets.Button("Save Settings") btn.add_callback('activated', lambda w: self.save_preferences()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.gui_up = True
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(0) vbox, sw, orientation = Widgets.get_oriented_box(container) self.orientation = orientation #vbox.set_border_width(2) vbox.set_spacing(2) tb = Widgets.Toolbar(orientation=orientation) for tup in ( #("Load", 'button', 'fits_open_48', "Open an image file", #None), ("FlipX", 'toggle', 'flipx_48', "Flip image in X axis", self.flipx_cb), ("FlipY", 'toggle', 'flipy_48', "Flip image in Y axis", self.flipy_cb), ("SwapXY", 'toggle', 'swapxy_48', "Swap X and Y axes", self.swapxy_cb), ("---", ), ("Rot90", 'button', 'rot90ccw_48', "Rotate image 90 deg", self.rot90_cb), ("RotN90", 'button', 'rot90cw_48', "Rotate image -90 deg", self.rotn90_cb), ("OrientRH", 'button', 'orient_nw_48', "Orient image N=Up E=Right", self.orient_rh_cb), ("OrientLH", 'button', 'orient_ne_48', "Orient image N=Up E=Left", self.orient_lh_cb), ("---", ), ("Prev", 'button', 'prev_48', "Go to previous image in channel", lambda w: self.fv.prev_img()), ("Next", 'button', 'next_48', "Go to next image in channel", lambda w: self.fv.next_img()), ("---", ), ("Zoom In", 'button', 'zoom_in_48', "Zoom in", lambda w: self.fv.zoom_in()), ("Zoom Out", 'button', 'zoom_out_48', "Zoom out", lambda w: self.fv.zoom_out()), ("Zoom Fit", 'button', 'zoom_fit_48', "Zoom to fit window size", lambda w: self.fv.zoom_fit()), ("Zoom 1:1", 'button', 'zoom_100_48', "Zoom to 100% (1:1)", lambda w: self.fv.zoom_1_to_1()), ("---", ), ("Pan", 'toggle', 'pan_48', "Pan with left, zoom with right", lambda w, tf: self.mode_cb(tf, 'pan')), ("FreePan", 'toggle', 'hand_48', "Free Panning", lambda w, tf: self.mode_cb(tf, 'freepan')), ("Rotate", 'toggle', 'rotate_48', "Interactive rotation", lambda w, tf: self.mode_cb(tf, 'rotate')), ("Cuts", 'toggle', 'cuts_48', "Left/right sets hi cut, up/down sets lo cut", lambda w, tf: self.mode_cb(tf, 'cuts')), ("Contrast", 'toggle', 'contrast_48', "Contrast/bias with left/right/up/down", lambda w, tf: self.mode_cb(tf, 'contrast')), ("ModeLock", 'toggle', 'lock_48', "Modes are oneshot or locked", self.set_locked_cb), ("---", ), ("Center", 'button', 'center_image_48', "Center image", self.center_image_cb), ("Restore", 'button', 'reset_rotation_48', "Reset all transformations and rotations", self.reset_all_transforms_cb), ("AutoLevels", 'button', 'auto_cuts_48', "Auto cut levels", self.auto_levels_cb), ("ResetContrast", 'button', 'reset_contrast_48', "Reset contrast", self.reset_contrast_cb), ("---", ), ("Preferences", 'button', 'settings_48', "Set channel preferences", lambda w: self.start_plugin_cb('Preferences')), ("FBrowser", 'button', 'open_48', "Open file", lambda w: self.start_plugin_cb('FBrowser')), ## ("Histogram", 'button', 'open_48', "Histogram and cut levels", ## lambda w: self.start_plugin_cb('Histogram')), #("Quit", 'button', 'exit_48', "Quit the program"), ): name = tup[0] if name == '---': tb.add_separator() continue #btn = self.fv.make_button(*tup[:4]) iconpath = os.path.join(self.fv.iconpath, "%s.png" % (tup[2])) btn = tb.add_action(None, toggle=(tup[1] == 'toggle'), iconpath=iconpath) if tup[3]: btn.set_tooltip(tup[3]) if tup[4]: btn.add_callback('activated', tup[4]) # add to our widget dict self.w[Widgets.name_mangle(name, pfx='btn_')] = btn # add widget to toolbar #tb.add_widget(btn) # stretcher #tb.add_widget(Widgets.Label(''), stretch=1) #sw.set_widget(tb) #top.add_widget(sw, stretch=1) container.add_widget(tb, stretch=1) self.gui_up = True
def build_gui(self, container): vbox, sw, orientation = Widgets.get_oriented_box(container, scrolled=False) vbox.set_border_width(4) vbox.set_spacing(2) width, height = 300, 300 # Uncomment to debug; passing parent logger generates too # much noise in the main logger #zi = CanvasTypes.ImageViewCanvas(logger=self.logger) zi = CanvasTypes.ImageViewCanvas(logger=None) zi.set_desired_size(width, height) zi.enable_autozoom('off') zi.enable_autocuts('off') #zi.set_scale_limits(0.001, 1000.0) zi.zoom_to(self.default_zoom, redraw=False) settings = zi.get_settings() settings.getSetting('zoomlevel').add_callback('set', self.zoomset, zi) zi.set_bg(0.4, 0.4, 0.4) zi.show_pan_mark(True, redraw=False) # for debugging zi.set_name('zoomimage') self.zoomimage = zi bd = zi.get_bindings() bd.enable_zoom(False) bd.enable_pan(False) bd.enable_cmap(False) iw = Widgets.wrap(zi.get_widget()) vpaned = Widgets.Splitter(orientation=orientation) vpaned.add_widget(iw) vpaned.add_widget(Widgets.Label('')) vbox.add_widget(vpaned, stretch=1) vbox2 = Widgets.VBox() captions = ( ("Zoom Radius:", 'label', 'Zoom Radius', 'hscale'), ("Zoom Amount:", 'label', 'Zoom Amount', 'hscale'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) vbox2.add_widget(w, stretch=0) self.w.zoom_radius.set_limits(1, 300, incr_value=1) self.w.zoom_radius.set_value(self.zoom_radius) self.w.zoom_radius.add_callback('value-changed', self.set_radius_cb) self.w.zoom_radius.set_tracking(True) self.w.zoom_amount.set_limits(-20, 30, incr_value=1) self.w.zoom_amount.set_value(self.zoom_amount) self.w.zoom_amount.add_callback('value-changed', self.set_amount_cb) self.w.zoom_amount.set_tracking(True) captions = ( ("Zoom:", 'label', 'Zoom', 'label'), ("Relative Zoom", 'checkbutton'), ("Refresh Interval", 'label', 'Refresh Interval', 'spinbutton'), ("Defaults", 'button'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.zoom.set_text(self.fv.scale2text(zi.get_scale())) b.relative_zoom.set_state(not self.t_abszoom) b.relative_zoom.add_callback("activated", self.set_absrel_cb) b.defaults.add_callback("activated", lambda w: self.set_defaults()) b.refresh_interval.set_limits(0, 200, incr_value=1) b.refresh_interval.set_value(int(self.refresh_interval * 1000)) b.refresh_interval.add_callback('value-changed', self.set_refresh_cb) row = Widgets.HBox() row.add_widget(w, stretch=0) row.add_widget(Widgets.Label(''), stretch=1) vbox2.add_widget(row, stretch=0) # stretch spacer = Widgets.Label('') vbox2.add_widget(spacer, stretch=1) vbox.add_widget(vbox2, stretch=0) vbox.add_widget(Widgets.Label(''), stretch=1) container.add_widget(sw, stretch=1)
def build_gui(self, container): assert iqcalc.have_scipy == True, \ Exception("Please install python-scipy to use this plugin") self.pickcenter = None vtop = Widgets.VBox() vtop.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) vpaned = Widgets.Splitter(orientation=orientation) nb = Widgets.TabWidget(tabpos='bottom') #nb.set_scrollable(True) self.w.nb1 = nb vpaned.add_widget(nb) cm, im = self.fv.cm, self.fv.im di = CanvasTypes.ImageViewCanvas(logger=self.logger) width, height = 200, 200 di.set_desired_size(width, height) di.enable_autozoom('off') di.enable_autocuts('off') di.zoom_to(3, redraw=False) settings = di.get_settings() settings.getSetting('zoomlevel').add_callback('set', self.zoomset, di) di.set_cmap(cm, redraw=False) di.set_imap(im, redraw=False) di.set_callback('none-move', self.detailxy) di.set_bg(0.4, 0.4, 0.4) # for debugging di.set_name('pickimage') self.pickimage = di bd = di.get_bindings() bd.enable_pan(True) bd.enable_zoom(True) bd.enable_cuts(True) iw = Widgets.wrap(di.get_widget()) nb.add_widget(iw, title="Image") if have_mpl: self.plot1 = Plot.Plot(logger=self.logger, width=2, height=3, dpi=72) self.w.canvas = self.plot1.canvas self.w.fig = self.plot1.fig self.w.ax = self.w.fig.add_subplot(111, axisbg='black') self.w.ax.set_aspect('equal', adjustable='box') self.w.ax.set_title('Contours') #self.w.ax.grid(True) canvas = self.w.canvas connect = canvas.mpl_connect # These are not ready for prime time... # connect("motion_notify_event", self.plot_motion_notify) # connect("button_press_event", self.plot_button_press) connect("scroll_event", self.plot_scroll) nb.add_widget(Widgets.wrap(canvas), title="Contour") self.plot2 = Plot.Plot(logger=self.logger, width=2, height=3, dpi=72) self.w.canvas2 = self.plot2.canvas self.w.fig2 = self.plot2.fig self.w.ax2 = self.w.fig2.add_subplot(111, axisbg='white') #self.w.ax2.set_aspect('equal', adjustable='box') self.w.ax2.set_ylabel('brightness') self.w.ax2.set_xlabel('pixels') self.w.ax2.set_title('FWHM') self.w.ax.grid(True) canvas = self.w.canvas2 nb.add_widget(Widgets.wrap(canvas), title="FWHM") ## self.msgFont = self.fv.getFont("sansFont", 12) ## tw = Widgets.TextArea(wrap=True, editable=False) ## tw.set_font(self.msgFont) ## self.tw = tw ## fr = Widgets.Frame("Instructions") ## vbox2 = Widgets.VBox() ## vbox2.add_widget(tw) ## vbox2.add_widget(Widgets.Label(''), stretch=1) ## fr.set_widget(vbox2) ## vbox.add_widget(fr, stretch=0) vpaned.add_widget(Widgets.Label('')) vbox.add_widget(vpaned, stretch=1) fr = Widgets.Frame("Pick") nb = Widgets.TabWidget(tabpos='bottom') self.w.nb2 = nb # Build report panel captions = ( ('Zoom:', 'label', 'Zoom', 'llabel', 'Contour Zoom:', 'label', 'Contour Zoom', 'llabel'), ('Object_X', 'label', 'Object_X', 'llabel', 'Object_Y', 'label', 'Object_Y', 'llabel'), ('RA:', 'label', 'RA', 'llabel', 'DEC:', 'label', 'DEC', 'llabel'), ('Equinox:', 'label', 'Equinox', 'llabel', 'Background:', 'label', 'Background', 'llabel'), ('Sky Level:', 'label', 'Sky Level', 'llabel', 'Brightness:', 'label', 'Brightness', 'llabel'), ('FWHM X:', 'label', 'FWHM X', 'llabel', 'FWHM Y:', 'label', 'FWHM Y', 'llabel'), ('FWHM:', 'label', 'FWHM', 'llabel', 'Star Size:', 'label', 'Star Size', 'llabel'), ('Sample Area:', 'label', 'Sample Area', 'llabel', 'Default Region', 'button'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.zoom.set_text(self.fv.scale2text(di.get_scale())) self.wdetail = b b.default_region.add_callback('activated', lambda w: self.reset_region()) b.default_region.set_tooltip("Reset region size to default") vbox1 = Widgets.VBox() vbox1.add_widget(w, stretch=0) # spacer vbox1.add_widget(Widgets.Label(''), stretch=0) # Pick field evaluation status hbox = Widgets.HBox() hbox.set_spacing(4) hbox.set_border_width(4) label = Widgets.Label() #label.set_alignment(0.05, 0.5) self.w.eval_status = label hbox.add_widget(self.w.eval_status, stretch=0) hbox.add_widget(Widgets.Label(''), stretch=1) vbox1.add_widget(hbox, stretch=0) # Pick field evaluation progress bar and stop button hbox = Widgets.HBox() hbox.set_spacing(4) hbox.set_border_width(4) btn = Widgets.Button("Stop") btn.add_callback('activated', lambda w: self.eval_intr()) btn.set_enabled(False) self.w.btn_intr_eval = btn hbox.add_widget(btn, stretch=0) self.w.eval_pgs = Widgets.ProgressBar() hbox.add_widget(self.w.eval_pgs, stretch=1) vbox1.add_widget(hbox, stretch=0) nb.add_widget(vbox1, title="Readout") # Build settings panel captions = ( ('Show Candidates', 'checkbutton'), ('Radius:', 'label', 'xlbl_radius', 'label', 'Radius', 'spinbutton'), ('Threshold:', 'label', 'xlbl_threshold', 'label', 'Threshold', 'entry'), ('Min FWHM:', 'label', 'xlbl_min_fwhm', 'label', 'Min FWHM', 'spinbutton'), ('Max FWHM:', 'label', 'xlbl_max_fwhm', 'label', 'Max FWHM', 'spinbutton'), ('Ellipticity:', 'label', 'xlbl_ellipticity', 'label', 'Ellipticity', 'entry'), ('Edge:', 'label', 'xlbl_edge', 'label', 'Edge', 'entry'), ('Max side:', 'label', 'xlbl_max_side', 'label', 'Max side', 'spinbutton'), ('Redo Pick', 'button'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.radius.set_tooltip("Radius for peak detection") b.threshold.set_tooltip("Threshold for peak detection (blank=default)") b.min_fwhm.set_tooltip("Minimum FWHM for selection") b.max_fwhm.set_tooltip("Maximum FWHM for selection") b.ellipticity.set_tooltip("Minimum ellipticity for selection") b.edge.set_tooltip("Minimum edge distance for selection") b.show_candidates.set_tooltip("Show all peak candidates") # radius control #b.radius.set_digits(2) #b.radius.set_numeric(True) b.radius.set_limits(5.0, 200.0, incr_value=1.0) b.radius.set_value(self.radius) def chg_radius(w, val): self.radius = float(val) self.w.xlbl_radius.set_text(str(self.radius)) return True b.xlbl_radius.set_text(str(self.radius)) b.radius.add_callback('value-changed', chg_radius) # threshold control def chg_threshold(w): threshold = None ths = w.get_text().strip() if len(ths) > 0: threshold = float(ths) self.threshold = threshold self.w.xlbl_threshold.set_text(str(self.threshold)) return True b.xlbl_threshold.set_text(str(self.threshold)) b.threshold.add_callback('activated', chg_threshold) # min fwhm #b.min_fwhm.set_digits(2) #b.min_fwhm.set_numeric(True) b.min_fwhm.set_limits(0.1, 200.0, incr_value=0.1) b.min_fwhm.set_value(self.min_fwhm) def chg_min(w, val): self.min_fwhm = float(val) self.w.xlbl_min_fwhm.set_text(str(self.min_fwhm)) return True b.xlbl_min_fwhm.set_text(str(self.min_fwhm)) b.min_fwhm.add_callback('value-changed', chg_min) # max fwhm #b.max_fwhm.set_digits(2) #b.max_fwhm.set_numeric(True) b.max_fwhm.set_limits(0.1, 200.0, incr_value=0.1) b.max_fwhm.set_value(self.max_fwhm) def chg_max(w, val): self.max_fwhm = float(val) self.w.xlbl_max_fwhm.set_text(str(self.max_fwhm)) return True b.xlbl_max_fwhm.set_text(str(self.max_fwhm)) b.max_fwhm.add_callback('value-changed', chg_max) # Ellipticity control def chg_ellipticity(w): minellipse = None val = w.get_text().strip() if len(val) > 0: minellipse = float(val) self.min_ellipse = minellipse self.w.xlbl_ellipticity.set_text(str(self.min_ellipse)) return True b.xlbl_ellipticity.set_text(str(self.min_ellipse)) b.ellipticity.add_callback('activated', chg_ellipticity) # Edge control def chg_edgew(w): edgew = None val = w.get_text().strip() if len(val) > 0: edgew = float(val) self.edgew = edgew self.w.xlbl_edge.set_text(str(self.edgew)) return True b.xlbl_edge.set_text(str(self.edgew)) b.edge.add_callback('activated', chg_edgew) #b.max_side.set_digits(0) #b.max_side.set_numeric(True) b.max_side.set_limits(5, 10000, incr_value=10) b.max_side.set_value(self.max_side) def chg_max_side(w, val): self.max_side = int(val) self.w.xlbl_max_side.set_text(str(self.max_side)) return True b.xlbl_max_side.set_text(str(self.max_side)) b.max_side.add_callback('value-changed', chg_max_side) b.redo_pick.add_callback('activated', lambda w: self.redo()) b.show_candidates.set_state(self.show_candidates) b.show_candidates.add_callback('activated', self.show_candidates_cb) nb.add_widget(w, title="Settings") # Build controls panel captions = ( ('Sky cut', 'button', 'Delta sky:', 'label', 'xlbl_delta_sky', 'label', 'Delta sky', 'entry'), ('Bright cut', 'button', 'Delta bright:', 'label', 'xlbl_delta_bright', 'label', 'Delta bright', 'entry'), ) w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.sky_cut.set_tooltip("Set image low cut to Sky Level") b.delta_sky.set_tooltip("Delta to apply to low cut") b.bright_cut.set_tooltip("Set image high cut to Sky Level+Brightness") b.delta_bright.set_tooltip("Delta to apply to high cut") b.sky_cut.set_enabled(False) self.w.btn_sky_cut = b.sky_cut self.w.btn_sky_cut.add_callback('activated', lambda w: self.sky_cut()) self.w.sky_cut_delta = b.delta_sky b.xlbl_delta_sky.set_text(str(self.delta_sky)) b.delta_sky.set_text(str(self.delta_sky)) def chg_delta_sky(w): delta_sky = 0.0 val = w.get_text().strip() if len(val) > 0: delta_sky = float(val) self.delta_sky = delta_sky self.w.xlbl_delta_sky.set_text(str(self.delta_sky)) return True b.delta_sky.add_callback('activated', chg_delta_sky) b.bright_cut.set_enabled(False) self.w.btn_bright_cut = b.bright_cut self.w.btn_bright_cut.add_callback('activated', lambda w: self.bright_cut()) self.w.bright_cut_delta = b.delta_bright b.xlbl_delta_bright.set_text(str(self.delta_bright)) b.delta_bright.set_text(str(self.delta_bright)) def chg_delta_bright(w): delta_bright = 0.0 val = w.get_text().strip() if len(val) > 0: delta_bright = float(val) self.delta_bright = delta_bright self.w.xlbl_delta_bright.set_text(str(self.delta_bright)) return True b.delta_bright.add_callback('activated', chg_delta_bright) nb.add_widget(w, title="Controls") vbox3 = Widgets.VBox() msgFont = self.fv.getFont("fixedFont", 10) tw = Widgets.TextArea(wrap=False, editable=True) tw.set_font(msgFont) self.w.report = tw sw1 = Widgets.ScrollArea() sw1.set_widget(tw) vbox3.add_widget(sw1, stretch=1) tw.append_text(self._mkreport_header()) btns = Widgets.HBox() btns.set_spacing(4) btn = Widgets.Button("Add Pick") btn.add_callback('activated', lambda w: self.add_pick_cb()) btns.add_widget(btn) btn = Widgets.CheckBox("Record Picks") btn.set_state(self.do_record) btn.add_callback('activated', self.record_cb) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) vbox3.add_widget(btns, stretch=0) nb.add_widget(vbox3, title="Report") ## vbox4 = Widgets.VBox() ## tw = Widgets.TextArea(wrap=False, editable=True) ## tw.set_font(msgFont) ## self.w.correct = tw ## sw1 = Widgets.ScrollArea() ## sw1.set_widget(tw) ## vbox4.add_widget(sw1, stretch=1) ## tw.append_text("# paste a reference report here") ## btns = Widgets.HBox() ## btns.set_spacing(4) ## btn = Widgets.Button("Correct WCS") ## btn.add_callback('activated', lambda w: self.correct_wcs()) ## btns.add_widget(btn) ## vbox4.add_widget(btns, stretch=0) ## nb.add_widget(vbox4, title="Correct") fr.set_widget(nb) vbox.add_widget(fr, stretch=0) ## spacer = Widgets.Label('') ## vbox.add_widget(spacer, stretch=1) vtop.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) vtop.add_widget(btns, stretch=0) container.add_widget(vtop, stretch=1)
def _create_info_window(self): sw = Widgets.ScrollArea() vbox = Widgets.VBox() captions = ( ('Name:', 'label', 'Name', 'llabel'), ('Object:', 'label', 'Object', 'llabel'), ('X:', 'label', 'X', 'llabel'), ('Y:', 'label', 'Y', 'llabel'), ('Value:', 'label', 'Value', 'llabel'), ('RA:', 'label', 'RA', 'llabel'), ('DEC:', 'label', 'DEC', 'llabel'), ('Equinox:', 'label', 'Equinox', 'llabel'), ('Dimensions:', 'label', 'Dimensions', 'llabel'), ('Min:', 'label', 'Min', 'llabel'), ('Max:', 'label', 'Max', 'llabel'), ) w, b = Widgets.build_info(captions) col = Widgets.VBox() row = Widgets.HBox() row.set_spacing(0) row.set_border_width(0) row.add_widget(w, stretch=0) row.add_widget(Widgets.Label(''), stretch=1) col.add_widget(row, stretch=1) col.add_widget(Widgets.Label(''), stretch=1) sw2 = Widgets.ScrollArea() sw2.set_widget(col) vbox.add_widget(sw2, stretch=2) captions = ( ('Zoom:', 'label', 'Zoom', 'llabel'), ('Cut Low:', 'label', 'Cut Low Value', 'llabel', 'Cut Low', 'entry'), ('Cut High:', 'label', 'Cut High Value', 'llabel', 'Cut High', 'entry'), ('Auto Levels', 'button', 'spacer1', 'spacer', 'Cut Levels', 'button'), ('Cut New:', 'label', 'Cut New', 'llabel'), ('Zoom New:', 'label', 'Zoom New', 'llabel'), ('Preferences', 'button'), ) w, b2 = Widgets.build_info(captions) b.update(b2) # TODO: need a more general solution to gtk labels resizing their # parent window #b.object.set_length(12) b.cut_levels.set_tooltip("Set cut levels manually") b.auto_levels.set_tooltip("Set cut levels by algorithm") b.cut_low.set_tooltip("Set low cut level (press Enter)") b.cut_high.set_tooltip("Set high cut level (press Enter)") b.preferences.set_tooltip("Set preferences for this channel") row = Widgets.HBox() row.set_spacing(0) row.set_border_width(0) row.add_widget(w, stretch=0) row.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(row, stretch=1) # stretcher vbox.add_widget(Widgets.Label(''), stretch=0) # Convenience navigation buttons btns = Widgets.HBox() btns.set_spacing(4) btns.set_border_width(4) bw = Bunch.Bunch() for tup in ( #("Load", 'button', 'fits_open_48', "Open an image file"), ("Prev", 'button', 'prev_48', "Go to previous image"), ("Next", 'button', 'next_48', "Go to next image"), ("Zoom In", 'button', 'zoom_in_48', "Zoom in"), ("Zoom Out", 'button', 'zoom_out_48', "Zoom out"), ("Zoom Fit", 'button', 'zoom_fit_48', "Zoom to fit window size"), ("Zoom 1:1", 'button', 'zoom_100_48', "Zoom to 100% (1:1)"), #("Quit", 'button', 'exit_48', "Quit the program"), ): btn = self.fv.make_button(*tup) name = tup[0] if tup[3]: btn.set_tooltip(tup[3]) bw[Widgets.name_mangle(name, pfx='btn_')] = btn btns.add_widget(btn, stretch=1) #self.w.btn_load.connect("clicked", lambda w: self.gui_load_file()) bw.btn_prev.add_callback('activated', lambda w: self.fv.prev_img()) bw.btn_next.add_callback('activated', lambda w: self.fv.next_img()) bw.btn_zoom_in.add_callback('activated', lambda w: self.fv.zoom_in()) bw.btn_zoom_out.add_callback('activated', lambda w: self.fv.zoom_out()) bw.btn_zoom_fit.add_callback('activated', lambda w: self.fv.zoom_fit()) bw.btn_zoom_1_1.add_callback('activated', lambda w: self.fv.zoom_1_to_1()) vbox.add_widget(btns, stretch=0) sw.set_widget(vbox) #sw.set_size_request(-1, 420) #sw.show_all() return sw, b
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, self.orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) msgFont = self.fv.getFont('sansFont', 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(msgFont) self.tw = tw fr = Widgets.Frame('Instructions') vbox2 = Widgets.VBox() vbox2.add_widget(tw) vbox2.add_widget(Widgets.Label(''), stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame('Background Selection') captions = (('Type:', 'label', 'BG type', 'combobox'), ) w, b = Widgets.build_info(captions) self.w.update(b) combobox = b.bg_type for name in self._bgtype_options: combobox.append_text(name) b.bg_type.set_index(self._bgtype_options.index(self.bgtype)) b.bg_type.widget.activated[str].connect(self.set_bgtype) fr.set_widget(w) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame('Attributes') vbox2 = Widgets.VBox() self.w.bgtype_attr_vbox = Widgets.VBox() vbox2.add_widget(self.w.bgtype_attr_vbox, stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) captions = (('Background Value:', 'label', 'Background Value', 'entry'), ('Subtract', 'button', 'Save Parameters', 'button')) w, b = Widgets.build_info(captions, orientation=self.orientation) self.w.update(b) b.background_value.set_tooltip('Background value') b.background_value.set_text(str(self.bgval)) b.background_value.widget.editingFinished.connect(self.set_constant_bg) b.background_value.widget.setReadOnly(True) b.background_value.widget.setEnabled(True) b.background_value.widget.setStyleSheet( 'QLineEdit{background: white;}') b.subtract.set_tooltip('Subtract background') b.subtract.widget.clicked.connect(self.sub_bg) b.subtract.widget.setEnabled(False) b.save_parameters.set_tooltip('Save background subtraction parameters') b.save_parameters.widget.clicked.connect(self.save_params) vbox.add_widget(w, stretch=0) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(3) btn = Widgets.Button('Close') btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) # Populate default attributes frame self.set_bgtype(self.bgtype) self.gui_up = True
def build_gui(self, container): canvas = CanvasTypes.DrawingCanvas() canvas.enable_draw(False) canvas.set_callback('none-move', self.cursormotion) canvas.add_callback('key-press', self.window_key_press) canvas.add_callback('key-release', self.window_key_release) self.canvas = canvas vbox = Widgets.VBox() fr = Widgets.Frame("IRAF") captions = [ ("Addr:", 'label', "Addr", 'llabel', 'Restart', 'button'), ("Set Addr:", 'label', "Set Addr", 'entry'), ("Control", 'hbox'), ("Channel:", 'label', 'Channel', 'llabel'), ] w, b = Widgets.build_info(captions) self.w.update(b) addr = str(self.addr.name) b.addr.set_text(addr) b.restart.set_tooltip("Restart the server") b.restart.add_callback('activated', self.restart_cb) b.set_addr.set_length(100) b.addr.set_text(addr) b.set_addr.set_tooltip("Set address to run remote control server") b.set_addr.add_callback('activated', self.set_addr_cb) self.w.mode_d = {} btn1 = Widgets.RadioButton("Ginga") btn1.set_state(True) btn1.add_callback('activated', lambda w, val: self.switchMode('ginga')) self.w.mode_d['ginga'] = btn1 self.w.control.add_widget(btn1) btn2 = Widgets.RadioButton("IRAF", group=btn1) btn2.add_callback('activated', lambda w: self.switchMode('iraf')) self.w.mode_d['iraf'] = btn2 self.w.control.add_widget(btn2) fr.set_widget(w) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("Frame/Channel") lbl = Widgets.Label("") self.w.frch = lbl fr.set_widget(lbl) vbox.add_widget(fr, stretch=0) # stretch vbox.add_widget(Widgets.Label(''), stretch=1) btns = Widgets.HBox() btns.set_spacing(4) btns.set_border_width(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) vbox.add_widget(btns) container.add_widget(vbox, stretch=1) self.gui_up = True fmap = self.get_channel_frame_mapping() self.update_chinfo(fmap)
def build_gui(self, container): top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container) vbox.set_border_width(4) vbox.set_spacing(2) msgFont = self.fv.getFont('sansFont', 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(msgFont) self.tw = tw fr = Widgets.Frame('Instructions') vbox2 = Widgets.VBox() vbox2.add_widget(tw) vbox2.add_widget(Widgets.Label(''), stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame('Single Pixel') captions = [('X:', 'label', 'X', 'entry'), ('Y:', 'label', 'Y', 'entry'), ('DQ Flag:', 'label', 'DQ', 'llabel')] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.x.set_tooltip('X of pixel') b.x.set_text(str(self.xcen)) b.x.widget.editingFinished.connect(self.set_xcen) b.y.set_tooltip('Y of pixel') b.y.set_text(str(self.ycen)) b.y.widget.editingFinished.connect(self.set_ycen) b.dq.set_tooltip('DQ value of pixel') b.dq.set_text(self._no_keyword) b.dq.widget.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) self.pxdqlist = QtGui.QListWidget() splitter = Widgets.Splitter('vertical') splitter.add_widget(w) splitter.widget.addWidget(self.pxdqlist) fr.set_widget(splitter) vbox.add_widget(fr, stretch=1) fr = Widgets.Frame('Whole Image') captions = [('Number of pixels:', 'llabel', 'npix', 'llabel', 'spacer1', 'spacer')] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.npix.set_tooltip('Number of affected pixels') b.npix.set_text(self._no_keyword) b.npix.widget.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) self.imdqlist = QtGui.QListWidget() self.imdqlist.setSelectionMode( QtGui.QAbstractItemView.ExtendedSelection) self.imdqlist.itemSelectionChanged.connect(self.mark_dqs) splitter = Widgets.Splitter('vertical') splitter.add_widget(w) splitter.widget.addWidget(self.imdqlist) fr.set_widget(splitter) vbox.add_widget(fr, stretch=1) top.add_widget(sw, stretch=1) btns = Widgets.HBox() btns.set_border_width(4) btns.set_spacing(3) btn = Widgets.Button('Close') btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn, stretch=0) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=1) self.gui_up = True # Populate fields based on active image self.redo()
def build_gui(self, container): assert have_pyfits == True, \ Exception("Please install astropy/pyfits to use this plugin") top = Widgets.VBox() top.set_border_width(4) vbox, sw, orientation = Widgets.get_oriented_box(container, scrolled=False) self.orientation = orientation vbox.set_border_width(4) vbox.set_spacing(2) self.msgFont = self.fv.getFont("sansFont", 12) tw = Widgets.TextArea(wrap=True, editable=False) tw.set_font(self.msgFont) self.tw = tw fr = Widgets.Frame("Instructions") vbox2 = Widgets.VBox() vbox2.add_widget(tw) vbox2.add_widget(Widgets.Label(''), stretch=1) fr.set_widget(vbox2) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("HDU") captions = [ ("Num HDUs:", 'label', "Num HDUs", 'llabel'), ("Choose HDU", 'combobox'), ] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) self.w.numhdu = b.num_hdus self.w.hdu = b.choose_hdu self.w.hdu.set_tooltip("Choose which HDU to view") self.w.hdu.add_callback('activated', self.set_hdu_cb) fr.set_widget(w) vbox.add_widget(fr, stretch=0) fr = Widgets.Frame("NAXIS") self.naxisfr = fr vbox.add_widget(fr, stretch=0) captions = [ ("First", 'button', "Prev", 'button', "Stop", 'button'), ("Last", 'button', "Next", 'button', "Play", 'button'), ("Interval:", 'label', "Interval", 'spinfloat'), ] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) b.next.add_callback('activated', lambda w: six.advance_iterator(self)) b.prev.add_callback('activated', lambda w: self.prev()) b.first.add_callback('activated', lambda w: self.first()) b.last.add_callback('activated', lambda w: self.last()) b.play.add_callback('activated', lambda w: self.play_start()) b.stop.add_callback('activated', lambda w: self.play_stop()) lower, upper = 0.1, 8.0 b.interval.set_limits(lower, upper, incr_value=0.1) b.interval.set_value(lower) b.interval.set_decimals(2) b.interval.add_callback('value-changed', self.play_int_cb) vbox.add_widget(w, stretch=0) captions = [ ("Slice:", 'label', "Slice", 'llabel', "Value:", 'label', "Value", 'llabel'), ] w, b = Widgets.build_info(captions, orientation=orientation) self.w.update(b) vbox.add_widget(w, stretch=0) spacer = Widgets.Label('') vbox.add_widget(spacer, stretch=1) top.add_widget(sw, stretch=0) btns = Widgets.HBox() btns.set_spacing(4) btn = Widgets.Button("Close") btn.add_callback('activated', lambda w: self.close()) btns.add_widget(btn) btns.add_widget(Widgets.Label(''), stretch=1) top.add_widget(btns, stretch=0) container.add_widget(top, stretch=0)