def no_internet_connection(): """ Produce a popup window that notifies the user of AdaHub's lack of ability to reliably establish a connection outside of the local network. Returns: None """ log = getLogger(f'{PROG}.{__name__}') log.debug('Received request to produce popup to notify user that they attempted to activate a feature that has ' 'not yet been implemented.') statement = 'AdaHub was unable to find an internet connection.\n' \ '\nPlease check your connection.' Qt.PopupError(statement, title=f'{title_prefix}', keep_on_top=True)
def not_yet_implemented(feature=None): """ Produce a popup window that notifies the user that they have attempted to activate a feature that is not yet implemented. This error would usually occur after attempting to activate a feature that has an interactive placeholder for a part of the program that has not yet had it's code written, etc. Returns: None """ if feature is not None: feature = feature.strip() else: feature = 'This feature' statement = str(f'{feature} is not yet implemented.') Qt.PopupError(statement, title=f'{title_prefix} | Not Yet Implemented', keep_on_top=True)
def rename_dialog(src: str): import PySimpleGUIQt as G ske = PySimpleGUISpecialKeyEvent() conf_file = real_join_path('~', '.config/rename_dialog.json') root = 'root' fname = 'fname' ext = 'ext' key_new_root = 'key_new_root' key_new_base = 'key_new_base' ok = 'OK' cancel = 'Cancel' pattern = 'pattern' replace = 'replace' substitute = 'substitute' save_replace = 'save_replace' save_pattern = 'save_pattern' add_root = 'add_root' rename_info_file = 'rename_info_file' bytes_count = 'bytes_count' title = 'Rename - {}'.format(src) h = None conf = read_json_file(conf_file, default={pattern: [''], replace: ['']}) tmp_pl = conf[pattern] or [''] tmp_rl = conf[replace] or [''] old_root, old_base = os.path.split(src) old_fn, old_ext = os.path.splitext(old_base) info_file_base = [ f for f in os.listdir(old_root) if f.endswith('.info') and ( f.startswith(old_fn) or old_fn.startswith(f.rstrip('.info'))) ] has_info = True if info_file_base else False @deco_factory_retry(Exception, 0, enable_default=True, default=None) def re_sub(): return re.sub(data[pattern], data[replace], data[fname] + data[ext]) def count_name_bytes(name: str): d = {} try: c, b = encode_default_locale(name) d[c] = len(b) except UnicodeEncodeError: pass u8 = 'utf-8' if u8 not in d: try: c, b = encode_default_locale(name, u8) d[c] = len(b) except UnicodeEncodeError: pass return f'Basename Length: {len(name)}, {", ".join([f"{k.upper()} {v} bytes" for k, v in d.items()])}' # sg.theme('SystemDefaultForReal') layout = [[G.T(src, key='src')], [G.HorizontalSeparator()], [ G.I(old_fn, key=fname, focus=True), G.I(old_ext, key=ext, size=(42, h)) ], [ G.I(old_root, key=root), G.B('+', key=add_root, size=(20, h)), G.FolderBrowse('...', target=root, initial_folder=old_root, size=(20, h)) ], [G.HorizontalSeparator()], [G.T('Regular Expression Pattern & Replacement')], [ G.T(size=(0, h)), G.Drop(tmp_pl, key=pattern, enable_events=True, text_color='blue'), G.CB('', default=True, key=save_pattern, enable_events=True, size=(15, h)), G.Drop(tmp_rl, key=replace, enable_events=True, text_color='blue'), G.CB('', default=True, key=save_replace, enable_events=True, size=(15, h)), G.B('Go', key=substitute, size=(25, h)) ], [G.HorizontalSeparator()], [G.I(old_root, key=key_new_root)], [G.I(old_base, key=key_new_base)], [ G.Submit(ok, size=(10, 1)), G.Stretch(), G.T(count_name_bytes(old_base), key=bytes_count), G.Stretch(), G.Cancel(cancel, size=(10, 1)) ]] if has_info: info_file_base = info_file_base[0] info_filepath = os.path.join(old_root, info_file_base) with open(info_filepath, encoding='utf8') as f: info = f.read() layout.insert(2, [ G.CB(info_file_base, default=True, key=rename_info_file, enable_events=True) ]) layout.insert(2, [G.ML(info, key='ML')]) layout.insert(4, [G.HorizontalSeparator()]) ensure_sigint_signal() window = G.Window(title, layout, return_keyboard_events=True, finalize=True, font='arial 10', element_padding=(1, 1)) window.bring_to_front() ml = window.find_element('ML', silent_on_error=True) if ml: ml.update(readonly=True) loop = True data = { fname: old_fn, ext: old_ext, pattern: tmp_pl[0], replace: tmp_rl[0], root: old_root, key_new_root: '', key_new_base: '' } while loop: dst_from_data = os.path.join(data[key_new_root], data[key_new_base]) try: tmp_fname = re_sub() or data[fname] + data[ext] dst = os.path.realpath(os.path.join(data[root], tmp_fname)) except TypeError: dst = src if dst != dst_from_data: nr, nb = os.path.split(dst) window[key_new_root].update(nr) window[key_new_base].update(nb) window[bytes_count].update(count_name_bytes(nb)) event, data = window.read() for k in (root, fname, ext, key_new_root, key_new_base): window[k].update(text_color=None) cur_p = data[pattern] cur_r = data[replace] if event == ske.esc: loop = False elif event == add_root: os.makedirs(data[root], exist_ok=True) elif event == substitute: data[fname], data[ext] = os.path.splitext( re_sub() or data[fname] + data[ext]) window[fname].update(data[fname]) window[ext].update(data[ext]) elif event == save_pattern: if data[save_pattern]: conf[pattern].insert(0, cur_p) conf[pattern] = dedup_list(conf[pattern]) else: conf[pattern] = remove_from_list(conf[pattern], [cur_p]) elif event == save_replace: if data[save_replace]: conf[replace].insert(0, cur_r) conf[replace] = dedup_list(conf[replace]) else: conf[replace] = remove_from_list(conf[replace], [cur_r]) elif event == pattern: window[save_pattern].update(value=cur_p in conf[pattern]) elif event == replace: window[save_replace].update(value=cur_r in conf[replace]) elif event == ok: try: shutil.move(src, dst) if has_info: if data[rename_info_file]: shutil.move(info_filepath, os.path.splitext(dst)[0] + '.info') loop = False except FileNotFoundError: for k in (root, fname, ext): window[k].update(text_color='red') except FileExistsError: for k in (key_new_root, key_new_base): window[k].update(text_color='red') except OSError as e: G.PopupError(str(e)) elif event in (None, cancel): loop = False else: ... else: write_json_file(conf_file, conf, indent=0) window.close()
window["in_preparo"].Update("") window["in_ingred_list"].Update("") window["in_cat"].Update("") window["in_cat_list"].Update("") window.Refresh() sg.PopupAutoClose( "Receita inserida com sucesso!", keep_on_top=True, no_titlebar=True, auto_close=True, auto_close_duration=2, button_type=POPUP_BUTTONS_NO_BUTTONS, ) except Exception as e: sg.PopupError( f"ERRO. Não foi possível inserir a receita. Por favor verifique os campos preenchidos.\nMotivo:\n{e}", title="ERRO", ) else: sg.PopupError( "ERRO: os seguintes erros foram encontrados:\n{0}".format( "\n".join(ERROS), title="ERRO" ) ) if event == "in_list_ingred": cur = conn.cursor() SQL_INGREDIENTES = cur.execute("select ingredientes from receitas") LISTA_INGREDIENTES = [] for ING in SQL_INGREDIENTES: if ING[0]: INGS = [
def get_settings(min_df_val, max_df_val, label_words_val, folder_val, stopwords_path): layout2 = [[sg.Text('Parameter Settings', font=("Ariel", 12))], [ sg.Text('min_df', size=(15, 1), font=("Ariel", 12)), sg.InputText(str(min_df_val), font=("Ariel", 12), key='min_df_val') ], [ sg.Text('max_df', size=(15, 1), font=("Ariel", 12)), sg.InputText(str(max_df_val), font=("Ariel", 12), key='max_df_val') ], [ sg.Text('Number of Label Words', size=(15, 1), font=("Ariel", 12)), sg.InputText(str(label_words_val), font=("Ariel", 12), key='label_words_val') ], [ sg.Txt('Output Folder:', size=(10, 1), font=("Ariel", 12)), sg.InputText(str(folder_val), size=(30, 1), font=("Ariel", 12), key='folder_val'), sg.FolderBrowse(font=("Ariel", 12)) ], [ sg.Txt('Stopwords file:', size=(10, 1), font=("Ariel", 12)), sg.InputText(str(stopwords_path), size=(30, 1), font=("Ariel", 12), key='stopwords_path'), sg.FileBrowse(font=("Ariel", 12)) ], [sg.Submit(font=("Ariel", 12)), sg.Cancel(font=("Ariel", 12))]] settingswdw = sg.Window('Settings', grab_anywhere=False, resizable=False).Layout(layout2) #settingswdw.Refresh() while True: # Event Loop event, values = settingswdw.Read() print(event, values) if event is None or event == 'Cancel': print('None or Exit event') break elif event == 'Submit': if not RepresentsInt(values['min_df_val']) or not RepresentsInt( values['max_df_val']) or not RepresentsInt( values['label_words_val']): sg.PopupError('Values must be integers, please correct.') elif not os.path.exists(folder_val) or not os.path.isdir( folder_val): sg.PopupError('Folder not valid, please correct.') elif not os.path.exists(stopwords_path) or not os.path.isfile( stopwords_path): sg.PopupError('Stopwords file not valid, please correct.') else: min_df_val = values['min_df_val'] max_df_val = values['max_df_val'] label_words_val = values['label_words_val'] folder_val = values['folder_val'] stopwords_path = values['stopwords_path'] #print('min_df_val: ' + min_df_val + ' max_df_val:' + max_df_val + ' label_words_val:' + label_words_val + ' output_folder_val: ' + folder_val) break print('min_df_val: ' + min_df_val + ' max_df_val:' + max_df_val + ' label_words_val:' + label_words_val + ' output_folder_val: ' + folder_val + ' stopwords_path: ' + stopwords_path) settingswdw.Close() return min_df_val, max_df_val, label_words_val, folder_val, stopwords_path
if song.artist and song.title: song.download_lyrics() # Show immidiate log in console else: # If title was present, use that if song.title: print(song.title, 'was ignored.', song.error) # else use audio file path else: print(song.path, 'was ignored.', song.error) print('\nBuilding log...') Song.log_results(song_list) print( '{songs} songs, {tagged} tagged, {files} lyric files, {existing} existing, {errors} errors'.format( songs = len(song_list), tagged = Song.lyrics_saved_to_tag_count, files = Song.lyrics_saved_to_file_count, existing = Song.lyrics_existing_count, errors = Song.lyrics_errors_count ) ) print('FINISHED') sg.Popup('All Done!', 'See the debug screen for more details.') else: sg.PopupError("No music directory selected. Quitting without searching.", title="No Directory")
configList[5] = comm.updateOutput() comm.runOblige(configList) pop.Close() sessionDic = { "id": str(updateSessionId(sessionsList)), "name": configList[5], "configList": configList, "pwadList": pwadList } sessionsList = addSession(sessionsList, sessionDic) saveSessions(sessionsList) sessionsList = loadSessions() setSessionsValues(formatSessionsValues(sessionsList)) setConfigValues(configList, pwadList) elif launchReady is False: sg.PopupError("Cannot Create Game with missing Config", keep_on_top=True) # Event Actions to Play a Game if event == "Play": configList, pwadList = getConfigValues() launchReady = True launchCheck = 0 while launchCheck <= 5: if configList[launchCheck] is "" and launchCheck is not 4: launchReady = False launchCheck += 1 if launchReady is True: comm.runSourcePort(configList, pwadList) elif launchReady is False: sg.PopupError("Cannot Create Game with missing Config",
size=(500, 600), icon=c_icon, alpha_channel=.8, no_titlebar=True) print = window['output'].print while True: event, values = window.read(timeout=100) if not fetched: data = fetch_data() if fetched: window['inspect_bttn'].Update(visible=True) window.refresh() if event is None or event == 'close_bttn': window.close() exit() if event == 'refresh_bttn': fetched = False if event == 'inspect_bttn': Qt.PopupError('\nThis feature is not yet implemented!\n', title='Not yet implemented!', keep_on_top=True, icon=err_icon) fetch_data()
def getErrorWindow(text="Error"): sg.PopupError(text)
def rename_dialog(src: str): import PySimpleGUIQt as sg ske = PySimpleGUISpecialKeyEvent() conf_file = real_join_path('~', '.config/rename_dialog.json') root = 'root' fname = 'fname' ext = 'ext' new_root = 'new_root' new_base = 'new_base' ok = 'OK' cancel = 'Cancel' pattern = 'pattern' replace = 'replace' substitute = 'substitute' save_replace = 'save_replace' save_pattern = 'save_pattern' add_root = 'add_root' title = 'Rename - {}'.format(src) h = .7 conf = read_json_file(conf_file, default={pattern: [''], replace: ['']}) tmp_pl = conf[pattern] or [''] tmp_rl = conf[replace] or [''] old_root, old_base = os.path.split(src) old_fn, old_ext = os.path.splitext(old_base) # sg.theme('SystemDefaultForReal') layout = [ [sg.T(src, key='src')], [sg.HorizontalSeparator()], [sg.I(old_root, key=root), sg.B('+', key=add_root, size=(3, h)), sg.FolderBrowse('...', target=root, initial_folder=old_root, size=(6, h))], [sg.I(old_fn, key=fname, focus=True), sg.I(old_ext, key=ext, size=(6, h))], [sg.HorizontalSeparator()], [sg.T('Regular Expression Substitution Pattern & Replacement')], [sg.T(size=(0, h)), sg.Drop(tmp_pl, key=pattern, enable_events=True, text_color='blue'), sg.CB('', default=True, key=save_pattern, enable_events=True, size=(2, h)), sg.Drop(tmp_rl, key=replace, enable_events=True, text_color='blue'), sg.CB('', default=True, key=save_replace, enable_events=True, size=(2, h)), sg.B('Go', key=substitute, size=(3, h))], [sg.HorizontalSeparator()], [sg.I(old_root, key=new_root)], [sg.I(old_fn + old_ext, key=new_base)], [sg.Submit(ok, size=(10, 1)), sg.Stretch(), sg.Cancel(cancel, size=(10, 1))]] ensure_sigint_signal() window = sg.Window(title, return_keyboard_events=True).layout(layout).finalize() window.bring_to_front() loop = True data = {fname: old_fn, ext: old_ext, pattern: tmp_pl[0], replace: tmp_rl[0], root: old_root, new_root: '', new_base: ''} @decorator_factory_exception_retry(Exception, 0, enable_default=True, default=None) def re_sub(): return re.sub(data[pattern], data[replace], data[fname] + data[ext]) while loop: dst_from_data = os.path.join(data[new_root], data[new_base]) try: tmp_fname = re_sub() or data[fname] + data[ext] dst = os.path.realpath(os.path.join(data[root], tmp_fname)) except TypeError: dst = src if dst != dst_from_data: nr, nb = os.path.split(dst) window[new_root].update(nr) window[new_base].update(nb) event, data = window.read() f = window.find_element_with_focus() for k in (root, fname, ext, new_root, new_base): window[k].update(text_color=None) cur_p = data[pattern] cur_r = data[replace] if event == ske.esc: loop = False elif event == add_root: os.makedirs(data[root], exist_ok=True) elif event == substitute: data[fname], data[ext] = os.path.splitext(re_sub() or data[fname] + data[ext]) window[fname].update(data[fname]) window[ext].update(data[ext]) elif event == save_pattern: if data[save_pattern]: conf[pattern].insert(0, cur_p) conf[pattern] = dedup_list(conf[pattern]) else: conf[pattern] = remove_from_list(conf[pattern], [cur_p]) elif event == save_replace: if data[save_replace]: conf[replace].insert(0, cur_r) conf[replace] = dedup_list(conf[replace]) else: conf[replace] = remove_from_list(conf[replace], [cur_r]) elif event == pattern: window[save_pattern].update(value=cur_p in conf[pattern]) elif event == replace: window[save_replace].update(value=cur_r in conf[replace]) elif event == ok: try: shutil.move(src, dst) loop = False except FileNotFoundError: for k in (root, fname, ext): window[k].update(text_color='red') except FileExistsError: for k in (new_root, new_base): window[k].update(text_color='red') except OSError as e: sg.PopupError(str(e)) elif event in (None, cancel): loop = False else: ... else: write_json_file(conf_file, conf, indent=0) window.close()
import csv # sg.PopupQuickMessage('Loading...', auto_close_duration=4, keep_on_top=True, location=(800,800)) # sg.Popup('This is a normal blocking popup','It was called after the PopupQuickMessage call.', location=(1000,800)) filename = r'C:\Python\PycharmProjects\GooeyGUI\ProgrammingClassExamples\Win10 versions\AFL2018 (sorted pts and %).csv' # filename = sg.PopupGetFile('filename to open', no_window=False, file_types=(("CSV Files","*.csv"),)) # --- populate table with file contents --- # data = [] if filename is not None: with open(filename, "r") as infile: reader = csv.reader(infile) try: data = list(reader) # read everything else into a list of rows except: sg.PopupError('Error reading file') sys.exit(69) else: sys.exit() # sg.SetOptions(element_padding=(0,0)) headings = [data[0][x] for x in range(len(data[0]))] print(data) layout = [[sg.Table(values=data[1:][:], headings=headings, max_col_width=25, auto_size_columns=True, display_row_numbers=True, change_submits=True, bind_return_key=True, justification='right', num_rows=20, alternating_row_color='lightblue', key='_table_', text_color='black')], [sg.Button('Read'), sg.Button('Double')], [sg.T('Read = read which rows are selected')],[sg.T('Double = double the amount of data in the table')]] window = sg.Window('Table', grab_anywhere=False, resizable=True).Layout(layout) window.FindElement('_table_').StartingRowNumber = 1 window.FindElement('_table_').RowHeaderText = 'Row'