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
def __init__(self, root_view, module): self.root_view = root_view.module_frames[module] self.module = module self.widget = {} self.label = {} self.frame = create_widget('frame', master=self.root_view, 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='Name', values=get_hp_class_names(module), required=True) self._create_param_frame() self.curr_name = None self.class_map = { bool: None, int: 'int', float: 'float', str: 'string', }
def __init__(self, root_view, exp_name, problem_name): self.root_view = root_view self.widget = {} frame_info = create_widget('labeled_frame', master=self.root_view.root, row=0, column=1, text='Experiment') grid_configure(frame_info, 0, 0) create_widget('label', master=frame_info, row=0, column=0, text=f'Name: {exp_name}') create_widget('label', master=frame_info, row=1, column=0, text=f'Problem: {problem_name}') self.widget['update'] = create_widget('button', master=frame_info, row=2, column=0, text='Update Config')
def _create_param_frame(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)
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)
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)
def __init__(self, root_view): self.root_view = root_view self.master_window = self.root_view.root self.window = create_widget('toplevel', master=self.master_window, 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('labeled_spinbox', master=frame_settings, row=0, column=0, text='Cell width:', from_=50, to=300, sticky='NSEW') self.widget['precision'] = create_widget('labeled_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') center(self.window, self.master_window)
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()
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')
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
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
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
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='Optimization') 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_spinbox', master=frame_control, row=1, column=0, text='Batch size', from_=1, to=int(1e10), 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, 0) grid_configure(frame_auto, 1, 0) 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('button', master=frame_auto, row=0, column=0, text='Set Stopping Criterion', pady=5, sticky='EW') self.widget['set_stop_cri'].disable() # manual command frame_manual_action = create_widget('frame', master=frame_manual, row=0, column=0, padx=0, pady=0, sticky='EW') grid_configure(frame_manual_action, 0, 1) self.widget['optimize_manual'] = create_widget('button', master=frame_manual_action, row=0, column=0, text='Optimize') self.widget['stop_manual'] = create_widget('button', master=frame_manual_action, row=0, column=1, text='Stop') # auto command frame_auto_action = create_widget('frame', master=frame_auto, row=1, column=0, padx=0, pady=0, sticky='EW') grid_configure(frame_auto_action, 0, 1) self.widget['optimize_auto'] = create_widget('button', master=frame_auto_action, row=0, column=0, text='Optimize') self.widget['stop_auto'] = create_widget('button', master=frame_auto_action, row=0, column=1, text='Stop')
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
def create_labeled_spinbox(master, row, column, text, from_, to, default=None, width=ENTRY_WIDTH, 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, 0, pady / 2, sticky) grid_configure(frame, [0], [1]) text = text + ' (*): ' if required and required_mark else text + ': ' label = tk.Label(master=frame, text=text) label.grid(row=0, column=0, sticky='W', padx=padx, pady=pady / 2) var = tk.IntVar() spinbox = tk.Spinbox(master=frame, from_=from_, to=to, width=width, textvariable=var) spinbox.grid(row=0, column=1, padx=padx, pady=pady / 2, sticky='E') variable = get_variable('spinbox', var, spinbox) if default is not None: variable.set(default) if return_label: return label, variable else: return variable
def __init__(self, root_view): self.root_view = root_view self.master_window = self.root_view.window self.window = create_widget('toplevel', master=self.master_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.module_frames = {} for module in ['surrogate', 'acquisition', 'solver', 'selection']: frame = tk.Frame(master=self.nb_param) self.nb_param.add(child=frame, text=module.capitalize()) grid_configure(frame, None, 0) self.module_frames[module] = frame self.nb_param.bind("<<NotebookTabChanged>>", self._change_tab) # 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') center(self.window, self.master_window)
def create_labeled_radiobutton(master, row, column, label_text, button_text_list, default=None, orientation='horizontal', required=False, required_mark=True, rowspan=1, columnspan=1, padx=PADX, pady=PADY, sticky='NSEW', return_label=False): assert orientation in ['horizontal', 'vertical'] 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, sticky='W', padx=padx, pady=pady / 2) frame_button = create_frame(frame, row=0, column=1, padx=padx, pady=pady / 2, sticky='E') var = tk.StringVar(master=None, value=default) buttons = {} for i, text in enumerate(button_text_list): button = ttk.Radiobutton(master=frame_button, text=text, variable=var, value=text) if orientation == 'horizontal': button.grid(row=0, column=i, padx=padx) elif orientation == 'vertical': button.grid(row=i, column=0, sticky='W', pady=pady) buttons[text] = button variable = get_variable('radiobutton', var, buttons) if return_label: return label, variable else: return variable
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])
def __init__(self, root_view): self.root_view = root_view self.master_window = self.root_view.root self.window = create_widget('toplevel', master=self.master_window, 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='NS') 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.window, row=0, column=1, text='Problem Info') frame_config_display = create_widget('frame', master=frame_config, row=0, column=0, sticky='NS') 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.desc = { 'name': 'Name', 'type': 'Variable type', 'n_var': 'Number of variables', 'n_obj': 'Number of objectives', 'n_constr': 'Number of constraints', 'obj_type': 'Type of objectives', } self.widget['info'] = {} for row, key in enumerate(self.desc.keys()): self.widget['info'][key] = create_widget( 'label', master=frame_config_display, row=row, column=0, text=f'{self.desc[key]}:') 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() center(self.window, self.master_window)
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()
def __init__(self, root_view): self.root_view = root_view self.master_window = self.root_view.window self.window = create_widget('toplevel', master=self.master_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') center(self.window, self.master_window)
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])
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 == 1 or self.n_obj == 2 or self.n_obj > 3: 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') if self.n_obj == 1: self.ax1.set_xlabel(self.obj_name[0]) elif self.n_obj == 2: self.ax1.set_xlabel(self.obj_name[0]) self.ax1.set_ylabel(self.obj_name[1]) elif self.n_obj == 3: self.ax1.set_xlabel(self.obj_name[0]) self.ax1.set_ylabel(self.obj_name[1]) self.ax1.set_zlabel(self.obj_name[2]) elif self.n_obj > 3: self.ax1.set_xticks(np.arange(self.n_obj, dtype=int)) self.ax1.set_xticklabels(self.obj_name) else: raise NotImplementedError # 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) grid_configure(frame_slider, [0], [1]) self.label_iter = tk.Label(master=frame_slider, text='Iteration') self.label_iter.grid(row=0, column=0, sticky='EW') self.curr_iter = tk.IntVar() self.scale_iter = ttk.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')
def __init__(self, root_view, first_time): self.root_view = root_view title = 'Create Experiment' if first_time else 'Update Config' self.master_window = self.root_view.root self.window = create_widget('toplevel', master=self.master_window, title=title) self.frame = {} self.widget = {} if first_time: # experiment section self.frame['exp'] = create_widget('frame', master=self.window, row=0, column=0, padx=2 * PADX) grid_configure(self.frame['exp'], 0, 0) self.widget['exp_name'] = create_widget( 'labeled_entry', master=self.frame['exp'], row=0, column=0, text='Experiment name', class_type='string', width=10, required=True, valid_check=lambda x: not x.startswith('sqlite_'), error_msg='experiment name cannot start with sqlite_') self.widget['cfg_input_type'] = create_widget( 'labeled_radiobutton', master=self.frame['exp'], row=1, column=0, label_text='Create config by', button_text_list=['User interface', 'Loading from file']) # enter config section self.frame['enter'] = tk.Frame(master=self.window) self.frame['enter'].grid(row=1 if first_time else 0, column=0, sticky='NSEW') grid_configure(self.frame['enter'], 0, 0) nb_cfg = ttk.Notebook(self.frame['enter']) nb_cfg.grid(row=0, column=0, sticky='NSEW') if first_time: # problem subsection frame_problem = tk.Frame(master=nb_cfg) grid_configure(frame_problem, 0, 0) nb_cfg.add(child=frame_problem, text='Problem') 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['init_type'] = create_widget( 'labeled_radiobutton', master=frame_problem, row=1, column=0, label_text='Initialization', button_text_list=['Random', 'From file'], default='Random') frame_random_init = create_widget('frame', master=frame_problem, row=2, column=0, padx=0, pady=0) frame_provided_init = create_widget('frame', master=frame_problem, row=2, column=0, padx=0, pady=0) grid_configure(frame_random_init, 0, 0) grid_configure(frame_provided_init, 0, 0) self.widget['n_init'] = create_widget( 'labeled_spinbox', master=frame_random_init, row=0, column=0, text=config_map['experiment']['n_random_sample'], from_=2, to=int(1e10), required=True) 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 of initial design variables 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 of initial performance values 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 == 'From file': button.configure(command=set_provided_init) else: raise NotImplementedError set_random_init() # optimization subsection frame_opt = tk.Frame(master=nb_cfg) grid_configure(frame_opt, 0, 0) nb_cfg.add(child=frame_opt, text='Optimization') self.widget['algo_name'] = create_widget( 'labeled_combobox', master=frame_opt, row=0, column=0, text=config_map['algorithm']['name'], values=get_algorithm_list(), required=True) self.widget['n_process'] = create_widget( 'labeled_spinbox', master=frame_opt, row=1, column=0, text=config_map['algorithm']['n_process'], from_=1, to=int(1e10), default=cpu_count()) self.widget['async'] = create_widget( 'labeled_combobox', master=frame_opt, row=2, column=0, text=config_map['algorithm']['async'], default='None', values=get_hp_class_names('async')) self.widget['set_advanced'] = create_widget('button', master=frame_opt, row=3, column=0, text='Advanced Settings', sticky=None) # evaluation subsection frame_eval = tk.Frame(master=nb_cfg) grid_configure(frame_eval, 0, 0) nb_cfg.add(child=frame_eval, text='Evaluation') self.widget['n_worker'] = create_widget( 'labeled_spinbox', master=frame_eval, row=0, column=0, text=config_map['experiment']['n_worker'], from_=1, to=int(1e10)) # load config section if first_time: self.frame['load'] = create_widget('frame', master=self.window, row=1, column=0, padx=2 * PADX) grid_configure(self.frame['load'], 0, 0) self.widget['set_cfg_path'], self.widget[ 'disp_cfg_path'] = create_widget( 'labeled_button_entry', master=self.frame['load'], row=0, column=0, label_text='Path of config file', button_text='Browse', width=30, required=True, valid_check=lambda x: os.path.exists(x), error_msg='config file does not exist') def set_enter_input(): self.frame['load'].grid_remove() self.frame['enter'].grid() self.widget['save'].enable() def set_load_input(): self.frame['enter'].grid_remove() self.frame['load'].grid() self.widget['save'].enable() for text, button in self.widget['cfg_input_type'].widget.items(): if text == 'User interface': button.configure(command=set_enter_input) elif text == 'Loading from file': button.configure(command=set_load_input) else: raise NotImplementedError self.frame['enter'].grid_remove() self.frame['load'].grid_remove() # action section frame_action = tk.Frame(master=self.window) frame_action.grid(row=2 if first_time else 1, column=0, columnspan=3) self.widget['save'] = create_widget( 'button', master=frame_action, row=0, column=0, text='Create' if first_time else 'Update') self.widget['cancel'] = create_widget('button', master=frame_action, row=0, column=1, text='Cancel') center(self.window, self.master_window) self.cfg_widget = {} if first_time: self.cfg_widget.update({ 'problem': { 'name': self.widget['problem_name'], }, }) self.cfg_widget.update({ 'algorithm': { 'name': self.widget['algo_name'], 'n_process': self.widget['n_process'], 'async': self.widget['async'], }, 'experiment': { 'n_worker': self.widget['n_worker'], }, })
def __init__(self, root_view, columns, can_eval): self.root_view = root_view self.root = self.root_view.root frame_db = self.root_view.frame_db self.widget = {} frame_table = create_widget('frame', master=frame_db, row=0, column=0, padx=0, pady=0) self.widget['table'] = Table(master=frame_table, columns=columns) frame_action = create_widget('frame', master=frame_db, row=1, column=0, padx=0, pady=0) if can_eval: grid_configure(frame_action, 0, [2]) else: grid_configure(frame_action, 0, [1]) frame_enter = create_widget('frame', master=frame_action, row=0, column=0, padx=0, pady=0) self.widget['enter_design'] = create_widget('button', master=frame_enter, row=0, column=0, text='Enter Design') self.widget['enter_performance'] = create_widget( 'button', master=frame_enter, row=0, column=1, text='Enter Performance') if can_eval: frame_eval = create_widget('frame', master=frame_action, row=0, column=1, padx=0, pady=0) self.widget['start_eval'] = create_widget('button', master=frame_eval, row=0, column=0, text='Start Evaluation') self.widget['stop_eval'] = create_widget('button', master=frame_eval, row=0, column=1, text='Stop Evaluation') self.widget['set_display'] = create_widget('button', master=frame_action, row=0, column=2 if can_eval else 1, sticky='E', text='Display Settings')