Пример #1
0
    def __init__(self, *args, **kwds):
        '''Instantiate a data tool frame
        
        module_name: name of module to instantiate
        measurements_file_name: name of measurements file
        '''
        assert kwds.has_key("module_name"), "DataToolFrame() needs a module_name argument"
        assert kwds.has_key("measurements_file_name"), "DataToolFrame() needs a measurements_file_name argument"
        module_name = kwds["module_name"]
        measurements_file_name = kwds["measurements_file_name"]

        kwds_copy = kwds.copy()
        del kwds_copy["module_name"]
        del kwds_copy["measurements_file_name"]
        kwds_copy["title"]="%s data tool"%module_name
        wx.Frame.__init__(self, *args, **kwds_copy)
        self.module = instantiate_module(module_name)
        self.pipeline = cpp.Pipeline()
        if h5py.is_hdf5(measurements_file_name):
            self.workspace = cpw.Workspace(self.pipeline, self.module, None, None, None,
                                           None)
            self.workspace.load(measurements_file_name, True)
            self.measurements = self.workspace.measurements
        else:
            self.pipeline.load(measurements_file_name)
            self.load_measurements(measurements_file_name)
            self.workspace = cpw.Workspace(self.pipeline, self.module, None, None,
                                           self.measurements, None)
        
        self.module.module_num = len(self.pipeline.modules())+1
        self.pipeline.add_module(self.module)

        self.sizer = wx.BoxSizer(wx.VERTICAL)

        module_panel = wx.lib.scrolledpanel.ScrolledPanel(self,-1,style=wx.SUNKEN_BORDER)
        module_panel.BackgroundColour = cpprefs.get_background_color()
        self.BackgroundColour = cpprefs.get_background_color()

        self.module_view = ModuleView(module_panel, self.workspace, True)
        self.module_view.set_selection(self.module.module_num)
        def on_change(caller, event):
            setting = event.get_setting()
            proposed_value = event.get_proposed_value()
            setting.value = proposed_value
            self.pipeline.edit_module(event.get_module().module_num, False)
            self.module_view.reset_view()
        self.module_view.add_listener(on_change)

        #
        # Add a panel for the "run" button
        #
        panel = wx.Panel(self)
        panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
        button = wx.Button(panel, label = "Run")

        self.sizer.Add(module_panel, 1, wx.EXPAND)
        self.sizer.Add(panel, 0, wx.EXPAND)

        panel_sizer.AddStretchSpacer()
        panel_sizer.Add(button, 0, wx.RIGHT, button.Size[1])
        panel.SetSizer(panel_sizer)

        wx.EVT_BUTTON(self, button.Id, self.on_run)
        #
        # Add a file menu
        #
        file_menu = wx.Menu()
        file_menu.Append(ID_FILE_LOAD_MEASUREMENTS, "&Load measurements")
        file_menu.Append(ID_FILE_SAVE_MEASUREMENTS, "&Save measurements")
        file_menu.Append(ID_FILE_EXIT, "E&xit")
        self.MenuBar = wx.MenuBar()
        self.MenuBar.Append(file_menu, "&File")
        self.Bind(wx.EVT_MENU, self.on_load_measurements, id=ID_FILE_LOAD_MEASUREMENTS)
        self.Bind(wx.EVT_MENU, self.on_save_measurements, id=ID_FILE_SAVE_MEASUREMENTS)
        self.Bind(wx.EVT_MENU, self.on_exit, id=ID_FILE_EXIT)
        accelerators = wx.AcceleratorTable([
            (wx.ACCEL_CMD, ord("W"), ID_FILE_EXIT),
            (wx.ACCEL_CMD, ord("O"), ID_FILE_LOAD_MEASUREMENTS),
            (wx.ACCEL_CMD, ord("S"), ID_FILE_SAVE_MEASUREMENTS)])
        self.SetAcceleratorTable(accelerators)
        #
        # Add an image menu
        #
        image_menu = wx.Menu()
        image_menu.Append(ID_IMAGE_CHOOSE, "&Choose")
        self.MenuBar.Append(image_menu, "&Image")
        self.Bind(wx.EVT_MENU, self.on_image_choose, id=ID_IMAGE_CHOOSE)
        
        self.SetSizer(self.sizer)
        self.Size = (self.module_view.get_max_width(), self.Size[1])
        module_panel.Layout()
        self.Show()
        self.tbicon = wx.TaskBarIcon()
        self.tbicon.SetIcon(get_cp_icon(), "CellProfiler2.0")
        self.SetIcon(get_cp_icon())
Пример #2
0
    def __init__(self, *args, **kwds):
        '''Instantiate a data tool frame
        
        module_name: name of module to instantiate
        measurements_file_name: name of measurements file
        '''
        assert kwds.has_key(
            "module_name"), "DataToolFrame() needs a module_name argument"
        assert kwds.has_key(
            "measurements_file_name"
        ), "DataToolFrame() needs a measurements_file_name argument"
        module_name = kwds["module_name"]
        measurements_file_name = kwds["measurements_file_name"]

        kwds_copy = kwds.copy()
        del kwds_copy["module_name"]
        del kwds_copy["measurements_file_name"]
        kwds_copy["title"] = "%s data tool" % module_name
        wx.Frame.__init__(self, *args, **kwds_copy)
        self.module = instantiate_module(module_name)
        self.module.use_as_data_tool = True
        self.pipeline = cpp.Pipeline()
        if h5py.is_hdf5(measurements_file_name):
            self.workspace = cpw.Workspace(self.pipeline, self.module, None,
                                           None, None, None)
            self.workspace.load(measurements_file_name, True)
            self.measurements = self.workspace.measurements
        else:
            self.pipeline.load(measurements_file_name)
            self.load_measurements(measurements_file_name)
            self.workspace = cpw.Workspace(self.pipeline, self.module, None,
                                           None, self.measurements, None)

        self.module.module_num = len(self.pipeline.modules()) + 1
        self.pipeline.add_module(self.module)

        self.sizer = wx.BoxSizer(wx.VERTICAL)

        module_panel = wx.lib.scrolledpanel.ScrolledPanel(
            self, -1, style=wx.SUNKEN_BORDER)
        module_panel.BackgroundColour = cpprefs.get_background_color()
        self.BackgroundColour = cpprefs.get_background_color()

        self.module_view = ModuleView(module_panel, self.workspace, True)
        self.module_view.set_selection(self.module.module_num)

        def on_change(caller, event):
            setting = event.get_setting()
            proposed_value = event.get_proposed_value()
            setting.value = proposed_value
            self.pipeline.edit_module(event.get_module().module_num, False)
            self.module_view.reset_view()
            self.module_view.request_validation()

        self.module_view.add_listener(on_change)

        #
        # Add a panel for the "run" button
        #
        panel = wx.Panel(self)
        panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
        button = wx.Button(panel, label="Run")

        self.sizer.Add(module_panel, 1, wx.EXPAND)
        self.sizer.Add(panel, 0, wx.EXPAND)

        panel_sizer.AddStretchSpacer()
        panel_sizer.Add(button, 0, wx.RIGHT, button.Size[1])
        panel.SetSizer(panel_sizer)

        wx.EVT_BUTTON(self, button.Id, self.on_run)
        #
        # Add a file menu
        #
        file_menu = wx.Menu()
        file_menu.Append(ID_FILE_LOAD_MEASUREMENTS, "&Load measurements")
        file_menu.Append(ID_FILE_SAVE_MEASUREMENTS, "&Save measurements")
        file_menu.Append(ID_FILE_EXIT, "E&xit")
        self.MenuBar = wx.MenuBar()
        self.MenuBar.Append(file_menu, "&File")
        self.Bind(wx.EVT_MENU,
                  self.on_load_measurements,
                  id=ID_FILE_LOAD_MEASUREMENTS)
        self.Bind(wx.EVT_MENU,
                  self.on_save_measurements,
                  id=ID_FILE_SAVE_MEASUREMENTS)
        self.Bind(wx.EVT_MENU, self.on_exit, id=ID_FILE_EXIT)
        accelerators = wx.AcceleratorTable([
            (wx.ACCEL_CMD, ord("W"), ID_FILE_EXIT),
            (wx.ACCEL_CMD, ord("O"), ID_FILE_LOAD_MEASUREMENTS),
            (wx.ACCEL_CMD, ord("S"), ID_FILE_SAVE_MEASUREMENTS)
        ])
        self.SetAcceleratorTable(accelerators)
        #
        # Add an image menu
        #
        image_menu = wx.Menu()
        image_menu.Append(ID_IMAGE_CHOOSE, "&Choose")
        self.MenuBar.Append(image_menu, "&Image")
        self.Bind(wx.EVT_MENU, self.on_image_choose, id=ID_IMAGE_CHOOSE)

        self.SetSizer(self.sizer)
        self.Size = (self.module_view.get_max_width(), self.Size[1])
        module_panel.Layout()
        self.Show()
        self.tbicon = wx.TaskBarIcon()
        self.tbicon.SetIcon(get_cp_icon(), "CellProfiler2.0")
        self.SetIcon(get_cp_icon())
Пример #3
0
class DataToolFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        '''Instantiate a data tool frame
        
        module_name: name of module to instantiate
        measurements_file_name: name of measurements file
        '''
        assert kwds.has_key("module_name"), "DataToolFrame() needs a module_name argument"
        assert kwds.has_key("measurements_file_name"), "DataToolFrame() needs a measurements_file_name argument"
        module_name = kwds["module_name"]
        measurements_file_name = kwds["measurements_file_name"]

        kwds_copy = kwds.copy()
        del kwds_copy["module_name"]
        del kwds_copy["measurements_file_name"]
        kwds_copy["title"]="%s data tool"%module_name
        wx.Frame.__init__(self, *args, **kwds_copy)
        self.module = instantiate_module(module_name)
        self.pipeline = cpp.Pipeline()
        if h5py.is_hdf5(measurements_file_name):
            self.workspace = cpw.Workspace(self.pipeline, self.module, None, None, None,
                                           None)
            self.workspace.load(measurements_file_name, True)
            self.measurements = self.workspace.measurements
        else:
            self.pipeline.load(measurements_file_name)
            self.load_measurements(measurements_file_name)
            self.workspace = cpw.Workspace(self.pipeline, self.module, None, None,
                                           self.measurements, None)
        
        self.module.module_num = len(self.pipeline.modules())+1
        self.pipeline.add_module(self.module)

        self.sizer = wx.BoxSizer(wx.VERTICAL)

        module_panel = wx.lib.scrolledpanel.ScrolledPanel(self,-1,style=wx.SUNKEN_BORDER)
        module_panel.BackgroundColour = cpprefs.get_background_color()
        self.BackgroundColour = cpprefs.get_background_color()

        self.module_view = ModuleView(module_panel, self.workspace, True)
        self.module_view.set_selection(self.module.module_num)
        def on_change(caller, event):
            setting = event.get_setting()
            proposed_value = event.get_proposed_value()
            setting.value = proposed_value
            self.pipeline.edit_module(event.get_module().module_num, False)
            self.module_view.reset_view()
        self.module_view.add_listener(on_change)

        #
        # Add a panel for the "run" button
        #
        panel = wx.Panel(self)
        panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
        button = wx.Button(panel, label = "Run")

        self.sizer.Add(module_panel, 1, wx.EXPAND)
        self.sizer.Add(panel, 0, wx.EXPAND)

        panel_sizer.AddStretchSpacer()
        panel_sizer.Add(button, 0, wx.RIGHT, button.Size[1])
        panel.SetSizer(panel_sizer)

        wx.EVT_BUTTON(self, button.Id, self.on_run)
        #
        # Add a file menu
        #
        file_menu = wx.Menu()
        file_menu.Append(ID_FILE_LOAD_MEASUREMENTS, "&Load measurements")
        file_menu.Append(ID_FILE_SAVE_MEASUREMENTS, "&Save measurements")
        file_menu.Append(ID_FILE_EXIT, "E&xit")
        self.MenuBar = wx.MenuBar()
        self.MenuBar.Append(file_menu, "&File")
        self.Bind(wx.EVT_MENU, self.on_load_measurements, id=ID_FILE_LOAD_MEASUREMENTS)
        self.Bind(wx.EVT_MENU, self.on_save_measurements, id=ID_FILE_SAVE_MEASUREMENTS)
        self.Bind(wx.EVT_MENU, self.on_exit, id=ID_FILE_EXIT)
        accelerators = wx.AcceleratorTable([
            (wx.ACCEL_CMD, ord("W"), ID_FILE_EXIT),
            (wx.ACCEL_CMD, ord("O"), ID_FILE_LOAD_MEASUREMENTS),
            (wx.ACCEL_CMD, ord("S"), ID_FILE_SAVE_MEASUREMENTS)])
        self.SetAcceleratorTable(accelerators)
        #
        # Add an image menu
        #
        image_menu = wx.Menu()
        image_menu.Append(ID_IMAGE_CHOOSE, "&Choose")
        self.MenuBar.Append(image_menu, "&Image")
        self.Bind(wx.EVT_MENU, self.on_image_choose, id=ID_IMAGE_CHOOSE)
        
        self.SetSizer(self.sizer)
        self.Size = (self.module_view.get_max_width(), self.Size[1])
        module_panel.Layout()
        self.Show()
        self.tbicon = wx.TaskBarIcon()
        self.tbicon.SetIcon(get_cp_icon(), "CellProfiler2.0")
        self.SetIcon(get_cp_icon())
    
    def on_load_measurements(self, event):
        dlg = wx.FileDialog(self, "Load a measurements file",
                            wildcard = "Measurements file (*.mat,*.h5)|*.mat;*.h5",
                            style = wx.FD_OPEN)
        if dlg.ShowModal() == wx.ID_OK:
            self.load_measurements(dlg.GetPath())
    
    def on_save_measurements(self, event):
        with wx.FileDialog(self, "Save measurements file", wildcard = 
                           "Matlab measurements file (*.mat)|*.mat",
                           style = wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as dlg:
            if dlg.ShowModal() == wx.ID_OK:
                self.pipeline.save_measurements(dlg.GetPath(),
                                                self.measurements)
    
    def on_exit(self, event):
        self.Close()
        
    def on_image_choose(self, event):
        '''Choose an image from the image set'''
        dlg = wx.Dialog(self)
        dlg.Title = "Choose an image set"
        sizer = wx.BoxSizer(wx.VERTICAL)
        dlg.SetSizer(sizer)
        choose_sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(choose_sizer, 1, wx.EXPAND | wx.ALL, 5)
        choose_sizer.Add(wx.StaticText(dlg, -1, label="Image set:"),
                         0, wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
        metadata_db = {}
        metadata_features = [ 
            x for x in self.measurements.get_feature_names(cpmeas.IMAGE)
            if x.startswith('Metadata')]
        sel = None
        for i in self.measurements.get_image_numbers():
            metadata_key = ','.join(['%s=%s' % (
                feature, 
                self.measurements.get_measurement(cpmeas.IMAGE, feature, i))
                                     for feature in metadata_features])
            metadata_db[i] = metadata_key
            if i == self.measurements.image_set_number:
                sel = i
        choices = ["%d: %s" % (i, metadata_db[i])
                   for i in self.measurements.get_image_numbers()]
        choice_ctl = wx.Choice(dlg, -1, choices=choices)
        # Select the current image set
        if sel is not None:
            choice_ctl.SetSelection(sel)
        choose_sizer.Add(choice_ctl, 1, wx.EXPAND | wx.LEFT, 5)
        button_sizer = wx.StdDialogButtonSizer()
        ok_button = wx.Button(dlg, wx.ID_OK)
        ok_button.SetDefault()
        ok_button.SetHelpText("Press the OK button to change the current image to the one selected above")
        button_sizer.AddButton(ok_button)
        
        cancel_button = wx.Button(dlg, wx.ID_CANCEL)
        cancel_button.SetHelpText("Press the cancel button if you do not want to change the current image")
        button_sizer.AddButton(cancel_button)
        button_sizer.Realize()
        sizer.Add(button_sizer, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT|wx.ALL, 5)
        dlg.Fit()
        if dlg.ShowModal() == wx.ID_OK:
            index = choice_ctl.GetSelection()
            self.measurements.image_set_number = index+1
        
    def load_measurements(self, measurements_file_name):
        self.measurements = cpmeas.load_measurements(
            measurements_file_name, can_overwrite = True)
        # Start on the first image
        self.measurements.next_image_set(1)
        
    def on_run(self, event):
        image_set_list = cpi.ImageSetList()
        image_set = image_set_list.get_image_set(0)
        workspace = cpw.Workspace(self.pipeline,
                                  self.module,
                                  image_set,
                                  cpo.ObjectSet(),
                                  self.measurements,
                                  image_set_list,
                                  frame=self)
        self.module.show_window = True  # to make sure it saves display data
        self.module.run_as_data_tool(workspace)
        self.measurements.flush()
        fig = cpf.create_or_find(parent=self,
                                 title="%s Output" % (self.module.module_name),
                                 name="CellProfiler:DataTool:%s" % (self.module.module_name))
        self.module.display(workspace, fig)
        fig.Refresh()
Пример #4
0
class DataToolFrame(wx.Frame):
    def __init__(self, *args, **kwds):
        '''Instantiate a data tool frame
        
        module_name: name of module to instantiate
        measurements_file_name: name of measurements file
        '''
        assert kwds.has_key(
            "module_name"), "DataToolFrame() needs a module_name argument"
        assert kwds.has_key(
            "measurements_file_name"
        ), "DataToolFrame() needs a measurements_file_name argument"
        module_name = kwds["module_name"]
        measurements_file_name = kwds["measurements_file_name"]

        kwds_copy = kwds.copy()
        del kwds_copy["module_name"]
        del kwds_copy["measurements_file_name"]
        kwds_copy["title"] = "%s data tool" % module_name
        wx.Frame.__init__(self, *args, **kwds_copy)
        self.module = instantiate_module(module_name)
        self.module.use_as_data_tool = True
        self.pipeline = cpp.Pipeline()
        if h5py.is_hdf5(measurements_file_name):
            self.workspace = cpw.Workspace(self.pipeline, self.module, None,
                                           None, None, None)
            self.workspace.load(measurements_file_name, True)
            self.measurements = self.workspace.measurements
        else:
            self.pipeline.load(measurements_file_name)
            self.load_measurements(measurements_file_name)
            self.workspace = cpw.Workspace(self.pipeline, self.module, None,
                                           None, self.measurements, None)

        self.module.module_num = len(self.pipeline.modules()) + 1
        self.pipeline.add_module(self.module)

        self.sizer = wx.BoxSizer(wx.VERTICAL)

        module_panel = wx.lib.scrolledpanel.ScrolledPanel(
            self, -1, style=wx.SUNKEN_BORDER)
        module_panel.BackgroundColour = cpprefs.get_background_color()
        self.BackgroundColour = cpprefs.get_background_color()

        self.module_view = ModuleView(module_panel, self.workspace, True)
        self.module_view.set_selection(self.module.module_num)

        def on_change(caller, event):
            setting = event.get_setting()
            proposed_value = event.get_proposed_value()
            setting.value = proposed_value
            self.pipeline.edit_module(event.get_module().module_num, False)
            self.module_view.reset_view()
            self.module_view.request_validation()

        self.module_view.add_listener(on_change)

        #
        # Add a panel for the "run" button
        #
        panel = wx.Panel(self)
        panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
        button = wx.Button(panel, label="Run")

        self.sizer.Add(module_panel, 1, wx.EXPAND)
        self.sizer.Add(panel, 0, wx.EXPAND)

        panel_sizer.AddStretchSpacer()
        panel_sizer.Add(button, 0, wx.RIGHT, button.Size[1])
        panel.SetSizer(panel_sizer)

        wx.EVT_BUTTON(self, button.Id, self.on_run)
        #
        # Add a file menu
        #
        file_menu = wx.Menu()
        file_menu.Append(ID_FILE_LOAD_MEASUREMENTS, "&Load measurements")
        file_menu.Append(ID_FILE_SAVE_MEASUREMENTS, "&Save measurements")
        file_menu.Append(ID_FILE_EXIT, "E&xit")
        self.MenuBar = wx.MenuBar()
        self.MenuBar.Append(file_menu, "&File")
        self.Bind(wx.EVT_MENU,
                  self.on_load_measurements,
                  id=ID_FILE_LOAD_MEASUREMENTS)
        self.Bind(wx.EVT_MENU,
                  self.on_save_measurements,
                  id=ID_FILE_SAVE_MEASUREMENTS)
        self.Bind(wx.EVT_MENU, self.on_exit, id=ID_FILE_EXIT)
        accelerators = wx.AcceleratorTable([
            (wx.ACCEL_CMD, ord("W"), ID_FILE_EXIT),
            (wx.ACCEL_CMD, ord("O"), ID_FILE_LOAD_MEASUREMENTS),
            (wx.ACCEL_CMD, ord("S"), ID_FILE_SAVE_MEASUREMENTS)
        ])
        self.SetAcceleratorTable(accelerators)
        #
        # Add an image menu
        #
        image_menu = wx.Menu()
        image_menu.Append(ID_IMAGE_CHOOSE, "&Choose")
        self.MenuBar.Append(image_menu, "&Image")
        self.Bind(wx.EVT_MENU, self.on_image_choose, id=ID_IMAGE_CHOOSE)

        self.SetSizer(self.sizer)
        self.Size = (self.module_view.get_max_width(), self.Size[1])
        module_panel.Layout()
        self.Show()
        self.tbicon = wx.TaskBarIcon()
        self.tbicon.SetIcon(get_cp_icon(), "CellProfiler2.0")
        self.SetIcon(get_cp_icon())

    def on_load_measurements(self, event):
        dlg = wx.FileDialog(
            self,
            "Load a measurements file",
            wildcard="Measurements file (*.mat,*.h5)|*.mat;*.h5",
            style=wx.FD_OPEN)
        if dlg.ShowModal() == wx.ID_OK:
            self.load_measurements(dlg.GetPath())

    def on_save_measurements(self, event):
        with wx.FileDialog(
                self,
                "Save measurements file",
                wildcard="CellProfiler measurements file (*.h5)|*.h5|"
                "Matlab measurements file (*.mat)|*.mat",
                style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) as dlg:
            assert isinstance(dlg, wx.FileDialog)
            if dlg.ShowModal() == wx.ID_OK:
                if dlg.GetFilterIndex() == 0:
                    new_measurements = cpmeas.Measurements(
                        filename=dlg.Path, copy=self.measurements)
                    new_measurements.flush()
                    new_measurements.close()
                else:
                    self.pipeline.save_measurements(dlg.GetPath(),
                                                    self.measurements)

    def on_exit(self, event):
        self.Close()

    def on_image_choose(self, event):
        '''Choose an image from the image set'''
        dlg = wx.Dialog(self)
        dlg.Title = "Choose an image set"
        sizer = wx.BoxSizer(wx.VERTICAL)
        dlg.SetSizer(sizer)
        choose_sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(choose_sizer, 1, wx.EXPAND | wx.ALL, 5)
        choose_sizer.Add(wx.StaticText(dlg, -1, label="Image set:"), 0,
                         wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL)
        metadata_db = {}
        metadata_features = [
            x for x in self.measurements.get_feature_names(cpmeas.IMAGE)
            if x.startswith('Metadata')
        ]
        sel = None
        for i in self.measurements.get_image_numbers():
            metadata_key = ','.join([
                '%s=%s' %
                (feature,
                 self.measurements.get_measurement(cpmeas.IMAGE, feature, i))
                for feature in metadata_features
            ])
            metadata_db[i] = metadata_key
            if i == self.measurements.image_set_number:
                sel = i
        choices = [
            "%d: %s" % (i, metadata_db[i])
            for i in self.measurements.get_image_numbers()
        ]
        choice_ctl = wx.Choice(dlg, -1, choices=choices)
        # Select the current image set
        if sel is not None:
            choice_ctl.SetSelection(sel)
        choose_sizer.Add(choice_ctl, 1, wx.EXPAND | wx.LEFT, 5)
        button_sizer = wx.StdDialogButtonSizer()
        ok_button = wx.Button(dlg, wx.ID_OK)
        ok_button.SetDefault()
        ok_button.SetHelpText(
            "Press the OK button to change the current image to the one selected above"
        )
        button_sizer.AddButton(ok_button)

        cancel_button = wx.Button(dlg, wx.ID_CANCEL)
        cancel_button.SetHelpText(
            "Press the cancel button if you do not want to change the current image"
        )
        button_sizer.AddButton(cancel_button)
        button_sizer.Realize()
        sizer.Add(button_sizer, 0,
                  wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.ALL, 5)
        dlg.Fit()
        if dlg.ShowModal() == wx.ID_OK:
            index = choice_ctl.GetSelection()
            self.measurements.image_set_number = index + 1

    def load_measurements(self, measurements_file_name):
        self.measurements = cpmeas.load_measurements(measurements_file_name,
                                                     can_overwrite=True)
        # Start on the first image
        self.measurements.next_image_set(1)

    def on_run(self, event):
        image_set_list = cpi.ImageSetList()
        image_set = image_set_list.get_image_set(0)
        workspace = cpw.Workspace(self.pipeline,
                                  self.module,
                                  image_set,
                                  cpo.ObjectSet(),
                                  self.measurements,
                                  image_set_list,
                                  frame=self)
        self.module.show_window = True  # to make sure it saves display data
        self.module.run_as_data_tool(workspace)
        self.measurements.flush()
        if self.module.show_window:
            fig = cpf.create_or_find(
                parent=self,
                title="%s Output" % (self.module.module_name),
                name="CellProfiler:DataTool:%s" % (self.module.module_name))
            self.module.display(workspace, fig)
            fig.figure.canvas.draw()