def create_settings_window(settings): sg.theme(settings['color_theme']) def TextLabel(text): return sg.Text(text+':', justification='r', size=(25,1)) layout = [ [sg.Text('Settings', font=('Work Sans', 12))], [TextLabel('Track Hedge Address(es)'),sg.Input(key='-ADDR-')], [TextLabel('Coordinate System'), sg.Combo(COORD_SYS_CHOICES, key='-COORD_SYS-')], [TextLabel('Units'), sg.Combo(UNITS_CHOICES, key='-UNITS-')], [TextLabel('Precision'), sg.Combo(PREC_CHOICES, key='-PREC-')], [TextLabel('Refresh Rate (ms)'), sg.Input(key='-FREQ-')], [TextLabel('Logfile Folder'),sg.Input(key='-LOGDIR-'), sg.FolderBrowse(target='-LOGDIR-')], [TextLabel('Number of position values to average'),sg.Input(key='-NUMLINES-')], [TextLabel('Time until log considered stale (ms)'), sg.Input(key='-ALLOW_DELTA_T-')], [TextLabel('Color Theme'),sg.Combo(sg.theme_list(), key='-THEME-')], [sg.Button('Save'), sg.Button('Restore Defaults'), sg.Button('Exit')] ] window = sg.Window('Settings', layout, keep_on_top=True, finalize=True) for key in SETTINGS_KEYS_TO_ELEMENT_KEYS: # update window with the values read from settings file try: window[SETTINGS_KEYS_TO_ELEMENT_KEYS[key]].update(value=settings[key]) except Exception as e: print(f'Problem updating PySimpleGUI window from settings. Key = {key}') return window
def init_gui(): global window global adapters global values sg.theme("Reddit") layout_frame = [ [sg.Checkbox("DHCP", key="DHCP", enable_events=True)], [sg.Text("")], [sg.Text("IP: ", size=(15, 1)), sg.Input(size=(15, 1), key="IP")], [sg.Text("Sub: ", size=(15, 1)), sg.Input(size=(15, 1), key="SUB")], [ sg.Text("Gateway: ", size=(15, 1)), sg.Input(size=(15, 1), key="GATE") ], ] layout = [[ sg.Combo(adapters, enable_events=True, key="DROP", readonly=True), ], [ sg.Frame( "Network", layout_frame, ), ], [sg.Button("Update", size=(15, 1), key="UPDATE")]] window = sg.Window("IP", layout, icon="favicon.png") window.read(1) update_text(window, 0)
def create_conf_window(parser): sg.theme(parser.get('gui_settings','theme')) def TextLabel(text): return sg.Text(text+':', justification='r', size=(25,1)) layout = [ [sg.Text('Choose Configuration', font = 'Any 20', justification='c')], [sg.Text('')], [TextLabel('Output Directory'), sg.Input(key='-OUTDIR-'), sg.FolderBrowse(target='-OUTDIR-')], [TextLabel('FASTQ Files Directory'), sg.Input(key='-FASTQ-'), sg.FolderBrowse(target='-FASTQ-')], [TextLabel('Spectra Files Directory'), sg.Input(key='-SPECTRA-'), sg.FolderBrowse(target='-SPECTRA-')], [sg.Text('')], [TextLabel('Trinity'), sg.Input(key='-TRINITY-'), sg.FileBrowse(target='-TRINITY-')], [TextLabel('hg19'), sg.Input(key='-HG19-'), sg.FileBrowse(target='-HG19-')], [TextLabel('SearchGUI'), sg.Input(key='-SEARCHGUI-'), sg.FileBrowse(target='-SEARCHGUI-')], [TextLabel('PeptideShaker'), sg.Input(key='-PEPTIDE-'), sg.FileBrowse(target='-PEPTIDE-')], [TextLabel('ACTG'), sg.Input(key='-ACTG-'), sg.FolderBrowse(target='-ACTG-')], [sg.Text('')], [TextLabel('Transcriptome GTF'), sg.Input(key='-GTF-'), sg.FolderBrowse(target='-GTF-')], [TextLabel('Reference genome'), sg.Input(key='-REF-'), sg.FolderBrowse(target='-REF-')], [TextLabel('Mapping Method'), sg.Combo(['PV','PS','VO','SO'],key='-MAP-')], [TextLabel('Protein Database'), sg.Input(key='-DB-'), sg.FileBrowse(target='-DB-')], [TextLabel('Serialization File'), sg.Input(key='-SER-'), sg.FileBrowse(target='-SER-')], [sg.Text('')], [TextLabel('Bamstats'), sg.Input(key='-BAMSTATS-'), sg.FileBrowse(target='-BAMSTATS-')], [TextLabel('BAM Files'), sg.Input(key='-BAM-'), sg.FolderBrowse(target='-BAM-')], [TextLabel('BED File'), sg.Input(key='-BED-'), sg.FileBrowse(target='-BED-')], [sg.Text('')], [TextLabel('DeNoPro Location'), sg.Input(key='-DENOPRO-'), sg.FolderBrowse(target='-DENOPRO-')], [sg.Text('')], [TextLabel('Theme'), sg.Combo(sg.theme_list(), size=(17, 0.8), key='-THEME-')], [sg.Text('')], [sg.Text('')], [sg.Button('Save'), sg.InputText('', do_not_clear=False, visible=False, key='-filename-',enable_events=True), sg.FileSaveAs('Save As'),sg.Button('Exit')] ] window = sg.Window("Config", keep_on_top=True).Layout([[sg.Column(layout,size = (680,720),scrollable=True)]]).Finalize() for k,v in conf_keys.items(): try: window[conf_keys[k][2]].update(value=parser.get(v[0],k)) except Exception as e: print(f'Problem updating GUI window from config. Key = {k}') return window
def _layout_(config): import PySimpleGUIQt as qt struct = [[qt.Menu(_top_menu_())], [qt.Text('Welcome to Test API!')], [qt.Combo(['Living Room', 'Playroom'])], [qt.Frame('', _sense_frame_(config))], [qt.Frame('', list(_button_frame_()))]] return struct
def form_frame(): _layout = [[ qt.Text('Look & Feel: '), qt.Combo(qt.theme_list(), enable_events=True, key='look_and_feel_combo') ]] _frame = qt.Frame('Settings', _layout) return _frame
def main(): sg.ChangeLookAndFeel('GreenTan') # sg.SetOptions(element_padding=(0,0)) # ------ Menu Definition ------ # menu_def = [ ['&File', ['&Open', '&Save', '&Properties', 'E&xit']], [ '&Edit', ['&Paste', [ 'Special', 'Normal', ], 'Undo'], ], ['&Toolbar', ['Command &1', 'Command &2', 'Command &3', 'Command &4']], ['&Help', '&About...'], ] treedata = sg.TreeData() treedata.Insert( "", '_A_', 'Tree Item 1', [1, 2, 3], ) treedata.Insert( "", '_B_', 'B', [4, 5, 6], ) treedata.Insert( "_A_", '_A1_', 'Sub Item 1', ['can', 'be', 'anything'], ) treedata.Insert( "", '_C_', 'C', [], ) treedata.Insert( "_C_", '_C1_', 'C1', ['or'], ) treedata.Insert("_A_", '_A2_', 'Sub Item 2', [None, None]) treedata.Insert("_A1_", '_A3_', 'A30', ['getting deep']) treedata.Insert("_C_", '_C2_', 'C2', ['nothing', 'at', 'all']) for i in range(100): treedata.Insert('_C_', i, i, []) frame1 = [ [sg.Input('Input Text', size=(250, 35)), sg.Stretch()], [ sg.Multiline(size=(250, 75), default_text='Multiline Input'), sg.MultilineOutput(size=(250, 75), default_text='Multiline Output') ], ] frame2 = [ [sg.Listbox(['Listbox 1', 'Listbox 2', 'Listbox 3'], size=(200, 85))], [ sg.Combo(['Combo item 1', 'Combo item 2', 'Combo item 3'], size=(200, 35)) ], [sg.Spin([1, 2, 3], size=(40, 30))], ] frame3 = [ [sg.Checkbox('Checkbox1', True), sg.Checkbox('Checkbox1')], [ sg.Radio('Radio Button1', 1), sg.Radio('Radio Button2', 1, default=True), sg.Stretch() ], ] frame4 = [ [ sg.Slider(range=(0, 100), orientation='v', size=(3, 30), default_value=40), sg.Dial(range=(0, 100), tick_interval=50, size=(150, 150), default_value=40), sg.Stretch() ], ] matrix = [[str(x * y) for x in range(4)] for y in range(3)] frame5 = [ [ sg.Table(values=matrix, max_col_width=25, auto_size_columns=True, display_row_numbers=True, change_submits=False, bind_return_key=True, justification='right', num_rows=8, alternating_row_color='lightblue', key='_table_', text_color='black'), sg.Tree(data=treedata, headings=['col1', 'col2', 'col3'], change_submits=True, auto_size_columns=True, num_rows=10, col0_width=10, key='_TREE_', show_expanded=True, size=(200, 150)), sg.Stretch() ], ] graph_elem = sg.Graph((880, 150), (0, 0), (600, 300), key='+GRAPH+') frame6 = [ [graph_elem, sg.Stretch()], ] tab1 = sg.Tab('Graph Number 1', frame6) tab2 = sg.Tab('Graph Number 2', [[]]) layout = [ [sg.Menu(menu_def)], [ sg.Image(data_base64=logo), sg.Frame('Input Text Group', frame1, title_color='red'), sg.Stretch() ], [ sg.Frame('Multiple Choice Group', frame2, title_color='green'), sg.Frame('Binary Choice Group', frame3, title_color='purple'), sg.Frame('Variable Choice Group', frame4, title_color='blue'), sg.Stretch() ], [ sg.Frame('Structured Data Group', frame5, title_color='red'), ], # [sg.Frame('Graphing Group', frame6)], [sg.TabGroup([[tab1, tab2]])], [ sg.ProgressBar(max_value=600, start_value=400, size=(600, 25), key='+PROGRESS+'), sg.Stretch(), sg.ButtonMenu('&Menu', ['Menu', ['&Pause Graph', 'Menu item']], key='_MENU_'), sg.Button('Button'), sg.Button('Exit') ], ] window = sg.Window('Window Title', font=('Helvetica', 13), default_button_element_size=(100, 30), auto_size_buttons=False, default_element_size=(200, 22)).Layout(layout).Finalize() graph_elem.DrawCircle((200, 200), 50, 'blue') i = 0 graph_paused = False while True: # Event Loop # sg.TimerStart() event, values = window.Read(timeout=0) if event is None or event == 'Exit': break if event == 'Button': print(event, values) if values['_MENU_'] == 'Pause Graph': graph_paused = not graph_paused if not graph_paused: i += 1 if i >= 600: graph_elem.Move(-1, 0) graph_elem.DrawLine((i, 0), (i, randint(0, 300)), width=1, color='#{:06x}'.format(randint(0, 0xffffff))) window.FindElement('+PROGRESS+').UpdateBar(i % 600) # sg.TimerStop() window.Close()
def welcome_layout(): frame_1 = [ [sg.Text('Balança: ')], [sg.Combo(['Nenhuma', 'Toledo', 'Filizola', 'Urano'], font=("verdana", 11), key="balance_name", enable_events=True, size=(13, 0.8))], [sg.Text('Porta Serial: ')], [sg.Combo(get_serial_names(), font=("verdana", 13), key="serial_port", size=(13, 0.8))], [sg.Text('Baud Rate: ')], [sg.Combo([2400, 4800, 9600, 14400, 19200, 38400, 56000, 57600], font=("verdana", 11), key="baudrate", size=(13, 0.8))], [sg.Text('Data Bits: ')], [sg.Combo([5, 6, 7, 8], font=("verdana", 11), key="data_bits", size=(13, 0.8))], [sg.Text('Parity: ')], [sg.Combo(['none', 'odd', 'even', 'mark', 'space'], font=("verdana", 11), key="parity", size=(13, 0.8))], [sg.Text('Stop Bits:')], [sg.Combo([1, 1.5, 2], font=("verdana", 11), key="stop_bits", pad=[1, 0], size=(13, 0.8))], [sg.Text('Handshaking: ')], [sg.Combo(['Nenhum', 'XON/XOFF', 'RTS/CTS', 'DTR/DSR'], font=("verdana", 11), key="handshaking", pad=[1, 0], size=(13, 0.8))] ] frame_2 = [ [sg.Text('')], [sg.Input(get_last_weight(), do_not_clear=True, size=(25, 0.8), tooltip='Último Peso Lido', disabled=True, key='last_weight'), sg.Text(' '), sg.Input('1', do_not_clear=True, size=(15, 0.8), tooltip='Timeout', key='timeout'), sg.Stretch()], [sg.Text('')], [sg.Text('Última Resposta: ')], [sg.Multiline(size=(41.5, 8.6), key='Textbox', disabled=True)], [sg.Text('Pesagem Apurada: ')], [sg.Multiline(size=(41.5, 4.6), default_text=get_last_weight() + ' KG', font=('Helvetica Bold', 48), key='Textbox2', disabled=True)], [sg.Text('')], [sg.Text('')], [sg.Text('')], ] frame_3 = [ [sg.Text('')], [sg.Text(''), sg.Text(' ' * 2), sg.Button('Ativar', size=[14, 0.8], button_color=('white', '#082567'), key="activate"), sg.Text(''), sg.Text('')], [sg.Text('')], [sg.Text(''), sg.Text(' ' * 2), sg.Button('Desativar', size=[14, 0.8], button_color=('white', '#082567'), key="deactivate", disabled=True), sg.Text(''), sg.Text('')], [sg.Text('')], [sg.Text(''), sg.Text(' ' * 2), sg.Button('Ler Peso', size=[14, 0.8], button_color=('white', '#082567'), key="weight_read"), sg.Text(''), sg.Text('')], [sg.Text('')], [sg.Text(''), sg.Text(' ' * 2), sg.Button('Localizar Portas', size=[14, 0.8], button_color=('white', '#082567'), key="find_ports"), sg.Text(''), sg.Text('')], [sg.Text('')], [sg.Text(''), sg.Text(' ' * 2), sg.Button('Limpar', size=[14, 0.8], button_color=('white', '#082567'), key="clean"), sg.Text(''), sg.Text('')], [sg.Text('')], [sg.Text(''), sg.Text(' ' * 2), sg.Button('Sair', size=[14, 0.8], button_color=('white', '#082567'), key="exit"), sg.Text(''), sg.Text('')], [sg.Text('')], ] layout_1 = [ [sg.Text('')], [sg.Text(' '), sg.Frame('Ajustes Técnicos', frame_1, title_color='black', element_justification="l", key='frame_1'), sg.Text(' '), sg.Frame('Visualização de dados', frame_2, title_color='black', element_justification="c", key='frame_2'), sg.Text(' '), sg.Frame('Serviços', frame_3, title_color='black', element_justification="r", key='frame_3'), sg.Stretch()], [sg.Text(f'Versão: {__version__} by {__author__}', text_color="black", font=("verdana", 8)), sg.Text(get_current_date(), justification="right", text_color="black", key="clock", font=("verdana", 8)) ], ] return layout_1
# Application Layout sg.theme('Default') # HTTP Frame Layout http_frame = [ sg.Frame( 'HTTP Parameters', layout=[[ sg.Text('URL :', size=(15, 1)), sg.InputText(enable_events=True, key='url') ], [ sg.Text('Request type: ', size=(15, 1)), sg.Combo(values=['GET', 'POST'], default_value='GET', readonly=True, auto_size_text=True, enable_events=True, key='http_request') ], [ sg.Frame( 'Data', layout=[[ sg.Text('Cover data', size=(8, 1)), sg.Input(key='http_cover'), sg.FileBrowse() ], [ sg.Text('Secret data', size=(8, 1)), sg.Input(key='http_secret'), sg.FileBrowse()
def main(): sg.theme('SystemDefaultForReal') main_window = None command_to_run = 'denopro ' layout = [ [sg.Text('DeNoPro : de novo Proteogenomics Pipeline', justification='c', font=('Any',22))], [sg.Text('')], [sg.Text('Mode : ', size=(10,1), justification='r'), sg.Combo(['assemble','searchdb','identify','novelorf', 'quantify'],key='mode'), sg.Text('CPU:', justification='r'), sg.Input(key='cpu',font = 'Any 10', size=(5,0.8)), sg.Text('Max mem:', size=(10,1), justification='r'), sg.Input(key='max_mem', font = 'Any 10', size=(5,0.8))], [sg.Text('Config : ', size=(9,1), justification='r'), sg.Input(key='-config-', enable_events=True), sg.FileBrowse('Select',target='-config-',size = (10,0.8),file_types=(('Config Files','*.conf'),('INI files','*.ini'))), sg.Button('Change Configuration', size=(22,0.8))], [sg.Text('')], #output [sg.Text('Final Command:')], [sg.Text(size=(90,3),key='command_line', text_color='red',font='Courier 8')], [sg.Output(size=(90,16), font='Courier 10', key='-ML-')], [sg.Button('Start', button_color=('white','green')), sg.Button('Exit', button_color=('white','#8a2815'))] ] main_window = sg.Window('DeNoGUI', layout, font = 'Helvetica 12', finalize=True) while True: event,values = main_window.read() # define exit if event in (sg.WIN_CLOSED, 'Exit'): break # Config Loop if event == 'Change Configuration': # set the main config (if called) if values['-config-']: chosenConfig = values['-config-'] parser = load_parser(chosenConfig) event,values = create_conf_window(parser).read(close=True) if event == 'Save': save_config(chosenConfig,parser,values) elif event == '-filename-': filename = values['-filename-'] save_config(filename,parser,values) else: sg.popup('No config file selected, will create one for you...') createdParser = create_parser(default_conf) createdParser.set('gui_settings','theme','SystemDefaultForReal') event,values = create_conf_window(createdParser).read(close=True) if event == 'Save': sg.popup('Please Save As a new file.') elif event == '-filename-': filename = values['-filename-'] save_config(filename,createdParser,values) # Main Loop if event == 'Start': params = '' params += f"{values['mode']} -c {values['-config-']}" if values['mode'] == 'assemble': params += f" --cpu {values['cpu']} --max_mem {values['max_mem']}G" command = command_to_run + params main_window['command_line'].update(command) runCommand(cmd = command, window=main_window) main_window.close()
], [ sg.Text('Input something here'), sg.Stretch(), sg.Input('This is an InputText Element', key='_INPUT_', font=('Any', 14)) ], [ sg.Text('This is the new Dial Element'), sg.Dial(background_color='red'), sg.Stretch() ], [ sg.Combo(['Combo 1', 'Combo 2', 'Combo 3'], key='+COMBO+', size=(150, 30), text_color='green') ], [ sg.Listbox(['Listbox Item 1', 'Listbox Item 2', 'Listbox Item 3'], key='+LIST+', size=(200, 150), text_color='blue'), sg.Slider((1, 100), orientation='v', key='+SLIDER 1+') ], [ sg.Slider((1, 10), size=(200, 30), orientation='h', key='+SLIDER 2+'), sg.Stretch() ], [ sg.Checkbox('Checkbox 1', key='+CB1+'),
def main(): # set program theme theme_name = 'DarkPurple4' sg.theme(theme_name) os.system('color') # define default values for UI default_size_text = (30, 1) default_size_input = (50, 1) default_size_input_with_button = ((30, 1), (15, 1)) # define file handeling modes for song duplicates dupli_mode = { 'radio_move': 'Move when in other list', 'radio_copy': 'Copy when in other list', 'radio_download': 'Download again' } # create progress bars and their labels progresses = [(sg.Text(f'ProgBar {key}: None', key=f'-{key}_text', visible=False), sg.ProgressBar(100, key=f'-{key}_progressbar', visible=False)) for key in range(1, 51)] # make layout layout = [[ sg.Text('Username: '******'', key='username_input', enable_events=True), sg.Button('Check', key='username_button') ], [ sg.Text('Anime Music Dir: '), sg.Input(ml.library_dir, key='dir_input', disabled=True, enable_events=True), sg.FolderBrowse(initial_folder=ml.get_default_dir(), key='dir_browse') ], [ sg.Radio(dupli_mode[key], group_id='dupli', key=key, enable_events=True) for i, key in enumerate(dupli_mode) ], [ sg.Text('Thread count: '), sg.Combo(list(range(1, 51)), default_value=1, key='thread_count_combo', enable_events=True) ], [ sg.Column(progresses, scrollable=True, key='progresses_column', size=(700, 200)) ], [sg.Button('Download', key='download_button')], [sg.Button('', visible=False, key='--PROGRESS_UPDATE--')]] to_disable = [ 'download_button', 'username_input', 'username_button', 'dir_input', 'dir_browse', 'radio_move', 'radio_copy', 'radio_download' ] # make window window = sg.Window("MalMuzic", layout, finalize=True, resizable=False) # for x in range(50): # progresses[x][1].UpdateBar(50) # set default values to UI layout[2][0].update(value=True) # set more variables input_default_color = sg.LOOK_AND_FEEL_TABLE[theme_name]['INPUT'] run_thread_running = False run_thread: Tuple[Event, Thread] = None # type: ignore to_close = False # helper function for main def check_username(): print(f'[I] Looking for mal user "{values["username_input"]}"') exists = mm.user_exists(values["username_input"]) print('[I] Username exists' if exists else '[I] Username doesn\'t exists') if not exists: window['username_input'].update(background_color='#FF7777') else: window['username_input'].update( background_color=input_default_color) return exists def get_dupli_mode(): for i, key in enumerate(dupli_mode): if window[key].get(): return i # UI loop while not to_close: event, values = window.read() # type: ignore if event == sg.WIN_CLOSED or event is None: to_close = True if run_thread is not None: run_thread[0].set() continue # print('[I]', event, values[event] if event in values else '') if event == 'username_button': check_username() if event == 'download_button': if not run_thread_running: print('[I] Checking username') if not check_username(): continue ml.library_dir = values['dir_input'] window['download_button']( text=window['download_button'].ButtonText + ' Disabled') for dis in to_disable: window[dis](disabled=True) run_thread = run(window, values["username_input"], progresses, window['progresses_column'], dir=ml.library_dir, thread_count=values['thread_count_combo']) else: cprint('[E] Download already running', 'red') if event == 'thread_count_combo': print(f'[I] User choose {values[event]} threads to run async') if event in dupli_mode: print(f'[I] User choose: "{dupli_mode[event]}"') if event == '--PROGRESS_UPDATE--': # progresses[values[event][0]][1].UpdateBar(values[event][2]) for i in range(len(st.threads)): if st.threads[i] is not None: if hasattr(st.threads[i][1], 'percent'): progresses[i][1].UpdateBar(st.threads[i][1].percent) progresses[i][0].update( value=st.threads[i][1].request + ': ' + str(st.threads[i][1].total_kb) + 'kB, ' + str(round(st.threads[i][1].rate, 1)) + 'kB/s') if run_thread is not None: print('[I] Download thread still running, joining with it.') run_thread[1].join() window.close() print('[!] Exiting program')
text_color='red') ], [sg.Text('Single Line Input', size=(200, 35)), sg.Input(size=(200, 25))], [ sg.Text('Multi Line\nInput/Output', size=(200, 60)), sg.Multiline(size=(200, 75)) ], [ sg.Text('ListBox', size=(200, 35)), sg.Listbox(['Listbox 1', 'Listbox 2', 'Listbox 3'], size=(200, 85)) ], [ sg.Text('ComboBox / Dropdown', size=(200, 25)), sg.Combo([ 'Combo item 1', ], size=(200, 35)) ], [sg.Text('Spinner', size=(200, 35)), sg.Spin([1, 2, 3], size=(40, 30))], [ sg.Text('Checkbox', size=(200, 35)), sg.Checkbox('Checkbox', change_submits=True) ], [sg.Text('RadioButton', size=(200, 35)), sg.Radio('Radio Button', 1)], [sg.Text('Slider', size=(200, 35)), sg.Slider(orientation='h')], [sg.Text('Button', size=(200, 35)), sg.Button('Button')], [sg.Text('Table', size=(200, 35)), sg.Table([[0, 1, 3, 4]])], [
def openGUI(mode): # Define URL as global so we can change the value in the updater thread too global URL # Path to loginusers.vdf file which contains list of all Steam accounts on PC steamUsers = get_reg(r"SteamPath", REG_STEAM) + "/config/loginusers.vdf" # Extract the currently used profile from the windows registry (if it exists) defaultProfile = get_reg(r"SteamUser", REG_AMONG_US) # Dictionary which will store Steam Alias & ID used for config directory path userKey = {} # Array containing a list of all Steam Aliases - Used to lookup above dictionary userVal = [] # Set the overall theme of the window to "Dark Blue" sg.theme('DarkBlue') # Open the config file that contains list of all Steam accounts and extract required info with open(steamUsers) as f: lines = f.readlines() i = 0 for line in lines: if "PersonaName" in line: userKey[(line.replace('\t\t"PersonaName"\t\t', '').replace('"','').replace('\n', ''))] = int(lines[i - 3].replace('\t','').replace('"', '')) - STEAMID64 userVal.append(line.replace('\t\t"PersonaName"\t\t', '').replace('"','').replace('\n', '')) i += 1 # Define the layout of our GUI and the conditions required layout = [ [sg.Text("Steam Profile to use:")], [sg.Combo(userVal, default_value=defaultProfile, enable_events=True, key='-PROFILE-', readonly=True, size=(30,1), disabled=True if mode == "BACKGROUND" else False)], [sg.Text(size=(30,0.5))], [sg.Text("REST Endpoint to upload Statistics to:")], [sg.In(URL, size=(30, 1), enable_events=True, key="-REST-")], [sg.Button('Test Endpoint',size=(10,1), disabled=True, button_color=('grey', 'lightgrey')),sg.Text(key="-STATUS-")], [sg.Text(size=(30,0.5))], [sg.Button('Apply' if mode == "BACKGROUND" else "Install"), sg.Button('Close' if mode == 'BACKGROUND' else 'Exit')] ] layoutPopup = [ [sg.Text('Steam will be closed while\nchanges are made.\n\nWould you like to continue?\n')], [sg.Button('Yes'), sg.Button('No')] ] layoutPopup2 = [ [sg.Text('You can now play Among us as normal.\n\nClick OK to exit setup.')], [sg.Button('OK')] ] # Create the window window = sg.Window(APP_NAME, layout, auto_size_buttons=True, resizable=False, disable_close=False, disable_minimize=True, icon=ICON) # Create an event loop while True: event, values = window.read() # If Exit/Close or the X are pressed, exit the GUI loop if event == "Exit" or event == "Close" or event == sg.WIN_CLOSED: break # If any change is detected to the Steam Profile dropdown, re-enable the Install button if event == "-PROFILE-": window['Install' if mode == 'INTERACTIVE' else 'Apply'].update(disabled=False) window['Install' if mode == 'INTERACTIVE' else 'Apply'].update(button_color=('black', 'white')) # If the Test Endpoint button is pressed, Disable button & ping endpoint. if event == "Test Endpoint": window['Test Endpoint'].update(disabled=True) window['Test Endpoint'].update(button_color=('grey', 'lightgrey')) try: response = requests.post(values['-REST-']) if response.status_code == 200: window['-STATUS-'].update('Success', text_color='green') else: window['-STATUS-'].update('Failed', text_color='red') except requests.exceptions.RequestException as e: log('The following error occured while trying to test the REST Endpoint:') log(values['-REST-']) log(e) # If change detected to the -REST- string then re-enable install & test buttons if event == "-REST-": window['Test Endpoint'].update(disabled=False) window['Test Endpoint'].update(button_color=('black', 'white')) window['Install' if mode == 'INTERACTIVE' else 'Apply'].update(disabled=False) window['Install' if mode == 'INTERACTIVE' else 'Apply'].update(button_color=('black', 'white')) # If Install/Update selected then update all relevant values to registry if event == "Install" or event == "Apply": steamOpen = False # Disable Install/Update button to stop spam window['Install' if mode == 'INTERACTIVE' else 'Apply'].update(disabled=True) window['Install' if mode == 'INTERACTIVE' else 'Apply'].update(button_color=('grey', 'lightgrey')) # If Steam is running and application running in interactive mode, close it first if mode == "INTERACTIVE" and process_running(STEAM_EXE): warningPopup = sg.Window("Alert!", layoutPopup, auto_size_buttons=True, resizable=False, disable_close=False, disable_minimize=True, icon=ICON) closeSteam = warningPopup.read() warningPopup.close() if closeSteam[0] == 'Yes': subprocess.call(["TASKKILL","/F","/IM",STEAM_EXE], shell=True) time.sleep(2) steamOpen = True else: continue set_reg(r"Install Path", APP_EXE, REG_AMONG_US) set_reg(r"SteamUser", values['-PROFILE-'], REG_AMONG_US) set_reg(r"SteamDir", str(userKey[values['-PROFILE-']]), REG_AMONG_US) set_reg(r"REST Endpoint", values['-REST-'], REG_AMONG_US) set_reg(r"Version", VERSION, REG_AMONG_US) URL = values['-REST-'] updateConfig(STEAM_CONFIG_PATH.format(userKey[values['-PROFILE-']])) if mode == "INTERACTIVE": sg.Window("Script has been Installed!", layoutPopup2, auto_size_buttons=True, resizable=False, disable_close=False, disable_minimize=True, icon=ICON).read() if steamOpen: subprocess.Popen(STEAM_EXE_PATH) break else: sg.popup("Settings have been successfully applied.") window.close()