def launch_dialog_box(def_p): """ ----------------------------------------------------------------------------------------- DIALOG BOX ----------------------------------------------------------------------------------------- """ col = 20 col1 = 30 col2 = 10 col3 = 5 # Max number of parameters for data corruption nb_param = 0 for param in def_p: if len(def_p[param]) > nb_param : nb_param = len(def_p[param]) # IMPORT A NEW DATABASE frame1 = [[sg.Text('Select which new database you want to import', text_color='#0f2851', font=("Arial Bold", 11))]] subframe011 = [[sg.Text('Dataset name', size=(col2, 1)), sg.InputText('', key='0_ds_name', do_not_clear=True, focus=True)]] subframe11 = [[sg.Text('Clean Images', size=(col, 1))]] subframe11.append([sg.Input(key='0_train_set', do_not_clear=True, focus=True), sg.FolderBrowse()]) frame1.append([sg.Text('Dataset name', size=(15, 1)), sg.InputText('', key='0_ds_name', do_not_clear=True, focus=True, size=(col, 1)), sg.Text('', size=(18,1)), sg.Frame('Training Set', subframe11, title_color='#0f2851', font=("Arial Bold", 11))]) frame1.append([sg.Text('')]) subframe12 = [[sg.Text('Clean Images', size=(col, 1))]] subframe12.append([sg.Input(key='0_test_clean', do_not_clear=True, focus=True), sg.FolderBrowse()]) subframe12.append([sg.Text('Images with Defatuls', size=(3*col+9, 1)), sg.Text('Labels', size=(col, 1))]) for idx in range(9): subframe12.append([sg.Text('Type '+str(idx+1), size=(col, 1))]) subframe12.append([sg.Input(key='0_test_default'+str(idx), change_submits=True, do_not_clear=True, focus=True), sg.FolderBrowse(), sg.Text('', size=(col2, 1)), sg.Input(key='0_test_label'+str(idx), do_not_clear=True, focus=True)]) frame1.append([sg.Frame('Test Set', subframe12, title_color='#0f2851', font=("Arial Bold", 11))]) # CORRUPT AN EXISTING DATABASE f2_db = [[sg.Text('Select the Database', text_color='#0f2851', font=("Arial Bold", 11))]] for idx,x in enumerate(all_clean_ds): f2_db.append([sg.Checkbox(x, key='1_'+str(idx))]) f2_default = [[sg.Text('Select the corruption', text_color='#0f2851', font=("Arial Bold", 11))]] f2_default.append([sg.Listbox(values= list(def_p.keys()), key='1_default', size=(30,15), change_submits=True, bind_return_key=True)]) f2_default.append([sg.Button('Set default parameters',key='1_def_param', button_color=('white', '#0f2851'))]) f2_default.append([sg.Checkbox('Histogram Equalization', key='1_HE')]) f2_param = [[sg.Text('Default Parameters', size=(col, 1), key='def_name')]] f2_param.append([sg.Text('Corruption Name', size=(col, 1)), sg.InputText('', key='1_cor_name', do_not_clear=True, focus=True)]) for i in range(nb_param): f2_param.append([sg.Text('Param' + str(i), size=(col2, 1), key = '1_pp_'+str(i)), sg.InputText('', key='1_p_'+str(i), do_not_clear=True, focus=True)]) f2_param.append([sg.Button('Preview',key='1_preview', button_color=('white', '#0f2851'), change_submits=True)]) f2_param.append([sg.Canvas(size=(300, 200), key='canvas')]) frame2 = [[sg.Column(f2_db), sg.Column(f2_default), sg.Column(f2_param)]] # TRAIN A NETWORK # Select the dataset f3_ds01 = [] f3_ds01 = [[sg.Text('Query', size=(8, 1)), sg.InputText('', key='3_ds_query', change_submits=True, do_not_clear=True, focus=True)]] f3_ds01.append([sg.Listbox(values=all_ds, key='3_ds', size=(40,15), select_mode='multiple', bind_return_key=True)]) f3_ds01.append([sg.Text('')]) f3_ds01.append([sg.Text('Resolution (1st axis)', size=(20, 1)), sg.InputText('', key='3_dimension', size=(10, 1), change_submits=True, do_not_clear=True, focus=True)]) f3_ds = [[sg.Frame('Select the Dataset(s)', f3_ds01, title_color='#0f2851', font=("Arial Bold", 11))]] # Select Model Class and Architecture f3_model01 = [[sg.Text('Select the Model Class', text_color='#0f2851', font=("Arial Bold", 11))]] f3_model01.append([sg.Combo(values=list(model_classes), key='3_model_class', size=(50,5), change_submits=True)]) f3_model01.append([sg.Text('Select the Model Architecture', text_color='#0f2851', font=("Arial Bold", 11))]) f3_model01.append([sg.Text('Query', size=(8, 1)), sg.InputText('', key='3_model_query', change_submits=True, do_not_clear=True, focus=True)]) f3_model01.append([sg.Listbox(values=list(model_archs), key='3_model_arch', size=(80,10), change_submits=True, select_mode='multiple', bind_return_key=True)]) f3_model01.append([sg.Text('Save this new Model Architecture under the name:')]) f3_model01.append([sg.InputText('', key='3_archi_name', size=(40,10), do_not_clear=True, focus=True), sg.Button('Save',key='3_save_archi', button_color=('white', '#0f2851'))]) f3_model01.append([sg.Multiline('', key='3_archi_hjson', size=(50,20), do_not_clear=True, focus=True)]) f3_model = [[sg.Frame('Select the Model Class and Architecture', f3_model01, title_color='#0f2851', font=("Arial Bold", 11))]] # Select Training Scheme f3_train01 = [[sg.Text('Query', size=(8, 1)), sg.InputText('', key='3_train_query', change_submits=True, do_not_clear=True, focus=True)]] f3_train01.append([sg.Listbox(values=all_training, key='3_train', size=(60,10), change_submits=True, select_mode='multiple', bind_return_key=True)]) f3_train01.append([sg.Text('Save this new Training Scheme under the name:')]) f3_train01.append([sg.InputText('', key='3_train_name', size=(40,10), do_not_clear=True, focus=True), sg.Button('Save',key='3_save_train', button_color=('white', '#0f2851'))]) f3_train01.append([sg.Multiline('', key='3_train_hjson', size=(50,20), do_not_clear=True, focus=True)]) f3_train = [[sg.Frame('Select the Model Training Scheme', f3_train01, title_color='#0f2851', font=("Arial Bold", 11))]] frame3 = [[sg.Column(f3_ds), sg.Column(f3_model), sg.Column(f3_train)]] # EVALUATE A NETWORK f4_simu = [[sg.Text('Select Location of Simulation Results', text_color='#0f2851', font=("Arial Bold", 11))]] f4_simu.append([sg.Combo(values=list(all_simu_paths), key='4_simu', size=(50,5), change_submits=True)]) f4_exp = [[sg.Text('Select Experiments', text_color='#0f2851', font=("Arial Bold", 11))]] f4_exp.append([sg.Text('Query', size=(8, 1)), sg.InputText('', key='4_exp_query', change_submits=True, do_not_clear=True, focus=True)]) f4_exp.append([sg.Listbox(values=list(all_exp), key='4_exp', size=(120,10), select_mode='multiple', change_submits=True, bind_return_key=True)]) frame4 = [[sg.Column(f4_simu), sg.Column(f4_exp)]] sub_frame41 = [[sg.Text('This options reprint ROC curves of an experiment given that TP and FP rates have been computed previously.')]] sub_frame41.append([sg.Checkbox('Standard evaluation (Image-wise)', key='4_ROC')]) sub_frame41.append([sg.Checkbox('Standard evaluation (Pixel-wise)', key='4_ROC_pixel')]) sub_frame41.append([sg.Text('_________________________________________________________')]) sub_frame41.append([sg.Checkbox('Print Prediction', key='4_ROC_printpred')]) frame4.append([sg.Frame('Standard ROC Curves', sub_frame41, title_color='#0f2851', font=("Arial Bold", 11))]) sub_frame42 = [[sg.Text('MCDropout allows to evaluate uncertainty of a network by introducting dropout during inference. By averaging results obtained with multiple dropout patterns, uncertainty is estimated.')]] sub_frame42.append([sg.Checkbox('Perform MCdropout evaluation (Image-wise)', key='4_MCdrop')]) sub_frame42.append([sg.Checkbox('Perform MCdropout evaluation (Pixel-wise)', key='4_MCdrop_pixel')]) sub_frame42.append([sg.Text('_________________________________________________________')]) sub_frame42.append([sg.Checkbox('Print Prediction', key='4_MCdrop_printpred')]) sub_frame42.append([sg.Checkbox('Perform COMBINED MCdropout evaluation', key='4_combinedMC')]) frame4.append([sg.Frame('Monte Carlo Dropout', sub_frame42, title_color='#0f2851', font=("Arial Bold", 11))]) sub_frame43 = [[sg.Text('OOD')]] sub_frame43.append([sg.Checkbox('Perform OOD evaluation', key='4_OOD')]) frame4.append([sg.Frame('Out-of-Distribution Sample Detection', sub_frame43, title_color='#0f2851', font=("Arial Bold", 11))]) # GENERAL LAYOUT layout = [[sg.TabGroup([[sg.Tab('IMPORT_DB', frame1), sg.Tab('CORRUPT_DB', frame2), sg.Tab('TRAIN_NET', frame3), sg.Tab('EVAL_NET', frame4)]], key='action_choice')]] layout.append([sg.Button('Execute',key='Execute', button_color=('white', '#0f2851')), sg.Button('Cancel', key='Cancel', button_color=('white', '#0f2851')), sg.Button('Add to the TODO list', key='TODO', button_color=('white', '#34916f'))]) window = sg.Window('Action selection').Layout(layout) new_all_exp = all_exp simu_path = all_simu_paths[0] while True: event, values = window.Read() if event is None: break # 1- Import a new database : Update labels if '0_test_default' in event: idx = event[-1] window.FindElement('0_test_label'+str(idx)).Update(values['0_test_default'+str(idx)].split('/')[-1]) # 2- Corrupt ds : Update parameters list if event is '1_def_param': try: params = def_p[values['1_default'][0]] counter = 0 for key, value in params.items(): window.FindElement('1_pp_'+str(counter)).Update(key) window.FindElement('1_p_'+str(counter)).Update(value) counter += 1 for i in range(counter, nb_param): window.FindElement('1_pp_'+str(i)).Update('') window.FindElement('1_p_'+str(i)).Update('XXX') except: print('unable to determine default type') # 2- Corrupt ds : Update preview if event is '1_preview': # Keep parameters modifications counter = 0 for key, value in params.items(): window.FindElement('1_pp_'+str(counter)).Update(key) window.FindElement('1_p_'+str(counter)).Update(values['1_p_'+str(counter)]) counter += 1 for i in range(counter, nb_param): window.FindElement('1_pp_'+str(i)).Update('') window.FindElement('1_p_'+str(i)).Update('XXX') # Provide the preview img = get_preview(values) fig = show_im(img[0], 200, 300) _ = draw_figure(window.FindElement('canvas').TKCanvas, fig) # 3- Create ds : Update subfolders list if event is '2_subfolders': new_clean_ds = values['2_all_clean_ds'] new_clean_paths = [data_path + '/' + x for x in new_clean_ds] new_subfolders_paths = [] new_subfolders = [] for folder in new_clean_paths : new_subfolders_paths += [folder + '/' + x for x in os.listdir(folder)] new_subfolders += [folder.split('/')[-1] + '_' + x for x in os.listdir(folder)] window.FindElement('2_all_subfolders').Update(new_subfolders) window.FindElement('2_training_prop').Update(values['2_training_prop']) window.FindElement('2_val_prop').Update(values['2_val_prop']) # 3- Create ds : Update subfolders list for training and eval repartition if event is '2_split': ds_to_split = values['2_all_subfolders'] for idx,ds in enumerate(ds_to_split): window.FindElement('2_training_' + str(idx)).Update(ds) if idx > nb_subfolder_max: break # 4- Train net : Update datasetlist if event is '3_ds_query': new_list = update_list(all_ds, values['3_ds_query'].split(',')) window.FindElement('3_ds').Update(new_list) window.FindElement('3_ds_query').Update(values['3_ds_query']) # 4- Train net : Update modellist if event is '3_model_query': model_archs_bis = os.listdir(code_path + '/Models/Networks/Architecture_Config') model_archs_bis.sort(key = lambda x : x) new_list = update_list(model_archs_bis, values['3_model_query'].split(',')) window.FindElement('3_model_arch').Update(new_list) window.FindElement('3_model_query').Update(values['3_model_query']) # 4- Train net : Update trainlist if event is '3_train_query': all_training_bis = os.listdir(code_path + '/Models/Training_Config') all_training_bis.sort(key = lambda x : x) new_list = update_list(all_training_bis, values['3_train_query'].split(',')) window.FindElement('3_train').Update(new_list) window.FindElement('3_train_query').Update(values['3_train_query']) # 4- Train net : Update trainingHJSON if event is '3_train' and values['3_train'] != []: message = hjson_parser(code_path + '/Models/Training_Config/' + values['3_train'][0]) window.FindElement('3_train_hjson').Update(message) # 4- Train net : Save new training config if event is '3_save_train': if values['3_train_name'] == '': sg.Popup('Your configuration name is empty') all_configs = os.listdir(code_path + '/Models/Training_Config') if values['3_train_name']+ '.hjson' in all_configs: sg.Popup('One training configuration file already has this name') else: with open(code_path + '/Models/Training_Config/' + values['3_train_name'] + '.hjson', 'w') as fp: hjson.dump(hjson.loads(values['3_train_hjson']), fp, sort_keys=True, indent=4) model_train_bis = os.listdir(code_path + '/Models/Training_Config') model_train_bis.sort(key = lambda x : x) new_list = update_list(model_train_bis, values['3_train_query'].split(',')) window.FindElement('3_train').Update(new_list) # 4- Train net : Update architectureHJSON if event is '3_model_arch' and values['3_model_arch'] != []: message = hjson_parser(code_path + '/Models/Networks/Architecture_Config/' + values['3_model_arch'][0]) window.FindElement('3_archi_hjson').Update(message) # 4- Train net : Save new architecture config if event is '3_save_archi': if values['3_archi_name'] == '': sg.Popup('Your configuration name is empty') all_configs = os.listdir(code_path + '/Models/Networks/Architecture_Config') if values['3_archi_name']+ '.hjson' in all_configs: sg.Popup('One architecture configuration file already has this name') else: with open(code_path + '/Models/Networks/Architecture_Config/' + values['3_archi_name'] + '.hjson', 'w') as fp: hjson.dump(hjson.loads(values['3_archi_hjson']), fp, sort_keys=True, indent=4) model_archs_bis = os.listdir(code_path + '/Models/Networks/Architecture_Config') model_archs_bis.sort(key = lambda x : x) new_list = update_list(model_archs_bis, values['3_model_query'].split(',')) window.FindElement('3_model_arch').Update(new_list) # 5- Evaluate net : Update default location of simulations if '4_simu' in event: simu_path = values[event] new_all_exp = [x for x in os.listdir(simu_path + '/Experiments')] new_all_exp.sort(key = lambda x : x) window.FindElement('4_exp').Update(new_all_exp) #5 - Evaluate net : Update experiences list if event is '4_exp_query': new_exp_list = update_list(new_all_exp, values['4_exp_query'].split(',')) window.FindElement('4_exp').Update(new_exp_list) window.FindElement('4_exp_query').Update(values['4_exp_query']) if event is 'Execute': break if event is 'TODO': action = values['action_choice'] if action == 'CREATE_DS': print('The creation of a datase must be executed directly : click on execute') else: todo_path = code_path + '/Todo_list' if not os.path.exists(todo_path): os.makedirs(todo_path) lst = None else: lst = os.listdir(todo_path) counter = 0 for file in lst: if action in file: counter += 1 write_json(values, code_path + '/Todo_list/' + action + '_' + str(counter) + '.json') if event is 'Cancel': values = None break """ ----------------------------------------------------------------------------------------- EXECUTE ACTION DEPENDING ON THE OUTPUT OF THE DIALOG BOX ----------------------------------------------------------------------------------------- """ # Execute action choosen before Execute if values is not None: if values['action_choice'] == 'IMPORT_DB': import_new_db(values) elif values['action_choice'] == 'CORRUPT_DB': corrupt_db(values, def_p) elif values['action_choice'] == 'CREATE_DS': create_ds(values, new_subfolders_paths) elif values['action_choice'] == 'TRAIN_NET': train_net(values) elif values['action_choice'] == 'EVAL_NET': evaluate_net(values)
def Everything(): sg.ChangeLookAndFeel('Dark') form = sg.FlexForm('Everything bagel', default_element_size=(40, 1)) column1 = [ [ sg.Text('Column 1', background_color='black', justification='center', size=(10, 1)) ], [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 1')], [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 2')], [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 3')] ] layout = [ [ sg.Text('All graphic widgets in one form!', size=(30, 1), font=("Helvetica", 25)) ], [sg.Text('Here is some text.... and a place to enter text')], [sg.InputText('This is my text')], [ sg.Checkbox('Checkbox'), sg.Checkbox('My second checkbox!', default=True) ], [ sg.Radio('My first Radio! ', "RADIO1", default=True), sg.Radio('My second Radio!', "RADIO1") ], [ sg.Multiline( default_text= 'This is the default Text should you decide not to type anything', size=(35, 3)), sg.Multiline(default_text='A second multi-line', size=(35, 3)) ], [ sg.InputCombo(('Combobox 1', 'Combobox 2'), size=(20, 1)), sg.Slider(range=(1, 100), orientation='h', size=(34, 20), default_value=85) ], [ sg.InputOptionMenu( ('Menu Option 1', 'Menu Option 2', 'Menu Option 3')) ], [ sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'), size=(30, 3)), sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=25), sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=75), sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=10), sg.Column(column1, background_color='black') ], [sg.Text('_' * 80)], [sg.Text('Choose A Folder', size=(35, 1))], [ sg.Text('Your Folder', size=(15, 1), auto_size_text=False, justification='right'), sg.InputText('Default Folder'), sg.FolderBrowse() ], [sg.Submit(), sg.Cancel()] ] button, values = form.LayoutAndRead(layout) sg.Popup('Title', 'The results of the form.', 'The button clicked was "{}"'.format(button), 'The values are', values)
def settings_window(): """ Show the settings window. This is where the folder paths and program paths are set. Returns True if settings were changed :return: True if settings were changed :rtype: (bool) """ try: global_editor = sg.pysimplegui_user_settings.get('-editor program-') except: global_editor = '' try: global_explorer = sg.pysimplegui_user_settings.get( '-explorer program-') except: global_explorer = '' try: # in case running with old version of PySimpleGUI that doesn't have a global PSG settings path global_theme = sg.theme_global() except: global_theme = '' layout = [ [sg.T('Program Settings', font='DEFAULT 25')], [sg.T('Path to Tree', font='_ 16')], [ sg.Combo(sorted(sg.user_settings_get_entry('-folder names-', [])), default_value=sg.user_settings_get_entry( '-demos folder-', get_demo_path()), size=(50, 1), key='-FOLDERNAME-'), sg.FolderBrowse('Folder Browse', target='-FOLDERNAME-'), sg.B('Clear History') ], [sg.T('Editor Program', font='_ 16')], [sg.T('Leave blank to use global default'), sg.T(global_editor)], [ sg.In(sg.user_settings_get_entry('-editor program-', ''), k='-EDITOR PROGRAM-'), sg.FileBrowse() ], [sg.T('File Explorer Program', font='_ 16')], [sg.T('Leave blank to use global default'), sg.T(global_explorer)], [ sg.In(sg.user_settings_get_entry('-explorer program-'), k='-EXPLORER PROGRAM-'), sg.FileBrowse() ], [sg.T('Theme', font='_ 16')], [sg.T('Leave blank to use global default'), sg.T(global_theme)], [ sg.Combo([''] + sg.theme_list(), sg.user_settings_get_entry('-theme-', ''), readonly=True, k='-THEME-') ], [ sg.T('Double-click a File Will:'), sg.R('Run', 2, sg.user_settings_get_entry('-dclick runs-', False), k='-DCLICK RUNS-'), sg.R('Edit', 2, sg.user_settings_get_entry('-dclick edits-', False), k='-DCLICK EDITS-'), sg.R('Nohthing', 2, sg.user_settings_get_entry('-dclick none-', False), k='-DCLICK NONE-') ], [ sg.CB('Use Advanced Interface', default=advanced_mode(), k='-ADVANCED MODE-') ], [sg.B('Ok', bind_return_key=True), sg.B('Cancel')], ] window = sg.Window('Settings', layout) settings_changed = False while True: event, values = window.read() if event in ('Cancel', sg.WIN_CLOSED): break if event == 'Ok': sg.user_settings_set_entry('-demos folder-', values['-FOLDERNAME-']) sg.user_settings_set_entry('-editor program-', values['-EDITOR PROGRAM-']) sg.user_settings_set_entry('-theme-', values['-THEME-']) sg.user_settings_set_entry( '-folder names-', list( set( sg.user_settings_get_entry('-folder names-', []) + [ values['-FOLDERNAME-'], ]))) sg.user_settings_set_entry('-explorer program-', values['-EXPLORER PROGRAM-']) sg.user_settings_set_entry('-advanced mode-', values['-ADVANCED MODE-']) sg.user_settings_set_entry('-dclick runs-', values['-DCLICK RUNS-']) sg.user_settings_set_entry('-dclick edits-', values['-DCLICK EDITS-']) sg.user_settings_set_entry('-dclick nothing-', values['-DCLICK NONE-']) settings_changed = True break elif event == 'Clear History': sg.user_settings_set_entry('-folder names-', []) sg.user_settings_set_entry('-last filename-', '') window['-FOLDERNAME-'].update(values=[], value='') window.close() return settings_changed
sg.theme('DarkBlue12') category_frame_args = ((media, [[ sg.CB(ext, default=True, enable_events=True, key=f"ext_{ext}") for ext in CATEGORIES[media] ]]) for media in CATEGORIES.keys()) category_frames = ([sg.Frame(media, layout, key=f"frame_{media}")] for media, layout in category_frame_args) source_input = [ sg.Text('Source Folder'), sg.InputText(HOME_DIRECTORY, key='source_text'), sg.FolderBrowse('Browse', key='source_browse') ] dest_input = [ sg.Text('Destination Folder'), sg.InputText('', key='dest_text'), sg.FolderBrowse('Browse', key='dest_browse') ] folder_section = [ [sg.Text('Choose Source and Destination Folders')], [*source_input], [*dest_input], ] output = sg.Multiline('', key='output', size=(80, 10)), buttons = sg.Button('Cancel'), sg.Button('Start')
[sg.Frame(layout=[ [sg.Checkbox('Checkbox', size=(10,1)), sg.Checkbox('My second checkbox!', default=True)], [sg.Radio('My first Radio! ', "RADIO1", default=True, size=(10,1)), sg.Radio('My second Radio!', "RADIO1")]], title='Options',title_color='red', relief=sg.RELIEF_SUNKEN, tooltip='Use these to set flags')], [sg.Multiline(default_text='This is the default Text should you decide not to type anything', size=(35, 3)), sg.Multiline(default_text='A second multi-line', size=(35, 3))], [sg.InputCombo(('Combobox 1', 'Combobox 2'), size=(20, 1)), sg.Slider(range=(1, 100), orientation='h', size=(34, 20), default_value=85)], [sg.InputOptionMenu(('Menu Option 1', 'Menu Option 2', 'Menu Option 3'))], [sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'), size=(30, 3)), sg.Frame('Labelled Group',[[ sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=25), sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=75), sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=10), sg.Column(column1)]])], [sg.Text('_' * 80)], [sg.Text('Choose A Folder', size=(35, 1))], [sg.Text('Your Folder', size=(15, 1), auto_size_text=False, justification='right'), sg.InputText('Default Folder'), sg.FolderBrowse()], [sg.Submit(tooltip='Click to submit this window'), sg.Cancel()] ] window = sg.Window('Everything bagel', layout, default_element_size=(40, 1), grab_anywhere=False) event, values = window.Read() # sg.Popup('Title', # 'The results of the window.', # 'The button clicked was "{}"'.format(event), # 'The values are', values)
figure_agg.get_tk_widget().forget() plt.close('all') sg.theme('Dark Blue 3') res = BG.default() # Layout layout = [] frame1 = [[ sg.Text('Folder containing the data:'), sg.Text(size=(15, 1), key='-OUTPUT-') ]] frame1.append([ sg.In(key='-FOLDER-', default_text='/home/juanpelvis/Documents/Inclino'), sg.FolderBrowse() ]) # add date finder frame1.append([ sg.Text('Initial Date:'), sg.InputCombo(values=[i for i in range(2019, 2021)], key='-SY-', default_value=res['-SY-']), sg.Text('y'), sg.InputCombo(values=[i for i in range(1, 13)], key='-SM-', default_value=res['-SM-']), sg.Text('m'), sg.InputCombo(values=[i for i in range(1, 32)], key='-SD-', default_value=res['-SD-']),
shift focus elsewhere, if needed.''' #Py Simple Gui sg.theme('DarkAmber') layout = [ [ sg.Text('Search for video: '), sg.Input(key="Input"), sg.Button('Search') ], [ sg.Text('Browse directory:'), sg.Input(key="dir"), sg.FolderBrowse(initial_folder=os.getcwd(), change_submits=True, key="folder") ], [sg.Text(f'{precaution}')], [sg.Radio(group_id=1, text='Audio'), sg.Radio(group_id=1, text='Video')], [ sg.Radio(group_id=2, text='240p'), sg.Radio(group_id=2, text='360p'), sg.Radio(group_id=2, text='480p'), sg.Radio(group_id=2, text='720p') ], [ sg.Button('Download', tooltip=dl_tp), sg.Button('Convert', tooltip=cv_tp), sg.Text('Ready: X', key="status")
def ciyun_gui(win_main): # 词云图生成GUI import ciyun as cy win_main.Hide() layout_c = [ [ sg.Text('字体颜色范围:', key='font_color_range'), sg.Text('最小值', key='min'), sg.Spin([i for i in range(1, 360)], initial_value=190, key='min_select'), sg.Text('最大值', key='max'), sg.Spin([i for i in range(1, 360)], initial_value=250, key='max_select') ], [ sg.InputText( '关于字体颜色范围取值(H),可以参考https://www.webfx.com/web-design/color-picker/', key='font_color_range_p', disabled=True) ], [ sg.Text('词云图形状:', key='shape'), sg.Combo(['方形', '圆形', '图片形状'], key='shape_select', default_value='图片形状', enable_events=True, size=(8, 1)) ], ] layout_d = [[ sg.FileBrowse('打开图片', key='filebrowser', target='image_shape'), sg.InputText('', key='image_shape', disabled=True) ]] layout = [ [ sg.Text('字体颜色模式:', key='font_color_type'), sg.Combo(['图片颜色', '自定义颜色'], key='font_color_type_select', default_value='自定义颜色', size=(12, 1), enable_events=True) ], [sg.Text('即是按照给定图片的颜色给字上色还是自定义字体颜色', key='font_color_type_p')], [sg.Column(layout_c, key='is_visible')], [sg.Column(layout_d, key='open_image')], [ sg.Text('词云图尺寸:', key='size'), sg.Text('宽', key='width'), sg.Spin([i for i in range(1, 2001)], initial_value=1000, key='width_select'), sg.Text('高', key='highth'), sg.Spin([i for i in range(1, 2001)], initial_value=800, key='higth_select') ], [ sg.Text('字体:', key='font'), sg.Combo(['微软雅黑', '楷体', '宋体', '仿宋', '隶书', 'Times New Roman'], key='font_select', default_value='微软雅黑') ], [ sg.Text('背景颜色:', key='back_color'), sg.ColorChooserButton('颜色选择', key='back_color_select'), sg.Button('透明色点我', key='color_none') ], [ sg.Text('分词模式:', key='word_split_type'), sg.Combo(['自定义模式', '自动分词模式'], key='word_split_type_select', default_value='自动分词模式', size=(8, 1)) ], [ sg.Text( '注:自定义模式即按照你所给的词组进行绘制,词组之间用空格分隔\n自动分词模式即给定一段话,程序自动进行分词并按照频率进行绘制' ) ], [ sg.Text('最大词数:', key='max_words'), sg.Spin([i for i in range(1, 5001)], initial_value=1000, key='max_words_select'), sg.Text('词云图上显示的词数量,退格键删除有问题,建议delete键') ], [ sg.Text('输\n入\n文\n本'), sg.Multiline(size=(30, 10), font=("宋体", 10), key='inputtext'), sg.Text('程\n序\n运\n行\n记\n录'), sg.Output(size=(30, 10), font=("宋体", 10)) ], [ sg.FolderBrowse('保存路径', key='folderbrowser', enable_events=True, target='backup'), sg.InputText('wordcloud.png', key='savefile_name', enable_events=True, size=(15, 1)), sg.InputText('', key='file_path', disabled=True, size=(40, 1)) ], [ sg.Button('开始生成!', key='generate'), sg.Button('保存图片', key='saveas'), sg.Button('返回工具箱', key='back'), sg.Text('', key='backup', visible=False) ] ] window = sg.Window('词云图生成', layout, font=("宋体", 12), default_element_size=(50, 1)) while True: event, values = window.Read() if event in (None, 'back'): window.close() win_main.UnHide() sys.modules.pop('ciyun') # 释放已导入模块 break if event == 'font_color_type_select': # 判断字体颜色模式并隐藏相应控件 if values['font_color_type_select'] == '图片颜色': window['shape_select'].Update('图片形状') window['is_visible'].Update(visible=False) else: window['is_visible'].Update(visible=True) if event == 'shape_select': # 判断形状模式并决定是否隐藏打开文件控件 if values['shape_select'] == '图片形状': window['open_image'].Update(visible=True) else: window['open_image'].Update(visible=False) bgcolor = 'none' if event == 'color_none': # 判断是否选择透明背景色 bgcolor = 'none' if event == 'color_none': bgcolor = values['back_color_select'] if event == 'generate': color_type = values['font_color_type_select'] if color_type == '图片颜色': n, m = (0, 0) else: n = min(values['min_select'], values['max_select']) m = max(values['min_select'], values['max_select']) font = values['font_select'] w, h = (values['width_select'], values['higth_select']) shape = values['shape_select'] if shape == '图片形状': image_path = values['filebrowser'] else: image_path = '' segment_mode = values['word_split_type_select'] text = values['inputtext'] maxword = values['max_words_select'] wordcloud = cy.generate(color_type, n, m, font, image_path, bgcolor, w, h, shape, segment_mode, text, maxword) wordcloud.to_file('cache\image.png') image_view('cache\image.png') print('词云图生成成功') if event in ('folderbrowser', 'savefile_name', 'saveas'): window['file_path'].update(values['folderbrowser'] + '/' + values['savefile_name']) if event == 'saveas': print(values['file_path']) try: wordcloud.to_file(values['file_path']) print('词云图保存成功') except: print('你还没有生成相应的词云图')
auto_size_text=True, justification='center', font=('Consolas', textSi), size=(200, 1)) ], [ sg.Text( 'Нажмите на нее чтобы получить инструкции если забыли как пользоваться программой.', auto_size_text=True, justification='center', font=('Consolas', textSi), size=(200, 1)) ], [sg.T('Место сохранения')], [ sg.In(getItdef, key='folder_s'), sg.FolderBrowse("Обзор", target='folder_s') ], [ sg.Button( 'Бронницы', font=('Consolas', textSi), auto_size_button=True, tooltip= ('Создается один лист с Бронницами.\nУбедитесь что вы выбрали файл "Итоговый отчет о работе выходов по филиалу (общие показатели)"' ), size=(WIN_W, WIN_H), border_width=(5), pad=((1, 1), 1)), sg.Button( 'Воскресенск', font=('Consolas', textSi),
def settings_window(): """ Show the settings window. This is where the folder paths and program paths are set. Returns True if settings were changed :return: True if settings were changed :rtype: (bool) """ layout = [[sg.T('Program Settings', font='DEFAIULT 18')], [sg.T('Path to Demos', size=(20, 1)), sg.In(sg.user_settings_get_entry('-demos folder-', ''), k='-DEMOS-'), sg.FolderBrowse()], [sg.T('Path to GitHub Folder', size=(20, 1)), sg.In(sg.user_settings_get_entry('-github folder-', ''), k='-GITHUB-'), sg.FolderBrowse()], [sg.T('Github Program', size=(20, 1)), sg.In(sg.user_settings_get_entry('-GitHub Program-', ''), k='-GITHUB PROGRAM-'), sg.FileBrowse()], [sg.T('Editor Program', size=(20, 1)), sg.In(sg.user_settings_get_entry('-Editor Program-', ''), k='-EDITOR PROGRAM-'), sg.FileBrowse()], [sg.Combo(sg.theme_list(), sg.user_settings_get_entry('-theme-', None), k='-THEME-')], [sg.B('Ok'), sg.B('Cancel')], ] window = sg.Window('Settings', layout) event, values = window.read(close=True) if event == 'Ok': sg.user_settings_set_entry('-demos folder-', values['-DEMOS-']) sg.user_settings_set_entry('-github folder-', values['-GITHUB-']) sg.user_settings_set_entry('-GitHub Program-', values['-GITHUB PROGRAM-']) sg.user_settings_set_entry('-Editor Program-', values['-EDITOR PROGRAM-']) sg.user_settings_set_entry('-theme-', values['-THEME-']) return True return False
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # import sys, os, subprocess, shutil import PySimpleGUI as sg sep_line = "".ljust(80, "-") form = sg.FlexForm('Merge Binary Folders') layout = [[ sg.Text("Input Folder:", size=(10, 1)), sg.InputText("", key="from"), sg.FolderBrowse(button_text="...") ], [ sg.Text("Output Folder:", size=(10, 1)), sg.InputText("", key="to"), sg.FolderBrowse(button_text="...") ], [ sg.Checkbox("Force Merge - only check if you are sure.", default=False, key="force"), ], [sg.Submit(), sg.Cancel()]] btn, val = form.Layout(layout).Read() if btn != "Submit":
def pxxteste03(): sg.ChangeLookAndFeel('GreenTan') # ------ Menu Definition ------ # menu_def = [ ['File', ['Open', 'Save', 'Exit', 'Properties']], [ 'Edit', ['Paste', [ 'Special', 'Normal', ], 'Undo'], ], ['Help', 'About...'], ] # ------ Column Definition ------ # column1 = [ [ sg.Text('Column 1', background_color='#F7F3EC', justification='center', size=(10, 1)) ], [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 1')], [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 2')], [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 3')] ] layout = [ [sg.Menu(menu_def, tearoff=True)], [ sg.Text('All graphic widgets in one window!', size=(30, 1), justification='center', font=("Helvetica", 25), relief=sg.RELIEF_RIDGE) ], [sg.Text('Here is some text.... and a place to enter text')], [sg.InputText('This is my text')], [ sg.Frame(layout=[[ sg.Checkbox('Checkbox', size=(10, 1)), sg.Checkbox('My second checkbox!', default=True) ], [ sg.Radio('My first Radio! ', "RADIO1", default=True, size=(10, 1)), sg.Radio('My second Radio!', "RADIO1") ]], title='Options', title_color='red', relief=sg.RELIEF_SUNKEN, tooltip='Use these to set flags') ], [ sg.Multiline( default_text= 'This is the default Text should you decide not to type anything', size=(35, 3)), sg.Multiline(default_text='A second multi-line', size=(35, 3)) ], [ sg.InputCombo(('Combobox 1', 'Combobox 2'), size=(20, 1)), sg.Slider(range=(1, 100), orientation='h', size=(34, 20), default_value=85) ], [ sg.InputOptionMenu( ('Menu Option 1', 'Menu Option 2', 'Menu Option 3')) ], [ sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'), size=(30, 3)), sg.Frame('Labelled Group', [[ sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=25), sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=75), sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=10), sg.Column(column1, background_color='#F7F3EC') ]]) ], [sg.Text('_' * 80)], [sg.Text('Choose A Folder', size=(35, 1))], [ sg.Text('Your Folder', size=(15, 1), auto_size_text=False, justification='right'), sg.InputText('Default Folder'), sg.FolderBrowse() ], [sg.Submit(tooltip='Click to submit this window'), sg.Cancel()] ] window = sg.Window('Everything bagel', layout, default_element_size=(40, 1), grab_anywhere=False) event, values = window.read() window.close() sg.popup('Title', 'The results of the window.', 'The button clicked was "{}"'.format(event), 'The values are', values)
os.system("shutdown /r /t 1") window.close() menu_def = [ ['&Tools', ['&Clear Icon Caches']], ['&Help', '&About...'], ] movie_section = [[sg.Text("Folder names pattern: (e.g. 2011 - Melancholia)")], [ sg.Input(default_text="{YEAR} - {MOVIENAME}", key="pattern") ], [sg.Text("Choose a folder: ")], [sg.Input(key="MV-PATH"), sg.FolderBrowse()], [sg.CB("Download and set director icons", key="MV-DIRICON")], [sg.CB("Download and set movie icons", key="MV-MOVICON")], [sg.CB("Search all subfolders", key="MV-RECURSIVE")], [sg.Button("Start", key="MV-START")]] dir_section = [[sg.Text("Choose a folder: ")], [sg.Input(key="DIR-PATH"), sg.FolderBrowse()], [sg.Button("Start", key="DIR-START")]] series_section = [[sg.Text("Choose a folder: ")], [sg.Input(key="SER-PATH"), sg.FolderBrowse()], [sg.CB("Download and set Series Posters", key="SER-ICON")], [sg.CB("Search all subfolders", key="SER-RECURSIVE")], [sg.Button("Start", key="SER-START")]]
[ sg.Input(os.path.abspath( os.path.join(CURRENT_DIR, "csv", "input.csv")), size=(50, 1), key="pathCSV"), sg.FileBrowse("Browse", key="browseCSV", initial_folder="csv", file_types=(("CSV Files", "*.csv"), )) ], [sg.Txt('JSON Directory')], [ sg.Input(os.path.abspath("json-output"), size=(50, 1), key="pathJSON"), sg.FolderBrowse("Browse", key="browseJSON", initial_folder="json-output") ], [sg.Txt('PDF Directory')], [ sg.Input(os.path.abspath("pdf-output"), size=(50, 1), key="pathPDF"), sg.FolderBrowse("Browse", key="browsePDF", initial_folder="pdf-output") ], [ sg.Button("Get JSON & PDFs", key="getJSON_PDF"), sg.Button("Get JSON", key="getJSON"), sg.Button("Get PDFs", key="getPDF") ], [sg.Image("img/spinner.gif", key="spinner")]]
size=(10, 1), default=True, key='-CONTAINS-'), sg.Radio('StartsWith', group_id='search_type', size=(10, 1), key='-STARTSWITH-'), sg.Radio('EndsWith', group_id='search_type', size=(10, 1), key='-ENDSWITH-') ], [ sg.Text('Search Path', size=(11, 1)), sg.Input('/..', size=(40, 1), key='-PATH-'), sg.FolderBrowse(size=(10, 1), key='-BROWSE-'), sg.Button('Search', size=(10, 1), key='-SEARCH-') ], [sg.Text('Enter a search term and press `Search`', key='-INFO-')], [ sg.Listbox(values=results, size=(100, 28), enable_events=True, key='-RESULTS-') ]] window = sg.Window('File Search Engine', layout=layout, finalize=True, return_keyboard_events=True) window['-RESULTS-'].expand(expand_x=True, expand_y=True)
autoscroll=True, enable_events=True, enter_submits=True, auto_size_text=True, key="key1", size=(650, 15), default_text=results.strip() + "\n", background_color="#FFF") ], [ sg.Text("Save Directory", size=(14, 1), pad=(0, 5)), sg.InputText(config.get("mainConfig", "saveDirectory"), background_color="#FFF", size=(30, 1)), sg.FolderBrowse(button_text="Select", button_color=default_button_color, size=(15, 1)) ], ] config3 = [[ sg.T("Chrome Driver Options", size=(500, 1), auto_size_text=True, justification='center', font=("Arial", 10), background_color="#888", text_color="#FFF", pad=(5, 5)) ], [sg.T("Browser Agents", size=(13, 1))], [
def layout(col, sel_func=[]): """ f_path(一番左の列)のみ非表示にしておく """ vm = [True for i in range(len(col))] vm[0] = False """ layoutの部品を先に定義 """ Fit_range_button = sg.Button('Off', size=(3, 1), button_color='white on red', key='-B-') menu_def = [[ '&File', ["&Save as csv", "Save as pkl", "Load pkl", "Undo", 'E&xit'] ]] Browse = [ # sg.Text('Your Folder', size=(15, 1), justification='right'), sg.InputText('', key="path", enable_events=True), sg.FolderBrowse(key="File") ] S = (12, 1) buttons = [[sg.Button("Column Setting", size=S)], [sg.Button("Check fit", size=S, disabled=True)], [sg.Button("Modify data", key="modify", size=S, disabled=True)], [sg.Button("test2")]] def sel(axis): return sg.Frame( "", border_width=0, element_justification="center", pad=(0, 10), layout=[[sg.Text(axis)], [ sg.Listbox([], size=(6, 6), select_mode=sg.LISTBOX_SELECT_MODE_SINGLE, enable_events=True, default_values="", key=axis) ]]) data_sel = [ [ sel("x"), sel("y"), sel("z"), sg.CBox("y_offset?", enable_events=True) ], [ sg.OptionMenu(["Nomal", "Color", "3D"], key="plt_mode"), sg.OptionMenu(DATA_MODES, key="data_mode"), sg.Button("Plot", disabled=True) ], ] plot_menu = sg.Frame("Plot menu", layout=[ [sel("_z")], ]) Fit_controler = FG.layout(sel_func) finfo = sg.Frame("Fitting Info", border_width=0, layout=[[ sg.MLine(default_text="", size=(30, 10), key="info", disabled=True) ]]) """ GUI のレイアウトの設定 """ return [ [sg.Menu(menu_def, tearoff=False)], [ sg.Text("拡張子", size=(5, 1)), sg.Input(".txt", key="fe", size=(5, 1), disabled=True), sg.Input("", key="folder", enable_events=True, visible=False), sg.FolderBrowse(button_text="Add folder", key="add_folder"), sg.FilesBrowse(button_text="Add data files", key="add_files", target="names", enable_events=True), sg.Text("Sort by"), sg.Combo(Vcol, enable_events=True, default_value="filename", key="sort"), sg.CBox("Reverse order", key="sort_order", enable_events=True), sg.Input("", key="names", enable_events=True, visible=False), sg.Button("test") ], # Browse, [ sg.Frame( "", buttons, key="buttons", border_width=1, ), sg.Table( key='-TABLE-', values=[], headings=col, visible_column_map=vm, col_widths=[23, 23, 5], # row_colors=[(0, "red", "white"), (4, "white", "#aaaaff")], justification='right', max_col_width=50, def_col_width=8, auto_size_columns=False, enable_events=True, select_mode=sg.TABLE_SELECT_MODE_EXTENDED, right_click_menu=["", ["Select all", "My fit"]], background_color='#aaaaaa', alternating_row_color='#888888', display_row_numbers=True), finfo ], [sg.HorizontalSeparator()], [ sg.Frame("Data menu", data_sel, element_justification="center"), plot_menu ], [ sg.Frame("Fit panel", Fit_controler, relief=sg.RELIEF_RAISED, border_width=5) ] ]
def parsing(self): """Parameters for parsing directory trees""" with gui.FlexForm(self.title, auto_size_text=True, default_element_size=(40, 1)) as form: layout = [ [ gui.Text('Directory Paths utility', size=(30, 1), font=("Helvetica", 25), text_color='blue') ], # Source [ gui.Text('Source Folder', size=(15, 1), auto_size_text=False), gui.InputText('Source'), gui.FolderBrowse() ], # Parallel / Sequential [ gui.Text( 'Parallel or Sequential Processing. Larger directory trees are typically parsed faster ' 'using parallel processing.') ], [ gui.Radio('Parallel Processing', "RADIO1"), gui.Radio('Sequential Processing', "RADIO1", default=True) ], [_line()], # Files and non-empty-folders [ gui.Text( 'Return files or folders, returning folders is useful for creating inventories.' ) ], [ gui.Radio('Return Files', "RADIO2", default=True), gui.Radio('Return Non-Empty Directories', "RADIO2") ], [_line()], # max_level [ gui.Text( 'Max Depth.... Max number of sub directory depths to traverse (starting directory is 0)' ) ], [gui.InputCombo(list(reversed(range(0, 13))), size=(20, 3))], [_line()], # Relative and absolute [ gui.Text( 'Relative or Absolute Paths. Relative paths are saved relative to the starting directory. ' 'Absolute paths are saved as full paths.') ], [ gui.Radio('Relative Paths', "RADIO3", default=True), gui.Radio('Absolute Paths', "RADIO3") ], [_line()], # Topdown and output [ gui.Checkbox('Topdown Parse', default=True), gui.Checkbox('Live output results') ], [_line()], # Save results to file [gui.Checkbox('Save Results to File', default=False)], [gui.Submit(), gui.Cancel()] ] (button, (values)) = form.LayoutAndShow(layout) # gui.MsgBox(self.title, 'Parameters set', 'The results of the form are... ', # 'The button clicked was "{}"'.format(button), 'The values are', values, auto_close=True) self.params['parse'] = { 'directory': values[0], 'parallelize': values[1], 'sequential': values[2], 'yield_files': values[3], 'non_empty_folders': values[4], 'max_level': int(values[5]), '_relative': values[6], 'full_paths': values[7], 'topdown': values[8], 'console_stream': values[9], 'save_file': values[10], } if self.params['parse']['save_file']: self._saving() return self.params
htmlfile.write('</html>') layout = [ [sg.Text('Use reference Image to search for similar Images in folder.')], [sg.Text('1. Select reference image')], [sg.Text('2. Select folder with images')], [sg.Text('3. Choose Search Algorithm')], [sg.Text('4. Click "Search"')], [sg.Text('5. Results available below and exported to results.csv file')], [sg.Text('')], [sg.Text('Reference Image:')], [sg.Input(key='_REF_IMG_'), sg.FileBrowse()], [sg.Text('')], [sg.Text('Select folder with images to search:')], [sg.Input(key='_IMGS_'), sg.FolderBrowse()], [sg.Text('')], [sg.Text('SEARCH METHOD', font=(22))], [ sg.Radio('Histogram', "_RADIO_MODE_", default=True, key='Radio_1'), sg.Radio('AKAZE', "_RADIO_MODE_", key='Radio_2'), sg.Radio('ORB', "_RADIO_MODE_", key='Radio_3') ], [sg.Button("Search", size=(10, 1), bind_return_key=True, key='_SEARCH_')], [sg.Output(size=(70, 30))], ] window = sg.Window('Image Search Engine', layout, element_justification='left') result_list = [] new_result_list = []
def settings_window(): """ Show the settings window. This is where the folder paths and program paths are set. Returns True if settings were changed :return: True if settings were changed :rtype: (bool) """ editor_program = get_editor() layout = [[sg.T('Program Settings', font='DEFAIULT 18')], [sg.T('Path to Demos', size=(20,1)), sg.In(sg.user_settings_get_entry('-demos folder-', '.'), k='-DEMOS-'), sg.FolderBrowse()], [sg.T('Editor Program', size=(20,1)), sg.In(sg.user_settings_get_entry('-editor program-', editor_program),k='-EDITOR PROGRAM-'), sg.FileBrowse()], [sg.T(r"For PyCharm, Add this to your PyCharm main program's folder \bin\pycharm.bat")], [sg.Combo(['']+sg.theme_list(), sg.user_settings_get_entry('-theme-', None), k='-THEME-')], [sg.B('Ok', bind_return_key=True), sg.B('Cancel')], ] window = sg.Window('Settings', layout) event, values = window.read(close=True) if event == 'Ok': sg.user_settings_set_entry('-demos folder-', values['-DEMOS-']) new_editor = global_editor if not values['-EDITOR PROGRAM-'] else values['-EDITOR PROGRAM-'] sg.user_settings_set_entry('-editor program-', new_editor) new_theme = sg.theme_global() if values['-THEME-'] == '' else values['-THEME-'] sg.user_settings_set_entry('-theme-', new_theme) return True return False
def run_gui(): settings_path = os.path.join(cd, 'setting.json') def clear_empty_top_widget(ui): ''' clear ui to easyily for coping functionality (ctrl+c) ''' ''' # case1 sg.Frame('', key='gridLayout', layout = [ [sg.RButton('PushButton', key='pushButton'), sg.RButton('PushButton', key='pushButton_2')] ]) ''' first_line = ui.split('\n')[0] regex_matched = make_regex( r"^sg.Frame\('',\s?key='.*',\slayout\s=\s\[").match(first_line) if regex_matched and ui[-2:] == '])': new_ui = '[\n' + '\n'.join(ui.split('\n')[1:]).strip() return new_ui[:-1] return ui def update_clear_btn(my_window, my_values, real_value=''): objname = my_values['objname'] if real_value == '' else real_value all_object_names_in_combo = my_window['objs'].Values if my_values['xmlfile'] and objname and objname in all_object_names_in_combo: my_window['convert_btn'].update(disabled=False) my_window['convert_all_events'].update(disabled=False) my_window['convert_btns_events'].update(disabled=False) else: my_window['convert_btn'].update(disabled=True) my_window['convert_all_events'].update(disabled=True) my_window['convert_btns_events'].update(disabled=True) def update_app_settings(): with open(settings_path, 'w', encoding='utf-8') as f: json.dump(_settings, f, ensure_ascii=False, indent=2) def send_board_message(text='*** Done ***'): curr_title = window['message_board'].metadata new_title = '{} | {} '.format(curr_title, text) window['message_board'].TKFrame.config(text=new_title) # counter end -> execute this: def clear_frame(): new_board_message = window['message_board'].metadata window['message_board'].TKFrame.config(text=new_board_message) return {'count': 1, 'finished' : clear_frame} def parse_n_load_possible_widgets(myxml_file='', values={}): ''' возвращает найденые object_names все виджетов ''' if os.path.exists(myxml_file) and os.path.isfile(myxml_file): # get xml with open(myxml_file, 'r', encoding='utf-8') as ff: xml_code = ff.read() # filter object names widgets_regexpattern = make_regex( r"^[ \s]{1,}<(widget)\s?.*?\s?name=\"(.+)\"\/?>", MULTILINE) layouts_regexpattern = make_regex( r"^[ \s]{1,}<(layout)\s?.*?\s?name=\"(.+)\"\/?>", MULTILINE) widgets = [i.group(2) for i in finditer( widgets_regexpattern, xml_code)] layouts = [i.group(2) for i in finditer( layouts_regexpattern, xml_code)] widgets.sort() layouts.sort() # ##################### # обработка id виджетов # ##################### for i in widgets: if '"' in i: i = i[:i.index('"')] for i in layouts: if '"' in i: i = i[:i.index('"')] # ###### # insert # ###### combo_items = ['# pick LAYOUTS widgets #', *layouts, '# pick WIDGETS widgets #', *widgets] window['objs'].update(values=combo_items) update_clear_btn(window, values) el = combo_items[1] if ' ' not in el: window['objname'].update(el) update_clear_btn(window, values, real_value=el) return combo_items else: window['objs'](values=[]) window['objname']('') return [] def change_language(): global curr_lang if curr_lang == 'en': curr_lang = 'ru' else: curr_lang = 'en' # self.ParentNotebook.tab(self.ContainerElemementNumber-1, text=self.Title) for psg_key, element_text in langs[curr_lang].items(): # get elem + his type elem = window[psg_key]; elem_type = type(elem) # update text of widget try: if elem_type in [sg.Frame, sg.Text]: elem.update(value=element_text) elif elem_type in [sg.Button, sg.Checkbox]: elem.update(text=element_text) else: raise Exception("eerororor") except Exception as e: print(type(elem), psg_key, elem, elem_type) raise e # special update if curr_lang == 'en': window['message_board'].metadata = 'Output code' window['_tab_transpiler'](title='Transpiler') window['_tab_settings'](title='Settings') elif curr_lang == 'ru': window['message_board'].metadata = 'Результат' window['_tab_transpiler'](title='Основное') window['_tab_settings'](title='Настройка') # window['change_lang_btn']() # window['_tab_settings']() # _tab_transpiler if os.path.exists(settings_path): try: with open(settings_path, 'r', encoding='utf-8') as f: _settings = json.load(f) except Exception as e: _settings = { '-memento-file-cb-': False, 'xmlfile': '' } update_app_settings() else: _settings = { '-memento-file-cb-': False, 'xmlfile': '' } update_app_settings() ############### ### GUI ### ############### ralign = {'size': (16, 2), "justification": 'r'} main_layout = [ [sg.T('xml file', **ralign, key='_lbl_xml file'), sg.I(key='xmlfile', size=(35, 2), change_submits=True), sg.FileBrowse(target='xmlfile')], [sg.T('target object name', **ralign, key='_lbl_target object name'), sg.I(key='objname', size=(35, 2), change_submits=True)], [sg.T('all object names', **ralign, key='_lbl_all object names'), sg.Drop(values=[''], key='objs', size=(34, 1), change_submits=True) ], [ sg.T('', **ralign), sg.B('convert', key='convert_btn', disabled=True), sg.B('convert++\nall events', size=(-1, 2), key='convert_all_events', disabled=True), sg.B('convert++\nbtns events', size=(-1, 2), key='convert_btns_events', disabled=True) ], [ sg.T('options:', **ralign, key='_lbl_options:'), sg.CB('try convert unknows widgets', True, key='no_bad_widgets') ], ] settings_layout = [ [sg.CB('Remember path to previous file', False, change_submits=True, key='-memento-file-cb-')], [sg.T('Indent size', key='_lbl_indent_size'), sg.I('1', size=(5, 1), key='indent_size')], [sg.T('Indent char', key='_lbl_indent_char'), sg.I(' ', size=(5, 1), key='indent_char')], ############ # autoupdate ############ [sg.Frame('Auto updater', layout=[ [sg.CB('Enable', False, key='enable_autocompiler', change_submits=True, pad=(0,0), size=(20, 1)), sg.T('interval(ms)', size=(15, 1), key='_lbl_interval(ms)'), sg.Spin(list(range(500, 1000)), initial_value=500, key='autocompile_interval_ms', size=(10, 1), change_submits=True, pad=(0,0))], [sg.T('===========================')], [ sg.T('output folder: ', pad=(0,0), size=(15, 2), key='_lbl_output folder: '), sg.I('', key='autotarget_file'), sg.B('copy folder\nfrom input-file', key='copy_xmlfile_btn', size=(10,3), pad=(0,0), button_color=('black', 'blue')), sg.FolderBrowse('Browse folder...', target='autotarget_file', pad=(0,0), key='browse_input_file_key') ], [ sg.T('output file name:', pad=(0,0), size=(20, 1), key='_lbl_output file name:'), sg.I('untitled_psg.py', key='PSG_OUTPUT_FNAME'), ], ], key='_title_Auto updater')], ] layout = [ [ sg.Col([ [sg.TabGroup([[ sg.Tab('transpiler', main_layout, key='_tab_transpiler') ,sg.Tab('settings', settings_layout, key='_tab_settings') ]], key='-tab_group-')] ,[sg.T('\n'*4)] ,[sg.B('Change language/Поменять язык', size=(40, 2), key='change_lang_btn')] ]), sg.Frame('Output data', layout=[ [sg.B('Clear output', key='clear_btn'), sg.B('Execute output (used after convert++)', size=(35, 1), disabled=True, key='Try')], [sg.ML(key='psg_ui_output', size=(70, 20))] ], key='message_board')], ] window = sg.Window('PySimpleGUIDesigner by nngogol', layout, auto_size_buttons=False, default_button_element_size=(10, 1), finalize=True, location=(100, 100)) # coz current_version of PSG is 4.4 window['message_board'].metadata = 'Output data' # ##### # setup # ##### if _settings['-memento-file-cb-']: window['-memento-file-cb-'].update(True) window['xmlfile'].update(_settings['xmlfile']) update_app_settings() psg_vals = window(timeout=0)[1] parse_n_load_possible_widgets(psg_vals['xmlfile'].strip(), psg_vals) # ######### # variables # ######### timers = [] # ############ # variables: for auto-compile # ############ is_autocompiler_working = False autocompile_interval_ms = psg_vals['autocompile_interval_ms'] p_input_xml_hash = None curr_file_hash = file_hash(psg_vals['xmlfile']) if os.path.exists(psg_vals['xmlfile']) else b'' current_obj_names = [] status = True window['autocompile_interval_ms'](disabled=status); window['autotarget_file'](disabled=status); window['copy_xmlfile_btn'](disabled=status); window['browse_input_file_key'](disabled=status); window['PSG_OUTPUT_FNAME'](disabled=status) while True: if is_autocompiler_working: event, values = window(timeout=autocompile_interval_ms) else: event, values = window(timeout=500) if event in (None, 'Exit'): break # сдежка за таймерами и их работами for a_timer in timers: if a_timer['count'] > 0: a_timer['count'] -= 1 elif a_timer['count'] == 0: a_timer['finished']() timers.remove(a_timer) ################################ # _ _ # # | | (_) # # | | ___ __ _ _ ___ # # | |/ _ \ / _` | |/ __| # # | | (_) | (_| | | (__ # # |_|\___/ \__, |_|\___| # # __/ | # # |___/ # ################################ # ############ # auto compile # ############ is_autocompiler_working = values['enable_autocompiler'] if is_autocompiler_working: autotarget_file_dir = os.path.dirname(values['autotarget_file']) if values['objname'] not in current_obj_names: window['psg_ui_output']('(autocompiler) Error :\nBad target object name.') elif not os.path.exists(autotarget_file_dir): window['psg_ui_output']('(autocompiler) Error :\nBad output folder.') elif not os.path.exists(values['xmlfile']): window['psg_ui_output']('(autocompiler) Error :\nBad input xml file.') else: file_hash_val = file_hash(values['xmlfile']) if not curr_file_hash: # first time output_file = os.path.join(autotarget_file_dir, values['PSG_OUTPUT_FNAME']) psg_ui_code = just_compile(values) writefile(output_file, psg_ui_code) window['psg_ui_output']('compiled!') else: # as usual if curr_file_hash != file_hash_val or event == 'objname': # long output_file = os.path.join(autotarget_file_dir, values['PSG_OUTPUT_FNAME']) psg_ui_code = just_compile(values) writefile(output_file, psg_ui_code) window['psg_ui_output']('compiled!') curr_file_hash = file_hash_val # ########### # sg.I events # ########### # update ms update interval sg.Spin if event == 'autocompile_interval_ms': autocompile_interval_ms = values['autocompile_interval_ms'] if event == 'enable_autocompiler': status = not values['enable_autocompiler'] window['autocompile_interval_ms'](disabled=status); window['autotarget_file'](disabled=status); window['copy_xmlfile_btn'](disabled=status); window['browse_input_file_key'](disabled=status); window['PSG_OUTPUT_FNAME'](disabled=status) if event == 'xmlfile': # remember this file if _settings['-memento-file-cb-']: _settings['xmlfile'] = values['xmlfile'].strip() update_app_settings() obj_names = parse_n_load_possible_widgets(values['xmlfile'].strip(), values) current_obj_names = obj_names elif event == 'objs': # add only REAL object names -> those, who not contain ' ' if ' ' not in values['objs']: window['objname'].update(values['objs']) update_clear_btn(window, values, real_value=values['objs']) elif event == 'objname': update_clear_btn(window, values) # ######## # checkbox # ######## if event == '-memento-file-cb-': _settings['-memento-file-cb-'] = values['-memento-file-cb-'] _settings['xmlfile'] = '' if values['-memento-file-cb-'] else values['xmlfile'] update_app_settings() # ####### # buttons # ####### elif event == 'clear_btn': window['psg_ui_output'].update('') elif event == 'copy_xmlfile_btn': window['autotarget_file'](os.path.dirname(values['xmlfile']) + '/') elif event == 'convert_btn': ui = just_compile(values) window['psg_ui_output'].update(ui) if ui.startswith('Error:'): # fail timers.append(send_board_message(text='***!!!*** Fail ***!!!***')) else: # success timers.append(send_board_message(text='*** Done ***')) elif event == 'convert_all_events': ui = just_compile(values) psg_ui = build_boilerplate(layout=ui, btns_event=False, all_events=True) if ui.startswith('Error:'): # fail window['psg_ui_output'].update(ui) timers.append(send_board_message(text='***!!!*** Fail ***!!!***')) else: # success window['psg_ui_output'].update(psg_ui) timers.append(send_board_message(text='*** Done ***')) elif event == 'convert_btns_events': ui = just_compile(values) psg_ui = build_boilerplate(layout=ui, btns_event=True, all_events=False) if ui.startswith('Error:'): # fail window['psg_ui_output'].update(ui) timers.append(send_board_message(text='***!!!*** Fail ***!!!***')) else: # success window['psg_ui_output'].update(psg_ui) timers.append(send_board_message(text='*** Done ***')) elif event == 'Try': try: psg_ui = values['psg_ui_output'].strip() psg_ui_lines = psg_ui.split('\n') ''' case 1: import PySimpleGUI as sg ... case 2: sg.Frame('', layout = [ [...], [...], [...], ]) case 3: [ [...], [...], [...], ] ''' if psg_ui.startswith('import PySimpleGUI as sg'): exec(psg_ui) if psg_ui_lines[0].startswith("""sg.Frame('""") and psg_ui_lines[0].endswith("""', layout = ["""): window2 = sg.Window('test', eval(psg_ui)) window2.read() window2.close() if psg_ui_lines[0].startswith("""[""") and psg_ui_lines[-1].endswith("""]"""): possible_ui = eval(psg_ui) possible_ui if type(possible_ui) is list and type(possible_ui[0]) is not list: raise Exception(f"bad ui given. It's not a list of LISTS.") window2 = sg.Window('test', possible_ui) window2.read() window2.close() except Exception as e: sg.popup(str(e)) elif event == 'change_lang_btn': change_language() window.close()
def generate_plugin_ui(self) -> List[sg.Element]: plugin_ui = [] for plugin in self.plugins.values(): elements = [] for param in plugin.parameters: if param.ui_mode not in [UIMode.GUI, UIMode.BOTH]: continue default_value = param.default_value if plugin.title in self.config and param.name in self.config[ plugin.title] and param.load_last_value: default_value = self.config[plugin.title][param.name] if param.param_type == ParamType.CHECKBOX and type( default_value) != bool: default_value = default_value == "True" key = "{0}_{1}".format(plugin.get_title(), param.name) metadata = { 'plugin': plugin.title, 'name': param.name, 'default_value': param.default_value } if param.param_type == ParamType.TEXT: elements.append([ collapsible([[ sg.Text(param.label, size=(10, 1)), sg.Input(default_value, key=key, enable_events=True, size=(SmartHashGui.MAIN_WIDTH - 12, None), disabled=(param.disabled or param.display_only), metadata=metadata) ]], visible=param.visible, key=key + '_wrapper') ]) elif param.param_type == ParamType.PATH: elements.append([ collapsible([[ sg.Text(param.label, size=(10, 1)), sg.Input(default_value, key=key, enable_events=True, readonly=True, disabled=(param.disabled or param.display_only), metadata=metadata), sg.FolderBrowse() ]], visible=param.visible, key=key + '_wrapper') ]) self.folder_browsers.append(key) elif param.param_type == ParamType.SELECT: elements.append([ collapsible([[ sg.Text(param.label, size=(10, 1)), sg.Combo(param.options, key=key, default_value=default_value, enable_events=True, readonly=True, size=(30, 1), disabled=(param.disabled or param.display_only), metadata=metadata) ]], visible=param.visible, key=key + '_wrapper') ]) elif param.param_type == ParamType.CHECKBOX: elements.append([ collapsible([[ sg.Checkbox(param.label, key=key, default=default_value, enable_events=True, disabled=(param.disabled or param.display_only), metadata=metadata) ]], visible=param.visible, key=key + '_wrapper') ]) elif param.param_type == ParamType.RADIO: buttons = [] for option in param.options: buttons.append( sg.Radio(option, key, default=(option == param.default_value), enable_events=True, disabled=(param.disabled or param.display_only), key=key + '_' + option)) elements.append([ collapsible([buttons], visible=param.visible, key=key + '_wrapper') ]) visible = plugin.get_title() == self.curr_plugin.get_title() plugin_ui.append( collapsible(elements, visible=visible, key=plugin.get_title())) return plugin_ui
def Layout(self): # ----- Column Definition ----- # Dir = [ [sg.Text('Import Dir')], [sg.Input(size=(30, 1)), sg.FolderBrowse(key='-importDirPath-')], [sg.Text('Output Dir')], [sg.Input(size=(30, 1)), sg.FolderBrowse(key='-outputDirPath-')], [sg.Button('DataMake', key='-DataMake-')], ] convfunc = [ [sg.Text('OrigiData')], [sg.InputText('data.csv', size=(13, 1), key='-orgDataFileName-')], [sg.Text('LearnData')], [sg.InputText('learn.csv', size=(13, 1), key='-lrnDataFileName-')], [sg.Text('TestData'), sg.Text('小数点以下の桁数')], [ sg.InputText('test.csv', size=(13, 1), key='-tstDataFileName-'), sg.InputText('2', size=(5, 1), key='-Digit-') ], ] dataConv = [ [sg.Column(Dir), sg.Column(convfunc)], ] NetMake = [ [sg.Text('層の種類 '), sg.Text('ユニット数')], [ sg.InputCombo(('input', 'Dense'), size=(15, 1), key='-LayerName-'), sg.InputText('50', size=(5, 1), key='-Node-') ], [sg.Text('重みの初期値')], [ sg.InputCombo(( 'He', 'Xavier', ), size=(15, 1), key='-weightInit-') ], [sg.Text('閾値の初期値')], [sg.InputCombo(('ZEROS', ), size=(15, 1), key='-biasInit-')], [sg.Text('活性化関数')], [ sg.InputCombo(('relu', 'sigmoid', 'liner'), size=(15, 1), key='-activation-'), sg.Button('add', key='-LayerAdd-') ], [sg.Text('損失関数')], [ sg.InputCombo(('mean_squared_error', ), size=(20, 1), key='-loss-') ], [sg.Text('最適化')], [ sg.InputCombo(( 'sgd', 'momentum_sgd', 'nag', 'ada_grad', 'rmsprop', 'ada_delta', 'adam', ), size=(20, 1), key='-optimizer-') ], [sg.Text('評価関数')], [ sg.InputCombo(('r2', 'rmse'), size=(15, 1), key='-metrics-'), sg.Button('NetMake', key='-NetMake-') ], ] FlowChartPrint = [ [sg.Button('FlowChart', key='-FlowChartPrint-')], ] NuralNet = [ [sg.Text('学習用データ')], [sg.Input(size=(30, 1)), sg.FileBrowse(key='-orgLRN-')], [sg.Text('学習用ラベル')], [sg.Input(size=(30, 1)), sg.FileBrowse(key='-orgTrg-')], [sg.Text('Validation用データ')], [sg.Input(size=(30, 1)), sg.FileBrowse(key='-valLRN-')], [sg.Text('Validation用ラベル')], [sg.Input(size=(30, 1)), sg.FileBrowse(key='-valTrg-')], [ sg.Radio('標準化', 'feature', size=(10, 1), key='-feature_0-'), sg.Radio('正規化', 'feature', size=(10, 1), key='-feature_1-'), sg.Radio('両方', 'feature', size=(10, 1), key='-feature_2-') ], [sg.Text('Batch Size'), sg.Text('epochs')], [ sg.InputText('128', size=(10, 1), key='-Batch-'), sg.InputText('100', size=(10, 1), key='-epochs-'), sg.Button('Training', key='-TrainingRUN-') ], ] NetEvaluate = [ [sg.Text('テスト用データ')], [sg.Input(size=(30, 1)), sg.FileBrowse(key='-tstLRN-')], [sg.Text('テスト用ラベル')], [ sg.Input(size=(30, 1)), sg.FileBrowse(key='-tstTrg-'), sg.Button('Test', key='-TestRUN-') ], ] layout = [ [ sg.Frame('NetMake', NetMake), sg.Frame('NuralNet', NuralNet), sg.Column(FlowChartPrint) ], [sg.Frame('DataConv', dataConv)], [sg.Quit()], ] return layout
def __init__(self): self.load_config() if 'Smarthash GUI' not in self.config: self.config['Smarthash GUI'] = {'last path': ''} plugin_filenames = SmartHash.plugin_find() self.window = None self.plugins = {} self.curr_plugin = None self.folder_browsers = [] self.curr_progress = 0 self.is_hashing = False self.hooks = {} self.args = None for x in plugin_filenames: self.plugins[x] = importlib.import_module("Plugins." + x).SmarthashPlugin() if self.plugins[x].title in self.config: self.plugins[x].set_config(self.config[self.plugins[x].title]) if not hasattr(self.plugins[x], 'handle'): self.init_error("Could not import \"{0}\" plugin".format(x)) continue if self.plugins[x].title not in self.config: self.config[self.plugins[x].title] = {} for hook in self.plugins[x].hooks: if hook.element_name not in self.hooks: self.hooks[hook.element_name] = [] self.hooks[hook.element_name].append(hook) self.early_return = False self.init_errors = [] window_title = 'smarthash v{0}'.format(smarthash_version) window_initialization_text = "Loading plugins..." + " " * 40 initialization_text = collapsible( [[sg.Text(window_initialization_text)]], key='initialization_text') last_plugin_matches = [ x for x in list(self.plugins.values()) if 'selected plugin' in self.config['Smarthash GUI'] and x.title == self.config['Smarthash GUI']['selected plugin'] ] if last_plugin_matches: self.select_plugin(last_plugin_matches[0]) else: self.select_plugin(list(self.plugins.values())[0]) plugin_selection = [ sg.Text("Select plugin: "), sg.Combo([x.get_title() for x in self.plugins.values()], key='plugin_selection', default_value=self.curr_plugin.get_title(), enable_events=True, readonly=True, size=(30, 1)) ] initialization_error = collapsible([[ sg.MLine(" " * 100, key='initialization_error_ml', visible=False, size=(None, 5), text_color='red') ]], key='initialization_error') progress_bar = collapsible([[ sg.ProgressBar(1, orientation='h', size=(SmartHashGui.MAIN_WIDTH - 34, 20), key='progress_bar'), sg.Text("0.00%", size=(8, 1), key="progress_bar_percent") ]], key='progress_bar_wrapper', visible=False) hash_result = collapsible( [[sg.Text(key='hash_result_txt', size=(60, 1))]], key='hash_result', visible=False) path_to_hash = self.config['Smarthash GUI']['last path'] \ if self.config['Smarthash GUI']['last path'] else folder_default main = collapsible([ [sg.Text("Create a torrent from a folder")], [ sg.Input(path_to_hash, key='path_to_hash', disabled=True, enable_events=True, size=(SmartHashGui.MAIN_WIDTH, None)), sg.FolderBrowse() ], [ sg.Checkbox("Skip video rehash", key='skip_video_rehash', default=False, enable_events=True) ], plugin_selection, self.generate_plugin_ui(), [progress_bar], [hash_result], [sg.Button("Create", key='create_button', disabled=True)], ], key='main', visible=False) self.layout = [[initialization_text], [initialization_error], [main]] self.window = sg.Window(window_title, self.layout, icon='assets/icon.ico', finalize=True) # execute hooks for element, hooks in self.hooks.items(): for hook in hooks: if type(self.window[element]) == sg.Combo: value = self.window[element].DefaultValue else: value = self.window[element].DefaultText # Don't execute hook for default values if set if not hook.exec_on_default and self.window[element] == value: continue if hook.exec_on_init: self.exec_hook_commands_async(hook, value) # set the initial state of the create button self.update_create_button(self.window.read(0)[1]) self.background_thread = threading.Thread(target=self.init) self.background_thread.start() self.run()
# not working import PySimpleGUI as sg with sg.FlexForm('Wszystko razem - ABIX', auto_size_text=True, default_element_size=(40, 1)) as form: layout = [ [sg.Text('Wszystkie grafiki w jednym miejscu!', size=(30, 1), font=("Helvetica", 25), text_color='blue')], [sg.Text('Jakiś tekst... a jesli chcesz, wprowadź swój...')], [sg.InputText()], [sg.Checkbox('Mój checkbox'), sg.Checkbox('Mój kolejny checkbox!', default=True)], [sg.Radio('Radio button! ', "RADIO1", default=True), sg.Radio('Inny button !', "RADIO1")], [sg.Multiline(default_text='To jest domyślny tekst, jeśli zdecydujesz się nie wpisywać niczego', scale=(2, 10))], [sg.InputCombo(['Combobox 1', 'Combobox 2'], size=(20, 3)), sg.Slider(range=(1, 100), orientation='h', size=(35, 20), default_value=85)], [sg.Listbox(values=['Listbox 1', 'Listbox 2', 'Listbox 3'], size=(30, 6)), sg.Slider(range=(1, 100), orientation='v', size=(10, 20), default_value=25), sg.Slider(range=(1, 100), orientation='v', size=(10, 20), default_value=75), sg.Slider(range=(1, 100), orientation='v', size=(10, 20), default_value=10)], [sg.Text('_' * 100, size=(70, 1))], [sg.Text('Wybierz katalogi: źródłowy i docelowy', size=(35, 1))], [sg.Text('Wybierz katalog', size=(15, 1), auto_size_text=False, justification='right'), sg.InputText('Źródło'), sg.FolderBrowse()], [sg.Text('Docelowy katalog', size=(15, 1), auto_size_text=False, justification='right'), sg.InputText('Docelowo'), sg.FolderBrowse()], [sg.Submit(), sg.Cancel(), sg.SimpleButton('Dostosowany', button_color=('white', 'green'))] ] button, values = form.LayoutAndRead(layout)
def main(): global values # Set theme psg.theme('LightGrey4') # Initiate GUI window elements in a list called 'layout'. layout = [[ psg.Text('MalProtectAV', font='Any 15', text_color='black', background_color='white') ], [ psg.Text("Choose folder to scan: ", font='Any 15', text_color='black'), psg.FolderBrowse(key="dir_to_scan") ], [ psg.Multiline(size=(93, 20), key='-ML-', autoscroll=True, reroute_stdout=True, write_only=True, reroute_cprint=True) ], [ psg.Button('', image_data=scan_btn, button_color='white', key='Start'), psg.Button('', image_data=results_btn, button_color='white', key='Results'), psg.Button('', image_data=quarantine_btn, button_color='white', key='Quarantine'), psg.Button('', image_data=remove_btn, button_color='white', key='Remove'), psg.Button('', image_data=exit_btn, button_color='white', key='Exit') ], [ psg.Text('Scan', pad=(35, 0)), psg.Text('Results', pad=(35, 0)), psg.Text('Quarantine', pad=(15, 0)), psg.Text('Remove', pad=(35, 0)), psg.Text('Exit', pad=(35, 0)) ]] window = psg.Window('MalProtect Antivirus', layout, background_color='white') # Initialize the GUI window while True: # GUI event loop (Standard way to launch PySimpleGUI) event, values = window.read( ) # Read events happening in the GUI window if event == psg.WIN_CLOSED or event == 'Exit': # Exit break if event.startswith('Start'): # Start threading.Thread(target=scanner, args=(window, ), daemon=False).start() # Initiate Threading if event == thread_process: # Return Thread values if used psg.cprint(f'{values[thread_process]}', colors='white on red') if event == 'Results': # Results see_results() if event == 'Remove': # Remove remove_from_quarantine() if event == 'Quarantine': # Quarantine quarantine_from_results() window.close()
def main_window(self): folder_select_layout = [ [ sg.Text('Select source folder', size=(20, 1)), sg.In(key='SRC', enable_events=True), sg.FolderBrowse() ], [ sg.Text('Select destination folder', size=(20, 1)), sg.In(key='DST', enable_events=True), sg.FolderBrowse() ], ] layout = [ [ sg.Frame( 'Choose source and destination folders', layout=folder_select_layout, ) ], [sg.Text("Choose Operation to perform:")], [ sg.Combo(['Copy', 'Move'], default_value='Move', key='OPERATION', size=(10, 1)), sg.CBox( "Overwrite files", tooltip= "Incoming files will replace files of the same names in the destination", key="OVERWRITE") ], [ sg.Frame(layout=[[sg.Text("Sort by Type")], [ sg.Radio("Enabled", "RADIO1", default=False, key='SBYTE', enable_events=True), sg.Radio("Disabled", "RADIO1", default=True, key='SBYTD', enable_events=True) ]], title='Sorting Options', title_color='red', relief=sg.RELIEF_SUNKEN) ], [sg.Text("Choose filetype:")], [ sg.Combo( # Options for type of file [ "Archive ('.zip', '.rar'...)", "Image ('.png', '.jpg'...)", "Text ('.txt', '.docx'...)", "Video ('.mp4', '.mov'...)", "Audio ('.mp3', '.wav'...)", "Code ('.cpp', '.py'...)" ], key='FILETYPE', enable_events=True) ], [sg.Ok(), sg.Cancel()] ] window = sg.Window('Choose filetype to move', layout, default_element_size=(40, 1)) while True: event, values = window.read() if event in (sg.WIN_CLOSED, 'Cancel'): break elif event in ['SRC', 'DST']: set_path(event, values[event]) elif event in 'Ok': if not get_path('src') or not get_path('dst'): missing_fields = None if not get_path('src') and not get_path('dst'): missing_fields = "source and destination folders" elif not get_path('src'): missing_fields = "source folder" else: missing_fields = "destination folder" sg.PopupOK("Oops! You didn't select the {}".format( missing_fields)) elif values['FILETYPE'] not in file_type: append_file_type(values['FILETYPE']) run_fmover = FileMover() append_mode(values['OPERATION']) if len(sort_list) == 1: for value in sort_list: if value == 'Sort by Type': run_fmover.filemover(values['OPERATION'], value, values['OVERWRITE']) else: run_fmover.filemover(values['OPERATION'], None, values['OVERWRITE']) else: run_fmover.filemover(values['OPERATION'], None, values['OVERWRITE']) else: run_fmover = FileMover() append_mode(values['OPERATION']) if len(sort_list) == 1: for value in sort_list: if value == 'Sort by Type': run_fmover.filemover(values['OPERATION'], value, values['OVERWRITE']) else: run_fmover.filemover(values['OPERATION'], None, values['OVERWRITE']) else: run_fmover.filemover(values['OPERATION'], None, values['OVERWRITE']) elif event in 'SBYTE': if values['SBYTE'] is True: sort_list.append('Sort by Type') else: pass elif event in 'SBYTD': if values['SBYTD'] is True: sort_list.clear() else: pass else: pass window.close()
# set the login state to False loggedin = False # the currently open case active_case = '' # a method that makes a case def makeCase(number, title, note): values = {"number": number, "title": title, "note": note} db.set_case(values) # The layout of the window is created with the 'layout' variable layout = [[ Sg.Text('At which location would you like to save the TUF database?') ], [Sg.Input(path), Sg.FolderBrowse()], [Sg.T(' ' * 25), Sg.Button('Yes'), Sg.Button('No')]] # Giving the window the variable layout startWindow = Sg.Window('TUF - Turtle Forensics', icon='ICON.ico').Layout(layout) # When all windows are false then startWindow is active treeviewWindow_active = loggingWindow_active = createCaseWindow2_active = createCaseWindow_active = win4_active = \ loggedWindow_active = loginWindow_active = False # When event and values are startWindow then they show that window. while True: ev1, vals1 = startWindow.Read() # If the 'close' button is pushed the program is going to stop with running if ev1 is None:
def Everything_NoContextManager(): form = sg.FlexForm('Everything bagel', auto_size_text=True, default_element_size=(40, 1)) layout = [ [ sg.Text('All graphic widgets in one form!', size=(30, 1), font=("Helvetica", 25)) ], [sg.Text('Here is some text.... and a place to enter text')], [sg.InputText('This is my text')], [ sg.Checkbox('My first checkbox!'), sg.Checkbox('My second checkbox!', default=True) ], [ sg.Radio('My first Radio! ', "RADIO1", default=True), sg.Radio('My second Radio!', "RADIO1") ], [ sg.Multiline( default_text= 'This is the default Text should you decide not to type anything', size=(35, 3)), sg.Multiline(default_text='A second multi-line', size=(35, 3)) ], [ sg.InputCombo(('Combobox 1', 'Combobox 2'), size=(20, 3)), sg.Slider(range=(1, 100), orientation='h', size=(34, 20), default_value=85) ], [ sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'), size=(30, 3)), sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=25), sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=75), sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=10), sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 1') ], [sg.Text('_' * 80)], [sg.Text('Choose A Folder', size=(35, 1))], [ sg.Text('Your Folder', size=(15, 1), auto_size_text=False, justification='right'), sg.InputText('Default Folder'), sg.FolderBrowse() ], [ sg.Submit(), sg.Cancel(), sg.SimpleButton('Customized', button_color=('white', '#7E6C92')) ] ] button, values = form.LayoutAndRead(layout) del (form) sg.MsgBox('Title', 'The results of the form.', 'The button clicked was "{}"'.format(button), 'The values are', values)
layout = [ [ sg.Text('Android Logs, Events, And Protobuf Parser', font=("Helvetica", 22)) ], [sg.Text('https://github.com/abrignoni/ALEAPP', font=("Helvetica", 14))], [ sg.Frame( layout=[[ sg.Input(size=(97, 1)), sg.FileBrowse(font=normal_font, button_text='Browse File', key='INPUTFILEBROWSE'), sg.FolderBrowse(font=normal_font, button_text='Browse Folder', target=(sg.ThisRow, -2), key='INPUTFOLDERBROWSE') ]], title= 'Select a file (tar/zip/gz) or directory of the target Android full file system extraction for parsing:' ) ], [ sg.Frame(layout=[[ sg.Input(size=(112, 1)), sg.FolderBrowse(font=normal_font, button_text='Browse Folder') ]], title='Select Output Folder:') ], [sg.Text('Available Modules')], [sg.Button('SELECT ALL'), sg.Button('DESELECT ALL')],