Exemplo n.º 1
0
def create_labeled_button(master,
                          row,
                          column,
                          label_text,
                          button_text,
                          command=None,
                          required=False,
                          required_mark=True,
                          rowspan=1,
                          columnspan=1,
                          padx=PADX,
                          pady=PADY,
                          sticky='NSEW',
                          return_label=False):
    frame = create_frame(master, row, column, rowspan, columnspan, padx, pady,
                         sticky)
    grid_configure(frame, [0], [0, 1])
    label_text = label_text + ' (*): ' if required and required_mark else label_text + ': '
    label = tk.Label(master=frame, text=label_text)
    label.grid(row=0, column=0, sticky='W')
    button = Button(master=frame, text=button_text, command=command)
    button.grid(row=0, column=1, sticky='E')
    if return_label:
        return label, button
    else:
        return button
Exemplo n.º 2
0
def create_labeled_entry(master,
                         row,
                         column,
                         text,
                         class_type,
                         width=ENTRY_WIDTH,
                         required=False,
                         required_mark=True,
                         default=None,
                         valid_check=None,
                         error_msg=None,
                         rowspan=1,
                         columnspan=1,
                         padx=PADX,
                         pady=PADY,
                         sticky='EW',
                         return_label=False):
    frame = create_frame(master, row, column, rowspan, columnspan, padx, pady,
                         sticky)
    grid_configure(frame, [0], [0, 1])
    label_text = text + ' (*): ' if required and required_mark else text + ': '
    label = tk.Label(master=frame, text=label_text)
    label.grid(row=0, column=0, sticky='W')
    entry = tk.Entry(master=frame, width=width, justify='right')
    entry.grid(row=0, column=1, sticky='E')
    entry = get_entry(class_type,
                      entry,
                      required=required,
                      default=default,
                      valid_check=valid_check,
                      error_msg=error_msg)
    if return_label:
        return label, entry
    else:
        return entry
Exemplo n.º 3
0
def create_spinbox(master,
                   row,
                   column,
                   text,
                   from_,
                   to,
                   width=ENTRY_WIDTH,
                   rowspan=1,
                   columnspan=1,
                   padx=PADX,
                   pady=PADY,
                   sticky=None,
                   return_label=False):
    frame = create_frame(master, row, column, rowspan, columnspan, padx, pady,
                         sticky)
    grid_configure(frame, 0, 1)
    label = tk.Label(master=frame, text=text)
    label.grid(row=0, column=0, sticky='W')
    var = tk.IntVar()
    spinbox = tk.Spinbox(master=frame,
                         from_=from_,
                         to=to,
                         width=width,
                         textvariable=var)
    spinbox.grid(row=0, column=1, padx=padx, sticky='E')
    variable = get_variable('spinbox', var, spinbox)
    if return_label:
        return label, variable
    else:
        return variable
Exemplo n.º 4
0
    def __init__(self, root):
        self.root = root

        self.menu = tk.Menu(master=self.root, relief='raised')
        self.root.config(menu=self.menu)
        self.menu_help = HelpMenu(self.menu)

        frame_init = create_widget('frame', master=self.root, row=0, column=0)
        grid_configure(frame_init, 1, 0)

        self.widget = {}

        frame_info = create_widget('labeled_frame', master=frame_init, row=0, column=0, text='Info')
        frame_info_disp = create_widget('frame', master=frame_info, row=0, column=0, padx=0)
        grid_configure(frame_info, 0, 0)
        grid_configure(frame_info_disp, 1, 1)
        self.widget['user'] = create_widget('label', master=frame_info_disp, row=0, column=0, columnspan=2, text='Username:'******'public_ip'] = create_widget('label', master=frame_info_disp, row=1, column=0, text='Public IP:', pady=PADY / 2)
        self.widget['internal_ip'] = create_widget('label', master=frame_info_disp, row=1, column=1, text='Internal IP:', pady=PADY / 2)

        frame_task = create_widget('labeled_frame', master=frame_init, row=1, column=0, text='Task')
        grid_configure(frame_task, 0, 2)
        self.widget['create_task'] = create_widget('button', master=frame_task, row=0, column=0, text='Create Task')
        self.widget['load_task'] = create_widget('button', master=frame_task, row=0, column=1, text='Load Task')
        self.widget['remove_task'] = create_widget('button', master=frame_task, row=0, column=2, text='Remove Task')

        frame_access = create_widget('labeled_frame', master=frame_init, row=2, column=0, text='Access')
        grid_configure(frame_access, 0, 0)
        self.widget['manage_user'] = create_widget('button', master=frame_access, row=0, column=0, text='Manage User Access')
Exemplo n.º 5
0
    def __init__(self, root_view):
        self.root_view = root_view

        self.widget = {}
        self.label = {}

        self.frame = create_widget('frame',
                                   master=self.root_view.frame_surrogate,
                                   row=0,
                                   column=0)
        grid_configure(self.frame, None, 0)

        self.widget['name'] = create_widget(
            'labeled_combobox',
            master=self.frame,
            row=0,
            column=0,
            width=20,
            text=algo_config_map['surrogate']['name'],
            values=list(algo_value_map['surrogate']['name'].values()),
            required=True)

        self.create_frame_param()

        self.curr_name = None

        self.activate = {
            'Gaussian Process': self.activate_gp,
            'Thompson Sampling': self.activate_ts,
        }
        self.deactivate = {
            'Gaussian Process': self.deactivate_gp,
            'Thompson Sampling': self.deactivate_ts,
        }
Exemplo n.º 6
0
 def create_frame_param(self):
     self.frame_param = create_widget('frame',
                                      master=self.frame,
                                      row=1,
                                      column=0,
                                      padx=0,
                                      pady=0,
                                      sticky='NSEW')
     grid_configure(self.frame_param, None, 0)
Exemplo n.º 7
0
 def __init__(self, master, img_path, *pargs):
     tk.Frame.__init__(self, master, *pargs)
     self.image = Image.open(img_path)
     width, height = self.image.size
     self.ratio = width / height
     self.img_copy = self.image.copy()
     self.background_image = ImageTk.PhotoImage(self.image)
     self.background = tk.Label(self, image=self.background_image)
     self.background.grid(row=0, column=0, sticky='NSEW')
     self.background.bind('<Configure>', self._resize_image)
     grid_configure(self, 0, 0)
Exemplo n.º 8
0
 def __init__(self, master, img_path, width=None, height=None, *pargs):
     tk.Frame.__init__(self, master, *pargs)
     self.image = Image.open(img_path)
     if width is None:
         width = self.image.size[0]
     if height is None:
         height = self.image.size[1]
     self.image = self.image.resize((width, height))
     self.background_image = ImageTk.PhotoImage(self.image)
     self.background = tk.Label(self, image=self.background_image)
     self.background.grid(row=0, column=0, sticky='NSEW')
     grid_configure(self, 0, 0)
Exemplo n.º 9
0
    def __init__(self, root):
        '''
        GUI initialization
        '''
        # GUI root initialization
        self.root = root
        self.root.geometry(f'{WIDTH}x{HEIGHT}')
        grid_configure(self.root, 2, 0,
                       row_weights=[1, 1,
                                    20])  # configure for resolution change

        self._init_menu()
        self._init_viz()
Exemplo n.º 10
0
    def _init_viz(self):
        '''
        Visualization initialization
        '''
        frame_viz = tk.Frame(master=self.root)
        frame_viz.grid(row=0, column=0, rowspan=3, sticky='NSEW')
        grid_configure(frame_viz, 0, 0)

        # configure tab widgets
        self.nb_viz = ttk.Notebook(master=frame_viz)
        self.nb_viz.grid(row=0, column=0, sticky='NSEW')
        self.frame_plot = tk.Frame(master=self.nb_viz)
        self.frame_stat = tk.Frame(master=self.nb_viz)
        self.frame_db = tk.Frame(master=self.nb_viz)
        self.nb_viz.add(child=self.frame_plot, text='Visualization')
        self.nb_viz.add(child=self.frame_stat, text='Statistics')
        self.nb_viz.add(child=self.frame_db, text='Database')
        grid_configure(self.frame_plot, [0], [0])
        grid_configure(self.frame_stat, [0], [0])
        grid_configure(self.frame_db, [0], [0])

        # temporarily disable tabs until data loaded
        self.nb_viz.tab(0, state=tk.DISABLED)
        self.nb_viz.tab(1, state=tk.DISABLED)
        self.nb_viz.tab(2, state=tk.DISABLED)

        # initialize tutorial image
        img_path = os.path.join(get_root_dir(), 'system', 'static',
                                'tutorial.png')
        self.image_tutorial = ImageFrame(master=self.root, img_path=img_path)
        self.image_tutorial.grid(row=0, column=0, rowspan=3, sticky='NSEW')
Exemplo n.º 11
0
    def __init__(self, master):
        self.window = create_widget('toplevel',
                                    master=master,
                                    title='Display Settings')
        frame_settings = create_widget('frame',
                                       master=self.window,
                                       row=0,
                                       column=0,
                                       padx=0,
                                       pady=0)
        grid_configure(frame_settings, 1, 0)

        self.widget = {}

        self.widget['cellwidth'] = create_widget('spinbox',
                                                 master=frame_settings,
                                                 row=0,
                                                 column=0,
                                                 text='Cell width:',
                                                 from_=50,
                                                 to=300,
                                                 sticky='NSEW')
        self.widget['precision'] = create_widget('spinbox',
                                                 master=frame_settings,
                                                 row=1,
                                                 column=0,
                                                 text='Float precision:',
                                                 from_=0,
                                                 to=100,
                                                 sticky='NSEW')

        frame_action = create_widget('frame',
                                     master=frame_settings,
                                     row=2,
                                     column=0,
                                     padx=0,
                                     pady=0)
        grid_configure(frame_action, 0, 1)
        self.widget['update'] = create_widget('button',
                                              master=frame_action,
                                              row=0,
                                              column=0,
                                              text='Update')
        self.widget['cancel'] = create_widget('button',
                                              master=frame_action,
                                              row=0,
                                              column=1,
                                              text='Cancel')
Exemplo n.º 12
0
    def __init__(self, root_view):
        self.root_view = root_view

        self.widget = {}

        self.frame = create_widget('frame',
                                   master=self.root_view.frame_acquisition,
                                   row=1,
                                   column=0)
        grid_configure(self.frame, None, 0)
        self.widget['name'] = create_widget(
            'labeled_combobox',
            master=self.frame,
            row=0,
            column=0,
            width=25,
            text=algo_config_map['acquisition']['name'],
            values=list(algo_value_map['acquisition']['name'].values()),
            required=True)
Exemplo n.º 13
0
def create_text(master,
                row,
                column,
                width=TEXT_WIDTH,
                height=TEXT_HEIGHT,
                rowspan=1,
                columnspan=1,
                padx=PADX,
                pady=PADY,
                sticky='NSEW'):
    frame = create_frame(master, row, column, rowspan, columnspan, padx, pady,
                         sticky)
    grid_configure(frame, 0, 0)
    scrtext = scrolledtext.ScrolledText(master=frame,
                                        width=width,
                                        height=height)
    scrtext.grid(row=0, column=0, sticky='NSEW')
    entry = get_entry('string', scrtext)
    return entry
Exemplo n.º 14
0
def create_labeled_combobox(master,
                            row,
                            column,
                            text,
                            values=None,
                            class_type='string',
                            readonly=True,
                            width=COMBOBOX_WIDTH,
                            justify='right',
                            required=False,
                            required_mark=True,
                            default=None,
                            valid_check=None,
                            error_msg=None,
                            rowspan=1,
                            columnspan=1,
                            padx=PADX,
                            pady=PADY,
                            sticky='NSEW',
                            return_label=False):
    frame = create_frame(master, row, column, rowspan, columnspan, padx, pady,
                         sticky)
    grid_configure(frame, [0], [0, 1])
    label_text = text + ' (*): ' if required and required_mark else text + ': '
    label = tk.Label(master=frame, text=label_text)
    label.grid(row=0, column=0, sticky='W')
    combobox = ttk.Combobox(master=frame,
                            values=values,
                            state='readonly' if readonly else None,
                            width=width,
                            justify=justify)
    combobox.grid(row=0, column=1, sticky='E')
    entry = get_entry(class_type,
                      combobox,
                      required=required,
                      default=default,
                      readonly=readonly,
                      valid_check=valid_check,
                      error_msg=error_msg)
    if return_label:
        return label, entry
    else:
        return entry
Exemplo n.º 15
0
def create_labeled_button_entry(master,
                                row,
                                column,
                                label_text,
                                button_text,
                                command=None,
                                width=ENTRY_WIDTH,
                                required=False,
                                required_mark=True,
                                default=None,
                                valid_check=None,
                                error_msg=None,
                                rowspan=1,
                                columnspan=1,
                                padx=PADX,
                                pady=PADY,
                                sticky='NSEW',
                                return_label=False):
    frame = create_frame(master, row, column, rowspan, columnspan, 0, pady / 2,
                         sticky)
    grid_configure(frame, [0], [1])
    label_text = label_text + ' (*): ' if required and required_mark else label_text + ': '
    label = tk.Label(master=frame, text=label_text)
    label.grid(row=0,
               column=0,
               columnspan=2,
               sticky='W',
               padx=padx,
               pady=pady / 2)
    button = Button(master=frame, text=button_text, command=command)
    button.grid(row=1, column=0, padx=padx)
    entry = tk.Entry(master=frame, width=width, justify='right')
    entry.grid(row=1, column=1, sticky='EW', padx=padx)
    entry = get_entry('string',
                      entry,
                      required=required,
                      default=default,
                      valid_check=valid_check,
                      error_msg=error_msg)
    if return_label:
        return label, button, entry
    else:
        return button, entry
Exemplo n.º 16
0
    def __init__(self, root_view):
        self.root_view = root_view

        self.window = create_widget('toplevel', master=self.root_view.root, title='Manage Problem')
        grid_configure(self.window, 0, 0)

        self.widget = {}

        frame_list = create_widget('labeled_frame', master=self.window, row=0, column=0, text='Problem list')
        frame_list_display = create_widget('frame', master=frame_list, row=0, column=0, sticky='N')
        frame_list_action = create_widget('frame', master=frame_list, row=1, column=0, padx=0, pady=0, sticky=None)
        frame_config = create_widget('frame', master=self.window, row=0, column=1, sticky=None, padx=0, pady=0)
        frame_config_display = create_widget('frame', master=frame_config, row=0, column=0, padx=0, pady=0, sticky='N')
        frame_config_action = create_widget('frame', master=frame_config, row=1, column=0, padx=0, pady=0, sticky=None)
        grid_configure(frame_list, 0, 0)
        grid_configure(frame_config, 0, 0)

        self.widget['list'] = Listbox(master=frame_list_display)
        self.widget['list'].grid()
        self.widget['create'] = create_widget('button', master=frame_list_action, row=0, column=0, text='Create')

        self.widget['info'] = ProblemInfo(master=frame_config_display, row=0, column=0)
        self.widget['update'] = create_widget('button', master=frame_config_action, row=0, column=0, text='Update')
        self.widget['delete'] = create_widget('button', master=frame_config_action, row=0, column=1, text='Delete')

        self.widget['update'].disable()
        self.widget['delete'].disable()
Exemplo n.º 17
0
    def __init__(self, master, columns):
        '''
        '''
        self.master = master
        self.widget = {}

        frame_table = create_widget('frame',
                                    master=master,
                                    row=0,
                                    column=0,
                                    columnspan=2,
                                    padx=0,
                                    pady=0)
        grid_configure(master, 0, 0)
        super().__init__(frame_table, columns)

        self.widget['set'] = create_widget('button',
                                           master=master,
                                           row=1,
                                           column=0,
                                           sticky='E',
                                           text='Display Settings',
                                           command=self.update_settings)
Exemplo n.º 18
0
    def __init__(self, root_view):
        self.root_view = root_view

        self.widget = {}

        frame_log = create_widget('labeled_frame',
                                  master=self.root_view.root,
                                  row=2,
                                  column=1,
                                  text='Log')
        grid_configure(frame_log, 0, 0)

        # log display
        self.widget['log'] = create_widget('text',
                                           master=frame_log,
                                           row=0,
                                           column=0)
        self.widget['log'].disable()

        self.widget['clear'] = create_widget('button',
                                             master=frame_log,
                                             row=1,
                                             column=0,
                                             text='Clear')
Exemplo n.º 19
0
    def _init_viz(self):
        '''
        Visualization initialization
        '''
        grid_configure(self.root, 0, 0)

        self.widget = {}

        frame_db = create_widget('labeled_frame', master=self.root, row=0, column=0, text='Database')
        self.widget['db_frame'] = frame_db
        self.widget['db_placeholder'] = create_widget('label', master=frame_db, row=0, column=0, text='Uninitialized')
        self.widget['db_table'] = None

        frame_conn = create_widget('frame', master=self.root, row=0, column=1, padx=0, pady=0)
        grid_configure(frame_conn, [3], 0)

        self.widget['problem_info'] = ProblemInfo(master=frame_conn, row=0, column=0)

        frame_man = create_widget('labeled_frame', master=frame_conn, row=1, column=0, text='Manager Info')
        frame_man_disp = create_widget('frame', master=frame_man, row=0, column=0, padx=0)
        self.widget['man_user'] = create_widget('label', master=frame_man_disp, row=0, column=0, columnspan=2, text='Username:'******'man_public_ip'] = create_widget('label', master=frame_man_disp, row=1, column=0, text='Public IP:', pady=PADY / 2)
        self.widget['man_internal_ip'] = create_widget('label', master=frame_man_disp, row=1, column=1, text='Internal IP:', pady=PADY / 2)

        frame_sci = create_widget('labeled_frame', master=frame_conn, row=2, column=0, text='Scientist Info')
        frame_sci_disp = create_widget('frame', master=frame_sci, row=0, column=0, padx=0)
        self.widget['sci_user'] = create_widget('label', master=frame_sci_disp, row=0, column=0, text='Username: unknown', pady=PADY / 2)
        self.widget['sci_host'] = create_widget('label', master=frame_sci_disp, row=0, column=1, text='Host: unknown', pady=PADY / 2)

        frame_tech = create_widget('labeled_frame', master=frame_conn, row=3, column=0, text='Technician Info')
        grid_configure(frame_tech, 0, 0)
        frame_disp = create_widget('frame', master=frame_tech, row=0, column=0)
        grid_configure(frame_disp, 0, 0)
        self.widget['tech_disp'] = ttk.Treeview(master=frame_disp, columns=(1,))
        self.widget['tech_disp'].column('#0', width=100, minwidth=150, stretch=tk.YES)
        self.widget['tech_disp'].column('#1', width=100, minwidth=150, stretch=tk.YES)
        self.widget['tech_disp'].heading('#0', text='Username', anchor=tk.W)
        self.widget['tech_disp'].heading('#1', text='Host', anchor=tk.W)
        self.widget['tech_disp'].grid(row=0, column=0, sticky='NSEW')
        horscrlbar = ttk.Scrollbar(frame_disp, orient='horizontal', command=self.widget['tech_disp'].xview)
        horscrlbar.grid(row=1, column=0, sticky='SEW')
        verscrlbar = ttk.Scrollbar(frame_disp, orient='vertical', command=self.widget['tech_disp'].yview)
        verscrlbar.grid(row=0, rowspan=2, column=1, sticky='NSE')
        self.widget['tech_disp'].configure(xscrollcommand=horscrlbar.set)
        self.widget['tech_disp'].configure(yscrollcommand=verscrlbar.set)
Exemplo n.º 20
0
    def __init__(self, root_view):
        self.root_view = root_view

        self.window = create_widget('toplevel',
                                    master=self.root_view.window,
                                    title='Advanced Settings')

        self.widget = {}
        self.cfg_widget = {}

        # parameter section
        frame_param_algo = create_widget('frame',
                                         master=self.window,
                                         row=0,
                                         column=0)
        self.nb_param = ttk.Notebook(master=frame_param_algo)
        self.nb_param.grid(row=0, column=0, sticky='NSEW')
        self.frame_surrogate = tk.Frame(master=self.nb_param)
        self.frame_acquisition = tk.Frame(master=self.nb_param)
        self.frame_solver = tk.Frame(master=self.nb_param)
        self.frame_selection = tk.Frame(master=self.nb_param)
        self.nb_param.add(child=self.frame_surrogate, text='Surrogate')
        self.nb_param.add(child=self.frame_acquisition, text='Acquisition')
        self.nb_param.add(child=self.frame_solver, text='Solver')
        self.nb_param.add(child=self.frame_selection, text='Selection')
        grid_configure(self.frame_surrogate, None, 0)
        grid_configure(self.frame_acquisition, None, 0)
        grid_configure(self.frame_solver, None, 0)
        grid_configure(self.frame_selection, None, 0)

        # action section
        frame_action = tk.Frame(master=self.window)
        frame_action.grid(row=1, column=0)
        self.widget['save'] = create_widget('button',
                                            master=frame_action,
                                            row=0,
                                            column=0,
                                            text='Save')
        self.widget['cancel'] = create_widget('button',
                                              master=frame_action,
                                              row=0,
                                              column=1,
                                              text='Cancel')
Exemplo n.º 21
0
    def __init__(self, root_view, first_time):
        self.root_view = root_view
        self.first_time = first_time

        title = 'Create Configurations' if self.first_time else 'Change Configurations'
        self.window = create_widget('toplevel', master=self.root_view.root, title=title)

        self.widget = {}

        # parameter section
        frame_param = tk.Frame(master=self.window)
        frame_param.grid(row=0, column=0)
        grid_configure(frame_param, 2, 0)

        # problem subsection
        frame_problem = create_widget('labeled_frame', master=frame_param, row=0, column=0, text='Problem')
        grid_configure(frame_problem, 0, 0)

        self.widget['problem_name'] = create_widget('labeled_combobox', 
            master=frame_problem, row=0, column=0, text=config_map['problem']['name'], values=get_problem_list(), width=15, required=True)
        self.widget['set_ref_point'] = create_widget('button',
            master=frame_problem, row=1, column=0, text='Set Reference Point', sticky=None)
        self.widget['set_ref_point'].disable()

        # algorithm subsection
        frame_algorithm = create_widget('labeled_frame', master=frame_param, row=1, column=0, text='Algorithm')
        grid_configure(frame_algorithm, 0, 0)
        self.widget['algo_name'] = create_widget('labeled_combobox', 
            master=frame_algorithm, row=0, column=0, text=config_map['algorithm']['name'], values=get_algorithm_list(), required=True)
        self.widget['n_process'] = create_widget('labeled_entry', 
            master=frame_algorithm, row=1, column=0, text=config_map['algorithm']['n_process'], class_type='int', default=cpu_count(),
            valid_check=lambda x: x > 0, error_msg='number of processes to use must be positive')
        self.widget['set_advanced'] = create_widget('button', master=frame_algorithm, row=2, column=0, text='Advanced Settings', sticky=None)
        
        # initialization subsection
        if self.first_time:
            frame_init = create_widget('labeled_frame', master=frame_param, row=2, column=0, text='Initialization')
            grid_configure(frame_init, 1, 0)

            self.widget['init_type'] = create_widget('radiobutton',
                master=frame_init, row=0, column=0, text_list=['Random', 'Provided'], default='Random')

            frame_random_init = create_widget('frame', master=frame_init, row=1, column=0, padx=0, pady=0)
            frame_provided_init = create_widget('frame', master=frame_init, row=1, column=0, padx=0, pady=0)

            self.widget['n_init'] = create_widget('labeled_entry', 
                master=frame_random_init, row=0, column=0, text=config_map['experiment']['n_random_sample'], class_type='int', required=True,
                valid_check=lambda x: x > 0, error_msg='number of random initial samples must be positive')

            self.widget['set_x_init'], self.widget['disp_x_init'] = create_widget('labeled_button_entry',
                master=frame_provided_init, row=0, column=0, label_text='Path of initial design variables', button_text='Browse', width=30, required=True,
                valid_check=lambda x: os.path.exists(x), error_msg='file does not exist')
            self.widget['set_y_init'], self.widget['disp_y_init'] = create_widget('labeled_button_entry',
                master=frame_provided_init, row=1, column=0, label_text='Path of initial performance values', button_text='Browse', width=30,
                valid_check=lambda x: os.path.exists(x), error_msg='file does not exist')

            def set_random_init():
                frame_provided_init.grid_remove()
                frame_random_init.grid()

            def set_provided_init():
                frame_random_init.grid_remove()
                frame_provided_init.grid()

            for text, button in self.widget['init_type'].widget.items():
                if text == 'Random':
                    button.configure(command=set_random_init)
                elif text == 'Provided':
                    button.configure(command=set_provided_init)
                else:
                    raise Exception()

            set_random_init()

        # evaluation subsection
        frame_experiment = create_widget('labeled_frame', master=frame_param, row=3 if self.first_time else 2, column=0, text='Experiment')
        grid_configure(frame_experiment, 0, 0)
        self.widget['n_worker'] = create_widget('labeled_entry',
            master=frame_experiment, row=0, column=0, text=config_map['experiment']['n_worker'], class_type='int', default=1,
            valid_check=lambda x: x > 0, error_msg='max number of evaluation workers must be positive')

        # action section
        frame_action = tk.Frame(master=self.window)
        frame_action.grid(row=1, column=0, columnspan=3)
        self.widget['save'] = create_widget('button', master=frame_action, row=0, column=0, text='Save')
        self.widget['cancel'] = create_widget('button', master=frame_action, row=0, column=1, text='Cancel')

        self.cfg_widget = {
            'problem': {
                'name': self.widget['problem_name'],
            },
            'algorithm': {
                'name': self.widget['algo_name'],
                'n_process': self.widget['n_process'],
            },
            'experiment': {
                'n_worker': self.widget['n_worker'],
            }
        }
Exemplo n.º 22
0
    def __init__(self, root_view):
        self.root_view = root_view

        self.window = create_widget('toplevel',
                                    master=self.root_view.root,
                                    title='Manage User Access')

        self.widget = {}

        # user section
        frame_user = create_widget('frame',
                                   master=self.window,
                                   row=0,
                                   column=0)
        frame_list = create_widget('labeled_frame',
                                   master=frame_user,
                                   row=0,
                                   column=0,
                                   text='User List')
        frame_list_display = create_widget('frame',
                                           master=frame_list,
                                           row=0,
                                           column=0)
        frame_list_action = create_widget('frame',
                                          master=frame_list,
                                          row=1,
                                          column=0,
                                          padx=0,
                                          pady=0)
        frame_info = create_widget('labeled_frame',
                                   master=frame_user,
                                   row=0,
                                   column=1,
                                   text='User Information')
        frame_info_display = create_widget('frame',
                                           master=frame_info,
                                           row=0,
                                           column=0,
                                           padx=0,
                                           pady=0)
        frame_info_action = create_widget('frame',
                                          master=frame_info,
                                          row=1,
                                          column=0,
                                          padx=0,
                                          pady=0,
                                          sticky=None)

        grid_configure(frame_list, 0, 0)

        # list subsection
        self.widget['user_list'] = Listbox(master=frame_list_display)
        self.widget['user_list'].grid()

        self.widget['create'] = create_widget('button',
                                              master=frame_list_action,
                                              row=0,
                                              column=0,
                                              text='Create')
        self.widget['delete'] = create_widget('button',
                                              master=frame_list_action,
                                              row=0,
                                              column=1,
                                              text='Delete')

        # info subsection
        self.widget['name'] = create_widget('labeled_entry',
                                            master=frame_info_display,
                                            row=0,
                                            column=0,
                                            text='Username',
                                            class_type='string',
                                            width=15,
                                            required=True)
        self.widget['passwd'] = create_widget('labeled_entry',
                                              master=frame_info_display,
                                              row=1,
                                              column=0,
                                              text='Password',
                                              class_type='string',
                                              width=15,
                                              required=True)
        self.widget['role'] = create_widget('labeled_combobox',
                                            master=frame_info_display,
                                            row=2,
                                            column=0,
                                            text='Role',
                                            values=['Scientist', 'Technician'],
                                            width=15,
                                            required=True)
        self.widget['access'] = create_widget('labeled_combobox',
                                              master=frame_info_display,
                                              row=3,
                                              column=0,
                                              text='Task access',
                                              width=15,
                                              required=True)

        self.widget['save'] = create_widget('button',
                                            master=frame_info_action,
                                            row=0,
                                            column=0,
                                            text='Save')
        self.widget['cancel'] = create_widget('button',
                                              master=frame_info_action,
                                              row=0,
                                              column=1,
                                              text='Cancel')

        self.info_map = {'name': 'username', 'passwd': 'password'}

        self.info_widget = {
            'name': self.widget['name'],
            'passwd': self.widget['passwd'],
            'role': self.widget['role'],
            'access': self.widget['access'],
        }
Exemplo n.º 23
0
 def grid(self):
     self.listbox.grid(row=0, column=0, sticky='NSEW')
     self.scrollbar.grid(row=0, column=1, sticky='NSEW')
     grid_configure(self.master, [0], [0])
Exemplo n.º 24
0
    def __init__(self, root_view):
        self.root_view = root_view

        self.window = create_widget('toplevel',
                                    master=self.root_view.window,
                                    title='Create Problem')
        grid_configure(self.window, 0, 0)

        self.frame = {}

        for config_type, config_text in zip([
                'general', 'design_mixed', 'design_unified', 'performance',
                'constraint'
        ], [
                'General Config', 'Design Config', 'Design Config',
                'Performance Config', 'Constraint Config'
        ]):
            self.frame[config_type] = create_widget('labeled_frame',
                                                    master=self.window,
                                                    row=0,
                                                    column=0,
                                                    text=config_text,
                                                    sticky='NSEW')
            self.frame[config_type].grid_remove()
            grid_configure(self.frame[config_type], 0, 0)

        self.curr_frame = 0
        self.max_frame = len(self.frame)

        self.in_creating_var = False
        self.var_cfg = {}

        self.widget = {
            'general': {},
            'design_mixed': {},
            'design_unified': {},
            'performance': {},
            'constraint': {},
        }

        frame_control = create_widget('frame',
                                      master=self.window,
                                      row=1,
                                      column=0,
                                      sticky='WE',
                                      padx=0,
                                      pady=0)
        grid_configure(frame_control, 0, 0)
        self.widget['cancel'] = create_widget('button',
                                              master=frame_control,
                                              row=0,
                                              column=0,
                                              text='Cancel',
                                              sticky='W')
        self.widget['back'] = create_widget('button',
                                            master=frame_control,
                                            row=0,
                                            column=1,
                                            text='Back',
                                            sticky='E')
        self.widget['next'] = create_widget('button',
                                            master=frame_control,
                                            row=0,
                                            column=2,
                                            text='Next',
                                            sticky='E')
        self.widget['finish'] = create_widget('button',
                                              master=frame_control,
                                              row=0,
                                              column=2,
                                              text='Finish',
                                              sticky='E')
Exemplo n.º 25
0
    def __init__(self, root_view):
        self.root_view = root_view

        # control overall frame
        frame_control = create_widget('labeled_frame',
                                      master=self.root_view.root,
                                      row=1,
                                      column=1,
                                      text='Control')
        grid_configure(frame_control, 2, 0)

        self.widget = {}
        self.widget['mode'] = create_widget('radiobutton',
                                            master=frame_control,
                                            row=0,
                                            column=0,
                                            text_list=['Manual', 'Auto'],
                                            default='Manual')
        self.widget['batch_size'] = create_widget(
            'labeled_entry',
            master=frame_control,
            row=1,
            column=0,
            text=config_map['experiment']['batch_size'],
            class_type='int',
            required=True,
            required_mark=False)

        frame_manual = create_widget('frame',
                                     master=frame_control,
                                     row=2,
                                     column=0,
                                     padx=0,
                                     pady=0)
        frame_auto = create_widget('frame',
                                   master=frame_control,
                                   row=2,
                                   column=0,
                                   padx=0,
                                   pady=0)
        grid_configure(frame_manual, 0, 1)
        grid_configure(frame_auto, 1, 1)
        frame_auto.grid_remove()

        def set_manual():
            frame_auto.grid_remove()
            frame_manual.grid()

        def set_auto():
            frame_manual.grid_remove()
            frame_auto.grid()

        for text, button in self.widget['mode'].widget.items():
            if text == 'Manual':
                button.configure(command=set_manual)
            elif text == 'Auto':
                button.configure(command=set_auto)
            else:
                raise Exception()

        self.widget['set_stop_cri'] = create_widget(
            'labeled_button',
            master=frame_auto,
            row=0,
            column=0,
            columnspan=2,
            label_text='Stopping criterion',
            button_text='Set',
            pady=5)

        for key in ['mode', 'batch_size', 'set_stop_cri']:
            self.widget[key].disable()

        # optimization command
        self.widget['optimize_manual'] = create_widget('button',
                                                       master=frame_manual,
                                                       row=0,
                                                       column=0,
                                                       text='Optimize')
        self.widget['optimize_manual'].disable()
        self.widget['optimize_auto'] = create_widget('button',
                                                     master=frame_auto,
                                                     row=1,
                                                     column=0,
                                                     text='Optimize')
        self.widget['optimize_auto'].disable()

        # stop optimization command
        self.widget['stop_manual'] = create_widget('button',
                                                   master=frame_manual,
                                                   row=0,
                                                   column=1,
                                                   text='Stop')
        self.widget['stop_manual'].disable()
        self.widget['stop_auto'] = create_widget('button',
                                                 master=frame_auto,
                                                 row=1,
                                                 column=1,
                                                 text='Stop')
        self.widget['stop_auto'].disable()
Exemplo n.º 26
0
    def __init__(self, root_view, problem_cfg):
        self.root_view = root_view

        self.n_var, self.n_obj = problem_cfg['n_var'], problem_cfg['n_obj']
        self.var_name, self.obj_name = problem_cfg['var_name'], problem_cfg[
            'obj_name']
        var_type = problem_cfg['type']

        # compute lower and upper bound for design space radar plot
        if var_type in ['continuous', 'integer']:
            var_lb, var_ub = problem_cfg['var_lb'], problem_cfg['var_ub']
            if type(var_lb) in [int, float]:
                var_lb = [var_lb] * self.n_var
            if type(var_ub) in [int, float]:
                var_ub = [var_ub] * self.n_var
        elif var_type == 'binary':
            var_lb, var_ub = [0] * self.n_var, [1] * self.n_var
        elif var_type == 'categorical':
            var_lb = [0] * self.n_var
            if 'var' in problem_cfg:
                var_ub = []
                for var_info in problem_cfg['var'].values():
                    var_ub.append(len(var_info['choices']))
            else:
                var_ub = [len(problem_cfg['var_choices'])] * self.n_var
        elif var_type == 'mixed':
            var_lb, var_ub = [], []
            var_type_list = []
            for var_info in problem_cfg['var'].values():
                var_type_list.append(var_info['type'])
                if var_info['type'] in ['continuous', 'integer']:
                    var_lb.append(var_info['lb'])
                    var_ub.append(var_info['ub'])
                elif var_info['type'] == 'binary':
                    var_lb.append(0)
                    var_ub.append(1)
                elif var_info['type'] == 'categorical':
                    var_lb.append(0)
                    var_ub.append(len(var_info['choices']))
                else:
                    raise Exception(
                        f'invalid variable type {var_info["type"]}')
        else:
            raise Exception(f'invalid problem type {problem_cfg["type"]}')

        self.var_lb, self.var_ub = np.array(var_lb), np.array(var_ub)

        # figure placeholder in GUI
        self.fig = plt.figure(dpi=FIGURE_DPI)
        self.gs = GridSpec(1, 2, figure=self.fig, width_ratios=[3, 2])

        # connect matplotlib figure with tkinter GUI
        embed_figure(self.fig, self.root_view.frame_plot)

        # performance space figure
        if self.n_obj == 2:
            self.ax1 = self.fig.add_subplot(self.gs[0])
        elif self.n_obj == 3:
            self.ax1 = self.fig.add_subplot(self.gs[0], projection='3d')
        else:
            raise NotImplementedError
        self.ax1.set_title('Performance Space')
        self.ax1.set_xlabel(self.obj_name[0])
        self.ax1.set_ylabel(self.obj_name[1])
        if self.n_obj == 3:
            self.ax1.set_zlabel(self.obj_name[2])

        # design space figure
        if self.n_var > 2:
            self.theta = radar_factory(self.n_var)
            self.ax2 = self.fig.add_subplot(self.gs[1], projection='radar')
            self.ax2.set_xticks(self.theta)
            self.ax2.set_varlabels(self.var_name)
            self.ax2.set_yticklabels([])
            self.ax2.set_title('Selected Design', position=(0.5, 1.1))
            self.ax2.set_ylim(0, 1)
        else:
            self.ax2 = self.fig.add_subplot(self.gs[1])
            for spine in self.ax2.spines.values():
                spine.set_visible(False)
            self.ax2.get_xaxis().set_ticks([])
            self.ax2.get_yaxis().set_ticks([])
            self.xticks = [0] if self.n_var == 1 else [-1, 1]
            self.ax2.bar(self.xticks, [1] * self.n_var, color='g', alpha=0.2)
            self.ax2.set_xticks(self.xticks)
            self.text_lb = [None] * self.n_var
            self.text_ub = [None] * self.n_var
            for i in range(self.n_var):
                if var_type in [
                        'continuous', 'integer'
                ] or (var_type == 'mixed'
                      and var_type_list[i] in ['continuous', 'integer']):
                    self.text_lb[i] = self.ax2.text(
                        self.xticks[i] - 0.5,
                        0,
                        f'{self.var_lb[i]:.4g}',
                        horizontalalignment='right',
                        verticalalignment='center')
                    self.text_ub[i] = self.ax2.text(
                        self.xticks[i] - 0.5,
                        1,
                        f'{self.var_ub[i]:.4g}',
                        horizontalalignment='right',
                        verticalalignment='center')
            self.ax2.set_xticklabels(self.var_name)
            self.ax2.set_title('Selected Design')
            self.ax2.set_xlim(-3, 3)
            self.ax2.set_ylim(0, 1.04)

        # configure slider widget
        frame_slider = create_widget('frame',
                                     master=self.root_view.frame_plot,
                                     row=2,
                                     column=0,
                                     pady=0)
        grid_configure(frame_slider, [0], [1])

        label_iter = tk.Label(master=frame_slider, text='Iteration:')
        label_iter.grid(row=0, column=0, sticky='EW')
        self.curr_iter = tk.IntVar()
        self.scale_iter = tk.Scale(master=frame_slider,
                                   orient=tk.HORIZONTAL,
                                   variable=self.curr_iter,
                                   from_=0,
                                   to=0)
        self.scale_iter.grid(row=0, column=1, sticky='EW')
Exemplo n.º 27
0
    def _init_viz(self):
        '''
        '''
        grid_configure(self.root, 0, 0)

        self.widget = {}

        frame_db = create_widget('labeled_frame',
                                 master=self.root,
                                 row=0,
                                 column=0,
                                 text='Database')
        self.widget['db_frame'] = frame_db
        self.widget['db_placeholder'] = create_widget('label',
                                                      master=frame_db,
                                                      row=0,
                                                      column=0,
                                                      text='Uninitialized')
        self.widget['db_table'] = None

        frame_ctrl = create_widget('frame',
                                   master=self.root,
                                   row=0,
                                   column=1,
                                   padx=0,
                                   pady=0)
        self.widget['problem_info'] = ProblemInfo(master=frame_ctrl,
                                                  row=0,
                                                  column=0)

        frame_eval = create_widget('labeled_frame',
                                   master=frame_ctrl,
                                   row=1,
                                   column=0,
                                   text='Evaluation')
        self.widget['mode'] = create_widget('radiobutton',
                                            master=frame_eval,
                                            row=0,
                                            column=0,
                                            text_list=['Manual', 'Auto'],
                                            default='Manual')

        frame_manual = create_widget('frame',
                                     master=frame_eval,
                                     row=1,
                                     column=0,
                                     padx=0,
                                     pady=0)
        self.widget['manual_lock'] = create_widget('button',
                                                   master=frame_manual,
                                                   row=0,
                                                   column=0,
                                                   text='Lock entry')
        self.widget['manual_release'] = create_widget('button',
                                                      master=frame_manual,
                                                      row=0,
                                                      column=1,
                                                      text='Release entry')
        self.widget['manual_fill'] = create_widget('button',
                                                   master=frame_manual,
                                                   row=1,
                                                   column=0,
                                                   columnspan=2,
                                                   text='Enter performance')

        frame_auto = create_widget('frame',
                                   master=frame_eval,
                                   row=1,
                                   column=0,
                                   padx=0,
                                   pady=0)
        self.widget['n_worker'] = create_widget(
            'labeled_entry',
            master=frame_auto,
            row=0,
            column=0,
            columnspan=2,
            text='Number of workers',
            class_type='int',
            valid_check=lambda x: x > 0,
            error_msg='Number of evaluation workers must be positive',
            required=True,
            required_mark=False,
            default=1)
        self.widget['auto_set_program'] = create_widget('button',
                                                        master=frame_auto,
                                                        row=1,
                                                        column=0,
                                                        text='Set program')
        self.widget['auto_evaluate'] = create_widget('button',
                                                     master=frame_auto,
                                                     row=1,
                                                     column=1,
                                                     text='Evaluate')

        grid_configure(frame_eval, 0, 0)
        grid_configure(frame_manual, 1, 1)
        grid_configure(frame_auto, 1, 1)
        frame_auto.grid_remove()

        def set_manual():
            frame_auto.grid_remove()
            frame_manual.grid()

        def set_auto():
            frame_manual.grid_remove()
            frame_auto.grid()

        for text, button in self.widget['mode'].widget.items():
            if text == 'Manual':
                button.configure(command=set_manual)
            elif text == 'Auto':
                button.configure(command=set_auto)
            else:
                raise Exception()

        for widget_name in [
                'auto_set_program', 'auto_evaluate', 'manual_lock',
                'manual_release', 'manual_fill'
        ]:
            self.widget[widget_name].disable()
Exemplo n.º 28
0
    def __init__(self, root_view):
        self.root_view = root_view

        self.widget = {}

        self.frame = create_widget('frame',
                                   master=self.root_view.frame_solver,
                                   row=2,
                                   column=0)
        grid_configure(self.frame, None, 0)

        self.widget['name'] = create_widget(
            'labeled_combobox',
            master=self.frame,
            row=0,
            column=0,
            width=15,
            text=algo_config_map['solver']['name'],
            values=list(algo_value_map['solver']['name'].values()),
            required=True)
        self.widget['n_gen'] = create_widget(
            'labeled_entry',
            master=self.frame,
            row=1,
            column=0,
            text=algo_config_map['solver']['n_gen'],
            class_type='int',
            default=200,
            valid_check=lambda x: x > 0,
            error_msg='number of generations must be positive')
        self.widget['pop_size'] = create_widget(
            'labeled_entry',
            master=self.frame,
            row=2,
            column=0,
            text=algo_config_map['solver']['pop_size'],
            class_type='int',
            default=100,
            valid_check=lambda x: x > 0,
            error_msg='population size must be positive')
        self.widget['pop_init_method'] = create_widget(
            'labeled_combobox',
            master=self.frame,
            row=3,
            column=0,
            width=25,
            text=algo_config_map['solver']['pop_init_method'],
            values=list(algo_value_map['solver']['pop_init_method'].values()),
            default='Non-Dominated Sort')

        self.create_frame_param()

        self.curr_name = None

        self.activate = {
            'NSGA-II': self.activate_nsga2,
            'MOEA/D': self.activate_moead,
            'ParEGO Solver': self.activate_parego,
            'Pareto Discovery': self.activate_discovery,
        }
        self.deactivate = {
            'NSGA-II': self.deactivate_nsga2,
            'MOEA/D': self.deactivate_moead,
            'ParEGO Solver': self.deactivate_parego,
            'Pareto Discovery': self.deactivate_discovery,
        }
Exemplo n.º 29
0
    def create_mixed_design_widget(self):
        '''
        '''
        frame_list = create_widget('labeled_frame',
                                   master=self.frame['design_mixed'],
                                   row=0,
                                   column=0,
                                   text='Variable list')
        frame_list_display = create_widget('frame',
                                           master=frame_list,
                                           row=0,
                                           column=0,
                                           sticky='N')
        frame_list_action = create_widget('frame',
                                          master=frame_list,
                                          row=1,
                                          column=0,
                                          padx=0,
                                          pady=0,
                                          sticky=None)
        frame_config = create_widget('labeled_frame',
                                     master=self.frame['design_mixed'],
                                     row=0,
                                     column=1,
                                     text='Variable Config')
        frame_config_display = create_widget('frame',
                                             master=frame_config,
                                             row=0,
                                             column=0,
                                             padx=0,
                                             pady=0,
                                             sticky='N')
        frame_config_action = create_widget('frame',
                                            master=frame_config,
                                            row=1,
                                            column=0,
                                            padx=0,
                                            pady=0,
                                            sticky=None)
        grid_configure(frame_list, 0, 0)
        grid_configure(frame_config, 0, 0)

        self.widget['design_mixed']['list'] = Listbox(
            master=frame_list_display)
        self.widget['design_mixed']['list'].grid()
        self.widget['design_mixed']['create'] = create_widget(
            'button', master=frame_list_action, row=0, column=0, text='Create')
        self.widget['design_mixed']['delete'] = create_widget(
            'button', master=frame_list_action, row=0, column=1, text='Delete')

        self.widget['design_mixed']['name'] = create_widget(
            'labeled_entry',
            master=frame_config_display,
            row=0,
            column=0,
            text='Variable name',
            class_type='string',
            required=True)
        self.widget['design_mixed']['type'] = create_widget(
            'labeled_combobox',
            master=frame_config_display,
            row=1,
            column=0,
            text='Variable type',
            values=['continuous', 'integer', 'binary', 'categorical'],
            required=True)

        frame_config_display_type = {}
        for key in ['continuous', 'integer', 'categorical']:
            frame_config_display_type[key] = create_widget(
                'frame',
                master=frame_config_display,
                row=2,
                column=0,
                padx=0,
                pady=0,
                sticky=None)
            frame_config_display_type[key].grid_remove()

        self.widget['design_mixed']['lb_float'] = create_widget(
            'labeled_entry',
            master=frame_config_display_type['continuous'],
            row=0,
            column=0,
            text='Lower bound',
            class_type='float',
            required=True)
        self.widget['design_mixed']['ub_float'] = create_widget(
            'labeled_entry',
            master=frame_config_display_type['continuous'],
            row=1,
            column=0,
            text='Upper bound',
            class_type='float',
            required=True)
        self.widget['design_mixed']['lb_int'] = create_widget(
            'labeled_entry',
            master=frame_config_display_type['integer'],
            row=0,
            column=0,
            text='Lower bound',
            class_type='int',
            required=True)
        self.widget['design_mixed']['ub_int'] = create_widget(
            'labeled_entry',
            master=frame_config_display_type['integer'],
            row=1,
            column=0,
            text='Upper bound',
            class_type='int',
            required=True)
        self.widget['design_mixed']['choices'] = create_widget(
            'labeled_entry',
            master=frame_config_display_type['categorical'],
            row=0,
            column=0,
            text='Choices',
            class_type='stringlist',
            required=True)

        def _clear_type_frame(var_type):
            '''
            '''
            if var_type == 'continuous':
                self.widget['design_mixed']['lb_float'].set(None)
                self.widget['design_mixed']['ub_float'].set(None)
            elif var_type == 'integer':
                self.widget['design_mixed']['lb_int'].set(None)
                self.widget['design_mixed']['ub_int'].set(None)
            elif var_type == 'categorical':
                self.widget['design_mixed']['choices'].set(None)

        def _enable_config_type_frame(var_type):
            '''
            '''
            for key in frame_config_display_type.keys():
                if key == var_type:
                    frame_config_display_type[key].grid()
                else:
                    frame_config_display_type[key].grid_remove()
                _clear_type_frame(key)

        def _disable_config_type_frame():
            '''
            '''
            for key in frame_config_display_type.keys():
                frame_config_display_type[key].grid_remove()
                _clear_type_frame(key)

        def _select_var_type(event):
            '''
            '''
            var_type = event.widget.get()
            _enable_config_type_frame(var_type)

        self.widget['design_mixed']['type'].widget.bind(
            '<<ComboboxSelected>>', _select_var_type)

        def _enable_config_widgets():
            '''
            '''
            for key in ['save', 'cancel', 'name', 'type']:
                self.widget['design_mixed'][key].enable()
            for key in ['name', 'type']:
                self.widget['design_mixed'][key].set(None)

            _disable_config_type_frame()

        def _disable_config_widgets():
            '''
            '''
            for key in ['name', 'type']:
                self.widget['design_mixed'][key].set(None)
            for key in ['save', 'cancel', 'name', 'type']:
                self.widget['design_mixed'][key].disable()

            _disable_config_type_frame()

        def _load_widget_values(var_name, config):
            '''
            '''
            self.widget['design_mixed']['name'].set(var_name)
            self.widget['design_mixed']['type'].set(config['type'])
            self.widget['design_mixed']['type'].select()
            if config['type'] == 'continuous':
                self.widget['design_mixed']['lb_float'].set(config['lb'])
                self.widget['design_mixed']['ub_float'].set(config['ub'])
            elif config['type'] == 'integer':
                self.widget['design_mixed']['lb_int'].set(config['lb'])
                self.widget['design_mixed']['ub_int'].set(config['ub'])
            elif config['type'] == 'binary':
                pass
            elif config['type'] == 'categorical':
                self.widget['design_mixed']['choices'].set(config['choices'])
            else:
                raise Exception(f'invalid variable type {config["type"]}')

        def _create_var():
            '''
            '''
            self.in_creating_var = True

            self.widget['design_mixed']['list'].insert(tk.END, '')
            self.widget['design_mixed']['list'].select_clear(0, tk.END)
            self.widget['design_mixed']['list'].select_set(tk.END)

            _enable_config_widgets()
            self.widget['design_mixed']['create'].disable()
            self.widget['design_mixed']['delete'].disable()

        def _exit_creating_var():
            '''
            '''
            self.in_creating_var = False

            self.widget['design_mixed']['create'].enable()
            self.widget['design_mixed']['list'].delete(tk.END)

        def _select_var(event):
            '''
            '''
            try:
                index = int(event.widget.curselection()[0])
            except:
                return
            var_name = event.widget.get(index)
            if var_name == '':
                return
            elif self.in_creating_var:
                _exit_creating_var()

            _enable_config_widgets()
            _load_widget_values(var_name, self.var_cfg[var_name])

            self.widget['design_mixed']['delete'].enable()

        def _delete_var():
            '''
            '''
            index = int(self.widget['design_mixed']['list'].curselection()[0])
            var_name = self.widget['design_mixed']['list'].get(index)
            if_delete = tk.messagebox.askquestion(
                'Delete Variable',
                f'Are you sure to delete variable "{var_name}"?',
                parent=self.window)
            if if_delete == 'yes':
                self.widget['design_mixed']['list'].delete(index)
                listbox_size = self.widget['design_mixed']['list'].size()
                if listbox_size == 0:
                    self.widget['design_mixed']['delete'].disable()
                    _disable_config_widgets()
                else:
                    self.widget['design_mixed']['list'].select_set(
                        min(index, listbox_size - 1))
                    self.widget['design_mixed']['list'].select_event()
                self.var_cfg.pop(var_name)
            else:
                return

        def _save_var():
            '''
            '''
            var_name, success = self._try_get_val(
                self.widget['design_mixed']['name'], 'Variable name')
            if not success: return

            var_type, success = self._try_get_val(
                self.widget['design_mixed']['type'], 'Variable type')
            if not success: return

            if var_type == 'continuous':
                var_lb, success = self._try_get_val(
                    self.widget['design_mixed']['lb_float'], 'Lower bound')
                if not success: return

                var_ub, success = self._try_get_val(
                    self.widget['design_mixed']['ub_float'], 'Upper bound')
                if not success: return

                if var_lb >= var_ub:
                    tk.messagebox.showinfo(
                        'Error',
                        'Lower bound is no less than upper bound',
                        parent=self.window)
                    return

                self.var_cfg[var_name] = {
                    'type': var_type,
                    'lb': float(var_lb),
                    'ub': float(var_ub)
                }

            elif var_type == 'integer':
                var_lb, success = self._try_get_val(
                    self.widget['design_mixed']['lb_int'], 'Lower bound')
                if not success: return

                var_ub, success = self._try_get_val(
                    self.widget['design_mixed']['ub_int'], 'Upper bound')
                if not success: return

                if var_lb >= var_ub:
                    tk.messagebox.showinfo(
                        'Error',
                        'Lower bound is no less than upper bound',
                        parent=self.window)
                    return

                self.var_cfg[var_name] = {
                    'type': var_type,
                    'lb': int(var_lb),
                    'ub': int(var_ub)
                }

            elif var_type == 'binary':
                self.var_cfg[var_name] = {'type': var_type}

            elif var_type == 'categorical':
                var_choices, success = self._try_get_val(
                    self.widget['design_mixed']['choices'], 'Choices')
                if not success: return

                self.var_cfg[var_name] = {
                    'type': var_type,
                    'choices': list(var_choices)
                }

            else:
                raise Exception(f'invalid variable type {var_type}')

            tk.messagebox.showinfo('Success',
                                   f'Variable {var_name} saved',
                                   parent=self.window)

            if self.in_creating_var:
                _exit_creating_var()

            self.widget['design_mixed']['list'].reload()
            self.widget['design_mixed']['list'].select(var_name)

        def _cancel_var():
            '''
            '''
            if self.in_creating_var:
                _exit_creating_var()
                _disable_config_widgets()
            self.widget['design_mixed']['list'].select_event()

        def _reload_var():
            '''
            '''
            var_list = list(self.var_cfg.keys())
            if len(var_list) == 0:
                self.widget['design_mixed']['delete'].disable()
            else:
                self.widget['design_mixed']['delete'].enable()
            return var_list

        self.widget['design_mixed']['list'].bind_cmd(reload_cmd=_reload_var,
                                                     select_cmd=_select_var)
        self.widget['design_mixed']['list'].reload()

        self.widget['design_mixed']['create'].configure(command=_create_var)
        self.widget['design_mixed']['delete'].configure(command=_delete_var)

        self.widget['design_mixed']['save'] = create_widget(
            'button', master=frame_config_action, row=0, column=0, text='Save')
        self.widget['design_mixed']['cancel'] = create_widget(
            'button',
            master=frame_config_action,
            row=0,
            column=1,
            text='Cancel')
        self.widget['design_mixed']['save'].configure(command=_save_var)
        self.widget['design_mixed']['cancel'].configure(command=_cancel_var)

        _disable_config_widgets()