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_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
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')
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, }
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)
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): ''' 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_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')
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')
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)
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 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 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 __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()
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)
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 _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)
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')
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'], } }
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'], }
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): 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')
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()
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')
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()
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, }
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()