def make_window(): config = get_config() message = config["EMAIL"]["message"] adress = config["EMAIL"]["adress"] server = config["EMAIL"]["server"] port = config["EMAIL"]["port"] username = config["EMAIL"]["username"] password = config["EMAIL"]["password"] delivery_link = config["EMAIL"]["delivery_link"] navigator_column = [ [ sg.Col([[ sg.Text("General", enable_events=True, key="-general-", pad=((20, 5), (5, 5))), ]], expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.Text("JSON/Ads", enable_events=True, key="-json-", pad=((20, 5), (5, 5))), ]], expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.Text("Email", background_color="darkgrey", enable_events=True, key="-email-", pad=((20, 5), (5, 5))), ]], background_color="darkgrey", expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.Text("After Effects", enable_events=True, key="-AE-", pad=((20, 5), (5, 5))), ]], expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.Text("Server Incoming", size=(20, 1), enable_events=True, key="-incoming-", pad=((20, 5), (10, 5))), ]], expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.Text("Server delivery", enable_events=True, key="-delivery-", pad=((20, 5), (5, 5))), ]], expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.B('Back', pad=((20, 10), (250, 0)), button_color=("white", "black")) ]], expand_x=True, pad=((0, 0), (0, 20))), ], ] def create_Text(txt): return sg.T(txt, background_color="black", text_color="white") info_column = [[ sg.T("Available Varaibales:"), sg.Column([[ create_Text("FirstName"), create_Text("LastName"), create_Text("FileLink") ], [create_Text("ExpiryDate"), create_Text("Reference")]], pad=((0, 0), (5, 0)), vertical_alignment="t"), ], [sg.Text("Mesage:")], [sg.Multiline( message, key="message", size=(52, 10), )], [ sg.T("Email Adress:", pad=((27, 5), (10, 10))), sg.I(adress, key="adress", size=(37, 1)) ], [ sg.T("SMTP server:", pad=((27, 5), (10, 10))), sg.I(server, key="server", size=(20, 1)), sg.T("Port:"), sg.I(port, key="port", size=(9, 1)) ], [ sg.T("SMTP Username:"******"username", size=(38, 1)) ], [ sg.T("SMTP Passord:", pad=((18, 5), (10, 10))), sg.I(password, key="password", size=(38, 1), password_char="*") ], [ sg.T("Delivery Path:", pad=((15, 5), (10, 10))), sg.I(delivery_link, key="delivery_link", size=(38, 1)) ], [sg.Text(pad=((405, 5), (20)))], [sg.B("save", pad=((350, 0), (20, 0)))]] # ----- Full layout ----- layout = [[ sg.Column(navigator_column, vertical_alignment="t", pad=((0, ), (15, 5))), sg.VSeperator(pad=( (0, 0), (0, 0), ), color="black"), sg.Column(info_column, vertical_alignment="t", pad=((30, 5), (15, 5))), ]] # Create the window window = sg.Window("Settings", layout, margins=(0, 0), icon=apg_logo) return window
def make_window(): config = get_config() logo = config["APP"]['logo'] logo = logo if logo else "FILENAME SHOW HERE.jpg" online_availability = config["GENERAL"]["online_availability_duration"] master_availability = config["GENERAL"]["master_availability_duration"] sync_interval = config["GENERAL"]["sync_interval"] navigator_column = [ [ sg.Col([[ sg.Text("General", background_color="darkgrey", enable_events=True, key="-general-", pad=((20, 5), (5, 5))), ]], background_color="darkgrey", expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.Text("JSON/Ads", enable_events=True, key="-json-", pad=((20, 5), (5, 5))), ]], expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.Text("Email", enable_events=True, key="-email-", pad=((20, 5), (5, 5))), ]], expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.Text("After Effects", enable_events=True, key="-AE-", pad=((20, 5), (5, 5))), ]], expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.Text("Server Incoming", size=(20, 1), enable_events=True, key="-incoming-", pad=((20, 5), (10, 5))), ]], expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.Text("Server delivery", enable_events=True, key="-delivery-", pad=((20, 5), (5, 5))), ]], expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.B('Back', pad=((20, 10), (250, 0)), button_color=("white", "black"), highlight_colors=("red", "green"), use_ttk_buttons=False) ]], expand_x=True, pad=((0, 0), (0, 20))), ], ] info_column = [[ sg.Text("Upload Logo: "), sg.Text( logo, key="-logo-", size=(50, 1), ), sg.FileBrowse("Select", ), sg.T(pad=((8, 0))) ], [sg.Text(pad=((405, 5), (0, 170)))], [ sg.Text("Availability of File online:", pad=((10, 5), (5, 5))), sg.I(size=(10, 1), default_text=online_availability), sg.T("Days") ], [ sg.Text("Availability of Master Files:", pad=((0, 5), (5, 5))), sg.I(size=(10, 1), default_text=master_availability), sg.T("Days") ], [ sg.Text("Sync Interval FTP:", pad=((37, 5), (5, 5))), sg.I(size=(10, 1), default_text=sync_interval), sg.T("Minutes") ], [sg.T(pad=((0, 380), (70, 0)))], [sg.B("save", pad=((400, 20), (20, 0)))]] # ----- Full layout ----- layout = [[ sg.Column(navigator_column, vertical_alignment="t", pad=((0, ), (15, 5))), sg.VSeperator(pad=( (0, 0), (0, 0), ), color="black"), sg.Column( info_column, vertical_alignment="t", pad=((40, 0), (15, 5)), ), ]] # Create the window window = sg.Window("Settings", layout, margins=(0, 0), icon=apg_logo) return window
layout, key=key, visible=not collapsed, metadata=arrows)) ]], pad=(0, 0)) SEC1_KEY = '-SECTION1-' SEC2_KEY = '-SECTION2-' section1 = [[sg.Input('Input sec 1', key='-IN1-')], [sg.Input(key='-IN11-')], [ sg.Button('Button section 1', button_color='yellow on green'), sg.Button('Button2 section 1', button_color='yellow on green'), sg.Button('Button3 section 1', button_color='yellow on green') ]] section2 = [[sg.I('Input sec 2', k='-IN2-')], [sg.I(k='-IN21-')], [ sg.B('Button section 2', button_color=('yellow', 'purple')), sg.B('Button2 section 2', button_color=('yellow', 'purple')), sg.B('Button3 section 2', button_color=('yellow', 'purple')) ]] layout = [ [sg.Text('Window with 2 collapsible sections')], [ sg.Checkbox('Blank checkbox'), sg.Checkbox('Hide Section 2', enable_events=True, key='-OPEN SEC2-CHECKBOX-') ], #### Section 1 part ####
], [ sg.T('Status5', size=(12, 1)), sg.Text(CIRCLE_OUTLINE, size=(10, 1), font='Default 18', text_color='green', key='-OUT5-') ], [ sg.Frame('Unicode Converter', [[ sg.T('Enter a Number'), sg.In(size=(6, 1), key='-NUM-'), sg.T('Unicode char: '), sg.I(size=(2, 1), font='Any 18', key='-OUT CHAR-') ], [ sg.T('Enter a Char'), sg.In(size=(2, 1), key='-CHAR-', font='Any 18'), sg.T('Unicode number: '), sg.T(size=(6, 1), key='-OUT NUM-') ]]) ], [ sg.Frame('Display Unicode Characters In Range', [ [ sg.T('Starting Number'), sg.In(size=(6, 1), key='-START-'), sg.T('Ending Number char: '), sg.I(size=(6, 1), key='-END-')
ADD_BUTTON_COLOR = ('white', '#008000') CHANGE_BUTTON_COLOR = ('black', '#ffd700') DELETE_BUTTON_COLOR = ('black', '#ff4040') nutrition_layout = [ [ sg.T('Week', size=NUTRITION_LABEL_SIZE), sg.InputCombo(tuple(), key='-WEEK-', size=NUM_INPUT_SIZE) ], [ sg.T('Food', size=NUTRITION_LABEL_SIZE), sg.InputCombo(tuple(), key='-FOOD-', font=('Any', 9), size=TEXT_INPUT_SIZE) ], [ sg.T('Calories', size=NUTRITION_LABEL_SIZE), sg.I(key='-KCAL-', size=NUM_INPUT_SIZE) ], [ sg.T('Protein', size=NUTRITION_LABEL_SIZE), sg.I(key='-PROTEIN-', size=NUM_INPUT_SIZE) ], [ sg.B( 'Add Food', size=BUTTON_SIZE, button_color=ADD_BUTTON_COLOR, tooltip='Adds a new food to the database, with its calories and protein.' ), sg.B( 'Add Week', size=BUTTON_SIZE,
def GUI(): # Random theme for GUI theme = random.choice(sg.theme_list()) sg.theme(theme) # A touch of color SYMBOL_UP = '▲' SYMBOL_DOWN = '▼' def collapse(layout, key): return sg.pin(sg.Column(layout, key=key)) section_train = [ [ sg.Text('input training raster', size=(15, 1), font=("Helvetica"), auto_size_text=False, justification='left', tooltip="Path for input raster for training"), sg.InputText(), sg.FileBrowse() ], [ sg.Text('train feature', size=(15, 1), font=("Helvetica"), auto_size_text=False, justification='left', tooltip="Path for train feature"), sg.InputText(), sg.FileBrowse() ], [ sg.Text('result path', size=(15, 1), font=("Helvetica"), auto_size_text=False, justification='left', tooltip="Path where to store the trained model"), sg.InputText(), sg.FolderBrowse() ], [ sg.Text('number of trees', font=("Helvetica"), tooltip="Number of trees"), sg.InputText("200", size=(10, 1)) ], [ sg.Text('max depth', font=("Helvetica"), tooltip="Max number of trees depth"), sg.InputText("25", size=(10, 1)) ], [ sg.Text('max numer of samples per class', font=("Helvetica"), tooltip="Max number of samples per class"), sg.InputText("1000", size=(10, 1)) ], ] section_inference = [ [ sg.Text('raster to classify', size=(15, 1), font=("Helvetica"), auto_size_text=False, justification='left', tooltip="the raster you want to classify"), sg.InputText(), sg.FileBrowse() ], [ sg.Text('output raster', size=(15, 1), font=("Helvetica"), auto_size_text=False, justification='left', tooltip="Path to store the classified raster"), sg.InputText(), sg.FileBrowse() ], [ sg.Text( 'model path(optional)', size=(16, 1), font=("Helvetica"), auto_size_text=False, justification='left', tooltip= "Path for trained model, required when result path not provided" ), sg.InputText(), sg.FileBrowse() ], ] section1 = [[sg.Input('Input sec 1', key='-IN1-')], [sg.Input(key='-IN11-')], [ sg.Button('Button section 1', button_color='yellow on green'), sg.Button('Button2 section 1', button_color='yellow on green'), sg.Button('Button3 section 1', button_color='yellow on green') ]] section2 = [[sg.I('Input sec 2', k='-IN2-')], [sg.I(k='-IN21-')], [ sg.B('Button section 2', button_color=('yellow', 'purple')), sg.B('Button2 section 2', button_color=('yellow', 'purple')), sg.B('Button3 section 2', button_color=('yellow', 'purple')) ]] layout = [[ sg.T(SYMBOL_DOWN, enable_events=True, k='-OPEN SEC1-', text_color='yellow'), sg.T('Train', enable_events=True, text_color='yellow', k='-OPEN SEC1-TEXT') ], [collapse(section_train, '-SEC1-')], [ sg.T(SYMBOL_DOWN, enable_events=True, k='-OPEN SEC2-', text_color='purple'), sg.T('Inference', enable_events=True, text_color='purple', k='-OPEN SEC2-TEXT') ], [collapse(section_inference, '-SEC2-')], [ sg.Button('OK', font=("Helvetica", 15), tooltip='Click to submit this window'), sg.Cancel(font=("Helvetica", 15)) ]] window = sg.Window('Random forest classifier for remote sensed data', layout) opened1, opened2 = True, True event = None while True: # Event Loop event, values = window.read() print(event, values) if event == sg.WIN_CLOSED or event == 'Cancel': os._exit(1) elif event == 'OK': break if event.startswith('-OPEN SEC1-'): opened1 = not opened1 window['-OPEN SEC1-'].update(SYMBOL_DOWN if opened1 else SYMBOL_UP) window['-SEC1-'].update(visible=opened1) if event.startswith('-OPEN SEC2-'): opened2 = not opened2 window['-OPEN SEC2-'].update(SYMBOL_DOWN if opened2 else SYMBOL_UP) # window['-OPEN SEC2-CHECKBOX'].update(not opened2) window['-SEC2-'].update(visible=opened2) window.close() return [values[i] for i in values]
def MyInput(key): return sg.I('', size=(3, 1), key=key, pad=(0, 2)) layout = [[sg.T('Your typed chars appear here:'), sg.T('', key='-OUTPUT-')],
def layout(self): üyelersekme = eval(self.üyeTablosu(üyeler, "Üyeler")) ayarlarsekme = [ [ sg.T('Önceki nöbet listelerinin olduğu dizin:'), sg.I(default_text=çlşDiz), sg.FolderBrowse(key="çlşDiz", tooltip="Klasör seçme penceresi açılır", button_text="Klasör Aç") ], [ sg.I( key="yıl", default_text=str(yıl), size=(4, 4), ), sg.T(" yılı "), sg.I( key="ay", default_text=str(ay), size=(2, 4), ), sg.T(" ayı için nöbet oluşturulacak."), ], [ sg.I( key="aralık", default_text=str(self.aralık), size=(1, 4), ), sg.T(' gün aralıkla nöbet verilir') ], [ sg.T('Verilebilecek ek nöbet sayısı: '), sg.I( key="ek", default_text=str(self.ek), size=(1, 4), ) ], ] işlenentablolartab = [[ sg.Multiline(size=(30, 20), key="işlenentablo", autoscroll=True) ]] çıktıtab = [[ sg.Multiline(size=(30, 20), key="çıktı", autoscroll=True) ]] sonuçtab = [[ sg.Multiline(size=(30, 20), key="sonuç", autoscroll=True) ]] eşleşmeyentab = [[ sg.Multiline(size=(30, 20), key="eşleşmeyen", autoscroll=True) ]] sekmegurubu = [ sg.TabGroup([[ sg.Tab('AYARLAR', ayarlarsekme), sg.Tab('ÜYELER', üyelersekme), sg.Tab('İŞLENEN TABLOLAR', işlenentablolartab), sg.Tab('ÇIKTI', çıktıtab), sg.Tab('SONUÇ', sonuçtab), sg.Tab('EŞLEŞMEYEN', eşleşmeyentab), ]]) ] eylembutonları = [sg.B("Tabloları Tara"), sg.B("Yarat"), sg.B("Çıkış")] layout = [sekmegurubu, eylembutonları] return layout
def create_border_options(): """Create layout for the world border tab. Contains all the available options for the modification of the world border. """ logging.debug("Creating world border layout") layout = [[ sg.Frame("Border center", [[ sg.T("X"), sg.I("0", (19, 1), key="border_x"), sg.T("Z"), sg.I("0", (19, 1), key="border_z") ]]) ]] col1_layout = [[ sg.Frame("Border size", [ [ sg.T("Initial size", (8, 1)), sg.I("60000000", (10, 1), key="border_size", justification="right") ], [ sg.T("Final size", (8, 1)), sg.I("60000000", (10, 1), key="border_size_target", justification="right") ], [ sg.T( "Lerp time", (8, 1), tooltip="Seconds until border reaches final size"), sg.I("0", (10, 1), key="border_lerp_time", justification="right") ] ]) ]] col2_layout = [[ sg.T("Damage", (11, 1), tooltip="Damage per block"), sg.Spin([str(x / 10) for x in range(201)], "0.2", size=(7, 1), key="border_damage") ]] col2_layout += [[ sg.T("Safe distance", (11, 1), tooltip="Blocks beyond border"), sg.I("5", (8, 1), key="border_safe_blocks", justification="right") ]] col2_layout += [[ sg.T("Warning time", (11, 1)), sg.I("15", (8, 1), key="border_warn_time", justification="right") ]] col2_layout += [[ sg.T("Warning blocks", (11, 1)), sg.I("5", (8, 1), key="border_warn_blocks", justification="right") ]] layout += [[ sg.Col(col2_layout, pad=(0, 0)), sg.Col(col1_layout, pad=(0, 0)) ]] return layout
radios = Radios(config.get("Settings", "radio_list")) fav_radios = Radios("favourites.dat", remote=False) fav_radios.filter() radios.filter() fav_layout = [[ sg.Col( layout=[[ sg.Col(layout=[[ sg.Frame("Add Radio Station", [[ sg.Col( [ [ sg.T("Name"), sg.I(key="_add_radio_name_", size=(35, 1)), sg.T("Genre"), sg.I(key="_add_radio_genre_", size=(15, 1)), sg.T("Country"), sg.I(key="_add_radio_country_", size=(15, 1)) ], ], justification="r", element_justification="l", expand_x=True, ), ], [ sg.Col([[
else: print( "You either didn't select files or didn't enter result file name!!!\n" ) en = 'English words only.' ar_msa = 'Arabic words without diacritics (Harakat).' punc = 'Remove punctuations and special characters.' layout = [[ sg.Text("Choose folder:", font='Courier 14', auto_size_text=True, size=(22, 1), justification='right'), sg.I(key='-INPUT-', size=(55, 1)), sg.FolderBrowse() ], [ sg.T("Choose output location:", font='Courier 14', auto_size_text=True, size=(22, 1)), sg.I(key='-OUTPUT-', size=(55, 1)), sg.FileSaveAs() ], [ sg.B("Start!", key='-START-', font='Courier 12'), sg.Radio('English', group_id='lang', tooltip=en, key='-ENGLISH-'), sg.Radio('Arabic MSA',
['Über', 'TaRen'], ] def_taren = [ [ sg.T('Ausgabe:'), sg.T('', size=(width_Field, 1)), sg.B('Start', key='-btn-start-') ], [sg.Multiline(size=(2 * width_Field, 20), key='-result-')], ] def_conf = [ [ sg.T('Download Verzeichnis', size=(width_Label, 1)), sg.I(key='-downloads-', size=(width_Field, 1), enable_events=True), sg.FolderBrowse('...') ], # sg.B('...', key='-btn-dir-')], [ sg.T('Dateiendung Film', size=(width_Label, 1)), sg.I(key='-extension-', size=(width_Field, 1)) ], [ sg.T('Name Logfile', size=(width_Label, 1)), sg.I(key='-logfile-', size=(width_Field, 1)) ], [ sg.T('Loggingstring', size=(width_Label, 1)), sg.I(key='-logstring-', size=(width_Field, 1)) ], [
exit() # .d8888b. 888 888 # d88P Y88b 888 888 # Y88b. 888 888 # "Y888b. 888 888 .d88888 .d88b. 888 888 888 888 # "Y88b. 888 888 d88" 888 d88""88b 888 .88P 888 888 # "888 888 888 888 888 888 888 888888K 888 888 # Y88b d88P Y88b 888 Y88b 888 Y88..88P 888 "88b Y88b 888 # "Y8888P" "Y88888 "Y88888 "Y88P" 888 888 "Y88888 sg.Window('Sudoku', [[ sg.Frame('', [[ sg.I(random.randint(1, 9), justification='r', size=(3, 1), key=(frow * 3 + row, fcol * 3 + col)) for col in range(3) ] for row in range(3)]) for fcol in range(3) ] for frow in range(3)] + [[sg.B('Exit')]]).read() exit() # d8888 888 888 d8b # d88888 888 o 888 Y8P # d88P888 888 d8b 888 # d88P 888 .d8888b 888 888 88888b. .d8888b 888 d888b 888 888 88888b. # d88P 888 88K 888 888 888 "88b d88P" 888d88888b888 888 888 "88b # d88P 888 "Y8888b. 888 888 888 888 888 88888P Y88888 888 888 888 # d8888888888 X88 Y88b 888 888 888 Y88b. 8888P Y8888 888 888 888 # d88P 888 88888P' "Y88888 888 888 "Y8888P 888P Y888 888 888 888 # 888
window["_BAR_"].UpdateBar(percent) # Converts MP4 youtube file into MP3 File def convert(video, audio): videoClip = VideoFileClip(video) audioClip = videoClip.audio audioClip.write_audiofile(audio) audioClip.close() videoClip.close() # sg.ChangeLookAndFeel('DarkRed1') # sg.SetGlobalIcon('logo.ico') layout = [[sg.T("Tuby")], [sg.T("URL")], [sg.I(key="_URL_", size=(42, 18))], [sg.T("File Name")], [sg.I(key="_FILE_", size=(42, 18))], [sg.T("Destination")], [sg.FolderBrowse(), sg.I(" ", key="_FOLDER_", size=(34, 18))], [ sg.Radio("MP3", group_id="FORMAT", default=True, key="_FORMAT_"), sg.Radio("MP4", group_id="FORMAT") ], [sg.B("Download", size=(42, 1))], [ sg.ProgressBar(max_value=100, orientation="horizontal", key="_BAR_", size=(36, 25)) ]] window = sg.Window('Tuby',
sg.Input(key='_input_file_', default_text=st.gui_default_input_path), sg.FileBrowse(), sg.VSep(), sg.Input(key='_folder_', default_text=st.gui_default_audio_folder), sg.FolderBrowse() ], # Row 3 - range [ sg.Text(" " * 20), sg.Text('Select spreadsheet range (for Excel files):') ], [ sg.T(" " * 10), sg.T('Column:'), sg.I(default_text="C", size=(2, None), key='_column_', enable_events=True), sg.T('First Row:'), sg.I(default_text='5', size=(4, None), key='_firstrow_', enable_events=True), sg.T('Last Row:'), sg.I(default_text='8', size=(4, None), key='_lastrow_', enable_events=True) ], # Row 4 - file display [ sg.Listbox(values="", size=(54, 10), key="_file_list_"),
def create_main_tab_layout(): """Create layout for the main tab. Contains most common Minecraft options such as version, world name, seed, game mode and difficulty. Datapack selection is bundled in the main tab, and populated from the assets/datapacks folder. """ logging.debug("Creating main tab layout") layout = [[ sg.Frame("Version", [[ sg.T('Minecraft Version', size=(15, 1)), sg.Combo(installed_versions, installed_versions[0], (25, 1), readonly=True, key="main_release") ], [ sg.Radio("Show installed versions", "radio_versions", True, enable_events=True, key="main_installed_versions"), sg.Radio("Show all versions", "radio_versions", False, enable_events=True, key="main_all_versions") ]]) ]] c1_layout = [[ sg.T('World Name', size=(10, 1)), sg.I(size=(21, 1), key="main_name") ]] c1_layout += [[ sg.T('Seed', size=(10, 1), tooltip="Leave blank for random seed"), sg.I("", (21, 1), tooltip="Leave blank for random seed", key="main_seed") ]] c1_layout += [[ sg.T('Difficulty', size=(10, 1)), sg.Combo(difficulties, difficulties[0], (19, 1), readonly=True, key="main_difficulty") ]] c1_layout += [[ sg.T('Game mode', size=(10, 1)), sg.Combo(game_modes, game_modes[0], (19, 1), readonly=True, key="main_game_mode") ]] c2_layout = [[sg.Frame('Weather', create_weather_layout())]] layout += [[ sg.Col(c1_layout, pad=(0, 5)), sg.Col(c2_layout, pad=(0, 0)) ]] layout += [[ sg.Frame('Datapacks', create_datapack_layout(), size=(50, 1)) ]] return layout
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 ***', window=None): 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='', window=None, 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 [] 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, 1), "justification": 'r'} main_layout = [ [ sg.T('xml file', **ralign), sg.I(key='xmlfile', size=(35, 2), change_submits=True), sg.FileBrowse(target='xmlfile') ], [ sg.T('target object name', **ralign), sg.I(key='objname', size=(35, 2), change_submits=True) ], [ sg.T('all object names', **ralign), 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), 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='indent_size '), sg.I('1', size=(5, 1), key='indent_size') ], [ sg.T('Indent char', key='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)'), 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)), sg.I('', key='autotarget_file'), sg.B('copy folder\nfrom input-file', key='copy_xmlfile_btn', size=(10, 2), pad=(0, 0), button_color=('black', 'orange')), sg.FolderBrowse('browse folder...', target='autotarget_file', pad=(0, 0), key='browse_input_file_key') ], [ sg.T('output file name:', pad=(0, 0)), sg.I('untitled_psg.py', key='PSG_OUTPUT_FNAME'), ], ]) ], ] layout = [ [ sg.TabGroup([[ sg.Tab('transpiler', main_layout), sg.Tab('settings', settings_layout) ]]), 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', metadata='Output data') ], ] window = sg.Window('Transpiler', layout, auto_size_buttons=False, default_button_element_size=(10, 1), finalize=True, location=(100, 100)) # ##### # 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(), window, 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(), window, 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 ***!!!***', window=window)) else: # success timers.append( send_board_message(text='*** Done ***', window=window)) 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 ***!!!***', window=window)) else: # success window['psg_ui_output'].update(psg_ui) timers.append( send_board_message(text='*** Done ***', window=window)) 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 ***!!!***', window=window)) else: # success window['psg_ui_output'].update(psg_ui) timers.append( send_board_message(text='*** Done ***', window=window)) 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)) window.close()
def windowInit(): sg.theme('LightBrown1') # sg.theme('HotDogStand') # funny theme # Use Tkinter Agg use_agg('TkAgg') # Layout Definition # cube_layout = # allCubeRows = [[sg.Slider((1,10), key=f"slider_x{i}") for i in range(1,6)]] # first column of a layout function_definition_column = [ [ # FUNCTION sg.Frame( layout=[ [ sg. T("Podaj wzór funkcji wykorzystując następujące zmienne w podanej kolejności:\nx1, x2, x3, x4, x5." ) ], [ sg.Text(f"f({CHAR_XVEC})="), sg.In(size=(30, 1), key="-FUNCTION-"), sg.Checkbox('Zatwierdź funkcję', size=(15, 1), key='-CONFIRM_FUNCTION-', default=False, enable_events=True), sg.B("Test function", key="-TEST_FUNCTION-"), ], ], title='Funkcja', key='function_frame', relief=sg.RELIEF_GROOVE, # GROOVE is normal, nice looking ) ], [ ### CUBE & RESTRICTIONS sg.Frame( layout=[ [ sg.Checkbox('Zatwierdź kostkę', size=(15, 1), key='-CONFIRM_CUBE-', default=False, enable_events=True), ], *[ [ sg.T(f'x{i}: ', key=f'tXNo{i}', font=('Arial', 10, 'bold')), sg.Input( key=f'iMin{i}', size=(5, 1), default_text="-10", tooltip=f'Minimalna wartość zmiennej x{i}'), sg.T(f'{CHAR_LOE} x{i} {CHAR_LOE}', key=f'cubeTextRange_{i}'), sg.Input( key=f'iMax{i}', size=(5, 1), default_text="10", tooltip=f'Maksymalna wartość zmiennej x{i}'), # sg.VSeperator(key=f'vSep_x{i}'), sg. T(f'rozdzielczość x{i}:', key=f'tCubeRng{i}', tooltip= f'Suwakiem ustal generowaną liczbę punktów dla zmiennej x{i}' ), sg.Slider( range=(10, 200), default_value=70, size=(18, 8), orientation='horizontal', font=('Helvetica', 10), tooltip= f'Suwakiem ustal generowaną liczbę punktów dla zmiennej x{i}', key=f'sRes{i}') # sg.CB(f'Zatwierdź ograniczenie x{i}') ] for i in range(1, 6) ], ], title='Kostka', # tooltip = 'Użyj tego pola do ograniczenia zmiennych xi', # relief = sg.RELIEF_SUNKEN ), sg.Frame(layout=[ [ sg.Checkbox('Zatwierdź ograniczenia', size=(20, 1), key='-CONFIRM_RESTRICTIONS-', default=False, enable_events=True), ], *[[ sg.T(f'g{i}({CHAR_XVEC}): '), sg.In(size=(25, 1), key=f"-REST{i}-"), sg.T(f'{CHAR_LOE} 0'), sg.Checkbox('Zatwierdź', key=f'-CONFIRM_REST{i}-', enable_events=True) ] for i in range(1, 6)], ], title='Ograniczenia', tooltip='Użyj tego pola do wprowadzenia ograniczeń', relief=sg.RELIEF_GROOVE), # sg.Frame( # layout=[ # [ # sg.Checkbox('Zatwierdź ograniczenia', size=( # 20, 1), key='-CONFIRM_RESTRICTIONS-', default=False, enable_events=True), # ], # [sg.Listbox(key='lbRest',values=[]),sg.T(f'{CHAR_LOE} 0')], # [sg.In(key='-REST-', size=(30,40)),sg.T(f'{CHAR_LOE} 0')], # [sg.B("Dodaj",key="-addRest-"), sg.B("Usuń",key="-rmRest-")] # ], # title='Ograniczenia', # tooltip='Użyj tego pola do wprowadzenia ograniczeń', # relief=sg.RELIEF_GROOVE # ), ], [sg.Button("Rysuj funkcję", key="-GENERATE-")], [sg.Button("GenerujMockData", key="-GENERATE_MOCK-")], [sg.Output(size=(120, 15), key=keyOfLoggerWindow)], [ # SIMULATION sg.Frame( layout=[ [ sg.In(size=(8, 1), key="mu", default_text="20"), sg.T('<- mu', tooltip='liczba rodziców'), ], [ sg.In(size=(8, 1), key="lambda", default_text="40"), sg.T('<- lambda', tooltip='liczba potomstwa'), ], [ sg.In(size=(8, 1), key="sigma", default_text="0.15"), sg.T('<- sigma', tooltip='parametr mutowalności'), ], [ sg.In(size=(8, 1), key="noEpoch", default_text="5"), sg.T('<- N', tooltip='liczba epok'), ], [ sg.B("Rozpocznij symulację", key="-RUN_SIMULATION-"), ], ], title='Symulacja', key='simulation_frame', relief=sg.RELIEF_GROOVE, # GROOVE is normal, nice looking ) ], ] # second column of layout graph_viewer_column = [ [ sg.T(f"f({CHAR_XVEC})="), sg.I("<Wykres funkcji zostanie umieszczony tutaj>", disabled=True, size=(80, 1), key="function_title") ], [sg.T('Controls1:')], [sg.Canvas(key='-FIGURE_CONTROLS1-')], [sg.T('Figure1:')], [ sg.Column( layout=[[ sg.Canvas( key='-FIGURE1-', # it's important that you set this size size=(600, 300)) ]], background_color='#DAE0E6', pad=(0, 0)) ], [sg.T('Controls2:')], [sg.Canvas(key='-FIGURE_CONTROLS2-')], [sg.T('Figure2:')], [ sg.Column( layout=[[ sg.Canvas( key='-FIGURE2-', # it's important that you set this size size=(600, 300)) ]], background_color='#FFFFFF', pad=(0, 0)) ], ] # Full layout layout = [[ sg.Column(function_definition_column), sg.VSeperator(), sg.Column(graph_viewer_column), ]] # Window definition window = sg.Window( 'Wizualizacja strategii ewolucyjnych', layout, # default_element_size=(30, 2), # font=('Helvetica', ' 10'), # default_button_element_size=(8, 2), finalize=True, # no_titlebar=True, location=(0, 0), # size=(1024, 1080), size=(1920, 1080), resizable=True, # keep_on_top=True, ) # Hide some elements @ start # disable confirming Cube, Restrictions & Generate widgetsToDeactivateAtStart = [ '-CONFIRM_CUBE-', '-CONFIRM_RESTRICTIONS-', '-GENERATE-' ] for widget_label in widgetsToDeactivateAtStart: window.FindElement(widget_label).Update(disabled=True) # disable rows of Cube for i in range(1, 6): # 1, 2, 3, 4, 5 disableCubeRow(i, window) return window
def create_window(settings): max_rows, max_cols = int(settings['rows']), int(settings['cols']) graph_size = int(settings['graph_x_size']), int(settings['graph_y_size']) # Create grid of Graphs with titles graph_layout = [[]] for row in range(max_rows): graph_row = [] for col in range(max_cols): graph = sg.Graph(graph_size, (0,0), DATA_SIZE, key=row*max_cols+col, pad=(0,0)) graph_row += [sg.Frame('', [[sg.T(size=(30,2), key=f'-TITLE-{row*max_cols+col}', font='helvetica 9')],[graph]], pad=(0,0))] graph_layout += [graph_row] if settings.get('data source','confirmed') == 'confirmed': heading = 'COVID-19 Cases By Region ' else: heading = 'COVID-19 Deaths By Region ' # Create the layout layout = [[sg.T(heading, font='Any 20'), sg.T(size=(15,1), font='Any 20', key='-DATE-')],] layout += graph_layout layout += [[sg.T('Way-back machine'), sg.Slider((0,100), size=(30,15), orientation='h', enable_events=True, key='-SLIDER-'), sg.T(f'Rewind up to 00000 days', key='-REWIND MESSAGE-'), sg.CB('Animate Graphs', enable_events=True, key='-ANIMATE-'), sg.T('Update every'), sg.I('50', key='-ANIMATION SPEED-', enable_events=True, size=(4,1)), sg.T('milliseconds')], [sg.CB('Enable Forecasting', default=settings.get('forecasting',False), enable_events=True, key='-FORECAST-'), sg.T(' Daily growth rate'), sg.I(str(DEFAULT_GROWTH_RATE), size=(5,1), key='-GROWTH RATE-'), sg.T(f'Forecast up to {MAX_FORECASTED_DAYS} days'), sg.Slider((0, MAX_FORECASTED_DAYS), default_value=1, size=(30, 15), orientation='h', enable_events=True, key='-FUTURE SLIDER-'), ]] layout += [[sg.T('Settings', key='-SETTINGS-', enable_events=True), sg.T(' Locations', key='-LOCATIONS-', enable_events=True), sg.T(' Refresh', key='-REFRESH-', enable_events=True), sg.T(' Change Settings File', key='-CHANGE SETTINGS FILENAME-', enable_events=True), # sg.T(' Raw Data', key='-RAW DATA-', enable_events=True), sg.T(' Exit', key='Exit', enable_events=True), sg.T(' '*20), sg.T(size=(40,2), font='Any 8', key='-UPDATED-'), sg.Col([[sg.T(r'Data source: Johns Hopkins - https://github.com/CSSEGISandData/COVID-19', enable_events=True, font='Any 8', key='-SOURCE LINK-', pad=(0,0))], [sg.T(f'Version {VERSION} Created using PySimpleGUI', font='Any 8', enable_events=True, key='-PSG LINK-', pad=(0,0))]])] ] window = sg.Window('COVID-19 Confirmed Cases', layout, grab_anywhere=False, no_titlebar=False, margins=(0,0), icon=ICON, finalize=True) # set cursor to hand for all text elements that looks like links _ = [window[key].set_cursor('hand2') for key in ('-SETTINGS-', '-LOCATIONS-', '-REFRESH-', 'Exit', '-SOURCE LINK-', '-PSG LINK-')] return window
def MyInput(key): return sg.I('', size=(3, 1), key=key, pad=(0, 2))
def make_window(): config = get_config()["INCOMING"] navigator_column = [ [ sg.Col([[ sg.Text("General", enable_events=True, key="-general-", pad=((20, 5), (5, 5))), ]], expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.Text("JSON/Ads", enable_events=True, key="-json-", pad=((20, 5), (5, 5))), ]], expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.Text("Email", enable_events=True, key="-email-", pad=((20, 5), (5, 5))), ]], expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.Text("After Effects", enable_events=True, key="-AE-", pad=((20, 5), (5, 5))), ]], expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.Text("Server Incoming", background_color="darkgrey", size=(20, 1), enable_events=True, key="-incoming-", pad=((20, 5), (5, 5))), ]], background_color="darkgrey", expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.Text("Server delivery", enable_events=True, key="-delivery-", pad=((20, 5), (5, 5))), ]], expand_x=True, pad=((0, 0), (0, 0))), ], [ sg.Col([[ sg.B('Back', pad=((20, 10), (250, 0)), button_color=("white", "black"), highlight_colors=("red", "green"), use_ttk_buttons=False) ]], expand_x=True, pad=((0, 0), (0, 20))), ], ] info_column = [ [ sg.Text("Select Protocal: "), sg.DD(values=["sFTP", "FTP"], key="protocal", default_value=config["protocal"], enable_events=True) ], [ sg.Text("FTP Server:" if config["protocal"] == 'FTP' else "sFTP server", pad=((22, 5), (5, 5)), key="server_ident"), sg.I(config["server"], key="server", size=(30, 1)) ], [ sg.Text("Port:", pad=((57, 5), (5, 5))), sg.I(config["port"], key="port", size=(30, 1)) ], [ sg.Text("Username:"******"username"], key="username", size=(30, 1)) ], [ sg.Text("Password:"******"password_ident"), sg.I(config["password"], size=(30, 1), key="password", password_char="*", disabled=not config["protocal"] == 'FTP'), ], [ sg.Text("path to private key" if not config.get("private_key_path") else config.get("private_key_path"), size=(40, 1), pad=((32, 5), (5, 5))), sg.FileBrowse("Private Key", disabled=config["protocal"] == 'FTP', key="private_key_path") ], [sg.T(pad=((0, 400), (70, 0)))], [ sg.T("Campaign JSON path:"), sg.I( config["json_path"], key="json_path", size=(20, 1), ) ], [ sg.T("Campaign Ads path:", pad=((15, 5), (5, 5))), sg.I( config["ads_path"], key="ads_path", size=(20, 1), ) ], [sg.B("save", pad=((280, 20), (140, 5)))] ] # ----- Full layout ----- layout = [[ sg.Column(navigator_column, vertical_alignment="t", pad=((0, ), (15, 5))), sg.VSeperator(pad=( (0, 0), (0, 0), ), color="black"), sg.Column( info_column, vertical_alignment="t", pad=((0, ), (15, 5)), ), ]] # Create the window window = sg.Window("Settings", layout, margins=(0, 0), icon=apg_logo) return window
def run_graf(self): #menu_def = [['Menu', ['Nueva Funcion', ['Unaria'],], 'Funciones'], #['Modo', ['Calculadora', 'Graficadora']],] layout = [ [sg.T('Entrada', font=("Helvetica", 15))], [sg.I('', key='-funcion-')], [ sg.T("Las funciones deben tener el siguiente formato: 'y = X'", font=("Helvetica", 15)) ], [ sg. T("La variable X debe ir en mayuscula y cada función va separada por una coma", font=("Helvetica", 15)) ], [sg.B('Graficar', font=("Helvetica", 15), bind_return_key=True)], [sg.T("Rango: ", font=("Helvetica", 15)), sg.I("", key='-range-')], [sg.T("El rango debe ser una tupla", font=("Helvetica", 15))], [sg.B("Ingresar Rango", font=("Helvetica", 15))], [sg.T('Controls:', font=("Helvetica", 15))], [sg.Canvas(key='controls_cv')], [sg.T('Figura:', font=("Helvetica", 15))], [ sg.Column( layout=[[ sg.Canvas( key='fig_cv', # it's important that you set this size size=(400 * 2, 400)) ]], background_color='#DAE0E6', pad=(0, 0)) ], [sg.B('Borrar', font=("Helvetica", 15))], [sg.B('Salir', font=("Helvetica", 15))], [sg.Menu(self.menu_def)] ] window = sg.Window('Gráfica', layout) rango = (-1, 1) graficar_por_rango = False while True: event, values = window.read(timeout=1) if event == "Inicio": window.close() self.run() break elif event == "Unaria": window.close() funcion = sg.popup_get_text('Ingrese la nueva función', title="Mensaje", font=self.font) self.agregar_unario(funcion) self.run_graf() break elif event == "Calculadora": window.close() self.run_calc() break elif event == "Graficadora": continue elif event == "Funciones": self.lista_funciones() continue if event == "Ingresar Rango": if values["-range-"] != '': temp = values["-range-"] temp = temp.split(',') temp[0] = temp[0].replace('(', '') temp[0] = temp[0].replace(' ', '') temp[1] = temp[1].replace(')', '') temp[1] = temp[1].replace(' ', '') try: rango = (float(temp[0]), float(temp[1])) if values["-funcion-"] == '': None else: graficar_por_rango = True except: sg.Popup("El valor de rango no fue válido", title="Mensaje", font=self.font) continue if event in (sg.WIN_CLOSED, 'Salir'): # always, always give a way out! window.close() break if event is "Graficar" or graficar_por_rango: graficar_por_rango = False plt.figure(1) fig = plt.gcf() DPI = fig.get_dpi() fig.set_size_inches(404 * 2 / float(DPI), 404 / float(DPI)) temp = self.graficar(values["-funcion-"], rango=rango, show=False) if temp != None: sg.Popup(temp, title="Mensaje", font=self.font) draw_figure_w_toolbar(window['fig_cv'].TKCanvas, fig, window['controls_cv'].TKCanvas) if event == "Borrar": self.graficar(borrar=True) try: draw_figure_w_toolbar(window['fig_cv'].TKCanvas, fig, window['controls_cv'].TKCanvas) except: None window.close()
list_failed_pdf_conversion.append(pdf_input) print('The following pdf files couldn\'t be converted: ') for failed_file in list_failed_pdf_conversion: print(f'\t{failed_file}') sg.theme('LightGrey2') # Please always add color to your window tab1_layout = [[sg.Text('Tab 1')]] tab2_layout = [[ sg.Text('Select Files', font='Roboto 12', size=(12, 1), justification='right'), sg.I(f'', key='-IN-F-TAB2-', size=(75, 1)), sg.FilesBrowse(file_types=(("PDF Files", "*.pdf"), ("PDF Files", "*.PDF"))) ], [ sg.Text('Select Folder', font='Roboto 12', size=(12, 1), justification='right'), sg.I(f'{os.getcwd()}', key='-IN-D-TAB2-', size=(75, 1)), sg.FolderBrowse() ], [ sg.Text('Save File Name', font='Roboto 12', size=(12, 1), justification='right'),
def main(mask_rate=0.7): """" The Main GUI - It does it all. The "Board" is a grid that's 9 x 9. Even though the layout is a grid of 9 Frames, the addressing of the individual squares is via a key that's a tuple (0,0) to (8,8) """ # It's 1 line of code to make a Sudoku board. If you don't like it, then replace it. # Dude (Dudette), it's 1-line of code. If you don't like the board, write a line of code. # The keys for the inputs are tuples (0-8, 0-8) that reference each Input Element. # Get an input element for a position using: window[row, col] # To get a better understanding, take it apart. Spread it out. You'll learn in the process. window = sg.Window('Sudoku', [[ sg.Frame('', [[ sg.I(random.randint(1, 9), justification='r', size=(3, 1), enable_events=True, key=(fr * 3 + r, fc * 3 + c)) for c in range(3) ] for r in range(3)]) for fc in range(3) ] for fr in range(3)] + [ [ sg.B('Solve'), sg.B('Check'), sg.B('Hint'), sg.B('New Game'), sg.T('Mask rate (0-1)'), sg.In(str(mask_rate), size=(3, 1), key='-RATE-') ], ], finalize=True) # create and display a puzzle by updating the Input elements puzzle, solution = create_and_show_puzzle(window) check_showing = False while True: # The Event Loop event, values = window.read() if event == sg.WIN_CLOSED: break if event == 'Solve': for r, row in enumerate(solution): for c, col in enumerate(row): window[r, c].update( solution[r][c], background_color=sg.theme_input_background_color()) elif event == 'Check': check_showing = True solved = check_progress(window, solution) if solved: sg.popup('Solved! You have solved the puzzle correctly.') elif event == 'Hint': elem = window.find_element_with_focus() try: elem.update(solution[elem.Key[0]][elem.Key[1]], background_color=sg.theme_input_background_color()) except: pass # Likely because an input element didn't have focus elif event == 'New Game': puzzle, solution = create_and_show_puzzle(window) elif check_showing: # an input was changed, so clear any background colors from prior hints check_showing = False for r, row in enumerate(solution): for c, col in enumerate(row): window[r, c].update( background_color=sg.theme_input_background_color()) window.close()
layout = [ [sg.Text('My Window')], [sg.Text('Click to add a row inside the frame'), sg.B('+', key='-B1-')], [sg.Text('Click to add a row inside the Window'), sg.B('+', key='-B2-')], [sg.Frame('Frame', [[sg.T('Frame')]], key='-COL1-')], [sg.Input(key='-IN-'), sg.Text(size=(12, 1), key='-OUT-')], [sg.Button('Button'), sg.Button('Exit')] ] window = sg.Window('Window Title', layout) i = 0 while True: # Event Loop event, values = window.read() print(event, values) if event in (None, 'Exit'): break if event == '-B1-': window.extend_layout( window['-COL1-'], [[sg.T('A New Input Line'), sg.I(key=f'-IN-{i}-')]]) i += 1 if event == '-B2-': window.extend_layout( window, [[sg.T('A New Input Line'), sg.I(key=f'-IN-{i}-')]]) i += 1 window.close()
#!/usr/bin/python3 ''' pip install PySimpleGUI requests ''' import PySimpleGUI as sg, requests layout = [[sg.B('Test', key='test_serv')], [sg.I('', key='itext'), sg.B('Send', key='send_text')], [sg.ML('', size=(60, 15), key='log')]] window = sg.Window('', layout, return_keyboard_events=True) addr = '127.0.0.1:5000' while True: event, values = window() if event in (None, 'Exit'): break if event == 'test_serv': responce = requests.post(f'http://{addr}/') window['log'](responce.text) if event == 'send_text': itext = values['itext'] responce = requests.post(f'http://{addr}/', json={'text': itext}) window['log'](responce.text) if 'F1' in event: window['log'](requests.post(f'http://{addr}/exec', json={ 'i': values['itext'] }).text)