예제 #1
0
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)
예제 #2
0
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
예제 #4
0

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')
예제 #5
0
    [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)      
예제 #6
0
    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")
예제 #8
0
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
예제 #11
0
#     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":
예제 #12
0
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)
예제 #13
0
            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")]]
예제 #14
0
파일: gui.py 프로젝트: sonipta/test
 [
     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")]]
예제 #15
0
             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)
예제 #16
0
            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))],
           [
예제 #17
0
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)
        ]
    ]
예제 #18
0
파일: gui.py 프로젝트: DeeeFOX/dirutility
    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
예제 #19
0
        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 = []
예제 #20
0
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()
예제 #22
0
    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
예제 #23
0
    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
예제 #24
0
    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()
예제 #25
0
# 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)
예제 #26
0
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()
예제 #27
0
    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()
예제 #28
0
파일: main.py 프로젝트: Matthijz98/TUF
# 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:
예제 #29
0
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)
예제 #30
0
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')],