diff --git a/SG/__pycache__/psgdemos.cpython-39.pyc b/SG/__pycache__/psgdemos.cpython-39.pyc index 86e23f71a7cc31dbaef9b4bd38c118564ecfde4c..b8576e38e1910f4b43fa4f40fe394ba46c01c6a6 100644 Binary files a/SG/__pycache__/psgdemos.cpython-39.pyc and b/SG/__pycache__/psgdemos.cpython-39.pyc differ diff --git a/SG/ccser_gui.py b/SG/ccser_gui.py index c63033238938a7e85e1c3bf494239a7347194d6e..b850f2ff21f29433f16273ebc811e57d4ad95f33 100644 --- a/SG/ccser_gui.py +++ b/SG/ccser_gui.py @@ -5,10 +5,23 @@ from joblib import load from audio.core import get_used_keys from audio.graph import showFreqGraph, showMelFreqGraph, showWaveForm from config.EF import ava_algorithms, ava_emotions, ava_features -from config.MetaPath import (ava_dbs, bclf, brgr, emodb, - get_example_audio_file, ravdess, savee) +from config.MetaPath import ( + ava_dbs, + bclf, + brgr, + emodb, + get_example_audio_file, + ravdess, + savee, +) from recognizer.basic import EmotionRecognizer from recognizer.deep import DeepEmotionRecognizer +import sys + + +def import_config_bookmark(): + pass + ## @@ -35,16 +48,79 @@ def get_algos_elements_list(): return algos_radios + +def create_border_frame(result="inputYourContentToHighligt", key="border"): + """创建一个带边框的布局窗口 + + Parameters + ---------- + key : str, optional + _description_, by default "border" + + examples: + - + # 创建一个使用border_frame的布局 + demo_border_layout = [ + [sg.Text("Enter a number:"), sg.Input(key="-NUMBER-")], + [sg.Button("Calculate"), sg.Button("Exit")], + [create_border_frame(**kwargs)] + ] + + Returns + ------- + layout + + """ + # 创建一个带边框区域 + res_layout = [ + [sg.Text(f"{result}", font=("Helvetica", 24,"bold"),background_color="green",text_color="red",key=f"{key}")], + [sg.HorizontalSeparator()], + # [sg.Text("Result: "), sg.Text("", size=(20, 1),)] + ] + + frame = sg.Frame( + "Result Area", + res_layout, + relief=sg.RELIEF_SUNKEN, + border_width=2, + + ) + + return frame + + ## # ---create the window--- -def make_window(size=None): +def make_window(theme=None, size=None): + if theme: + sg.theme(theme) + menu_def = [["&Application", ["E&xit"]], ["&Help", ["&About"]]] # 据我观察,通常布局的类型为list[list[element]],也就是说,是一个关于sg组件元素的二轴数组布局,不妨称之为基础布局 # 并且,若我们将排放在同一行的元素,(称他们为一个元素序列),元素序列的包含sg.个数可以是>=1的 # 从这个角度理解,那么布局可以理解为`元素序列`按照shape=(-1,1)的形状排放 # 尽管有这样的嵌套约束,但是PySimpleGui提供了一些用于嵌套的组件,例如sg.Column # 我们可以基础布局作为Column组件的参数,然后我可以将Column作为组件放到一个新的基础组件中,这样就好像嵌套一个更深的层布局 # 在实践中,比较少用过度变量,但是用来作为划分(设计)用途还是不错的,甚至设计完毕后可以销毁这些临时子布局变量 + + # ---choose theme--- + theme_layout = [ + [ + sg.Text( + "See how elements look under different themes by choosing a different theme here!" + ) + ], + [ + sg.Listbox( + values=sg.theme_list(), + size=(20, 12), + key="-THEME LISTBOX-", + enable_events=True, + ) + ], + [sg.Button("Set Theme")], + ] # ---create 2 column layout--- + # ---column left--- db_choose_layout = [ [sg.Text("Select the training database")], [sg.Combo(ava_dbs, key="train_db", default_value=emodb)], @@ -57,10 +133,12 @@ def make_window(size=None): e_config_layout = [ [ sg.Text("choose the emotion config:"), + ], + [ sg.Text( "请选择一个情感组合进行试验:推荐组合AS,HNS,AHNS,AHNPS\n\ - 注意,savee库种的`surprise`和`pleasantSurprise`)有一定区别,所以AHNPS组合不推荐用于savee上" - ), + 注意,savee库种的`surprise`和`pleasantSurprise`)有一定区别,\n所以AHNPS组合不推荐用于savee上" + ) ], [ sg.Checkbox("angry", key="angry", default=True), @@ -84,7 +162,7 @@ def make_window(size=None): ], [sg.Button("OK2"), sg.Button("Cancel")], ] - + # ---column right--- algos = get_algos_elements_list() len_of_algos = len(algos) algos_layout = [ @@ -112,7 +190,8 @@ def make_window(size=None): emotion_recognition_layout = [ [sg.Text("识别该语音文件的情感")], [sg.B("OK5")], - [sg.Text(f"识别结果:{re_result}", key="emotion_recognition_res")], + # [sg.Text(f"识别结果:{re_result}", key="emotion_recognition_res")], + [create_border_frame(result=re_result, key="emotion_recognition_res")], ] draw_layout = [ @@ -125,28 +204,131 @@ def make_window(size=None): ], [sg.Button("OK6"), sg.Button("Cancel")], ] + # ---辅助信息--- + ML_KEY = "-ML-" # Multline's key + __version__ = "1.1" + right_info_layout = [ + [ + sg.Multiline( + size=(70, 21), + write_only=True, + # expand_x=True, + expand_y=True, + key=ML_KEY, + reroute_stdout=True, + echo_stdout_stderr=True, + reroute_cprint=True, + ) + ], + [sg.T("CCSER Client By Cxxu_zjgsu " + __version__)], + [ + sg.T( + "PySimpleGUI ver " + + sg.version.split(" ")[0] + + " tkinter ver " + + sg.tclversion_detailed, + font="Default 8", + pad=(0, 0), + ) + ], + [sg.T("Python ver " + sys.version, font="Default 8", pad=(0, 0))], + [ + sg.T( + "Interpreter " + sg.execute_py_get_interpreter(), + font="Default 8", + pad=(0, 0), + ) + ], + ] + # output tab + logging_layout = [ + [sg.Text("Anything printed will display here!")], + [ + sg.Multiline( + size=(60, 15), + font="Courier 8", + # expand_x=True, + # expand_y=True, + write_only=True, + reroute_stdout=True, + reroute_stderr=True, + echo_stdout_stderr=True, + autoscroll=True, + auto_refresh=True, + ) + ] + ] + settings_layout = [ + [sg.Text("Settings")], + ]+theme_layout # ---column divide--- column_left = db_choose_layout + e_config_layout + f_config_layout column_right = ( - algos_layout + file_choose_layout + emotion_recognition_layout + draw_layout + algos_layout + + file_choose_layout + + emotion_recognition_layout + + draw_layout + + right_info_layout ) - column_left_layout = sg.Column(column_left, expand_x=True, expand_y=True) - column_right_layout = sg.Column(column_right, expand_x=True, expand_y=True) - - # ----full layout---- - layout = [ - [ - sg.Pane( + column_left_layout = sg.Column( + column_left, expand_x=True, expand_y=True, element_justification="l" + ) + column_right_layout = sg.Column( + column_right, expand_x=True, expand_y=True, element_justification="c" + ) + + main_pane = sg.Pane( [column_left_layout, column_right_layout], orientation="h", expand_x=True, expand_y=True, k="-PANE-", ) + + + main_tab_layout = [ + [ + sg.Text( + "Welcome to experience with CCSER Client!", + size=(45, 1), + justification="center", + font=("Helvetica", 16), + relief=sg.RELIEF_RIDGE, + k="-TEXT HEADING-", + enable_events=True, + ) + ], + [ + main_pane ], [sg.B("Quit")], ] + + # ----full layout---- + #--top Menu bar--- + Menubar_layout=[[sg.MenubarCustom(menu_def, key="-MENU-", font="Courier 15", tearoff=True)]] + + # ---tabs--- + tabs_layout=[ + [ + sg.TabGroup( + [ + [ + sg.Tab("Input Elements", main_tab_layout), + sg.Tab("Output", logging_layout), + sg.Tab("Settings",settings_layout) + ] + ], + key="-TAB GROUP-", + expand_x=True, + expand_y=True, + ), + ] + ] + + layout = Menubar_layout+tabs_layout + # ---create window window = sg.Window( title="ccser_client", @@ -158,11 +340,11 @@ def make_window(size=None): return window -audio_selected="" +audio_selected = "" -def main(): - window = make_window(size) +def main(): + window = make_window(size=size) # Initialize the selected databases list # 语料库的选择 @@ -296,15 +478,16 @@ def main(): window.close() + def recognize(window, train_db, test_db, e_config, f_config, algorithm, audio_selected): print("开始识别..") - bclf = load(bclf) + bclf_estimators = load(bclf) # audio_selected=get_example_audio_file() # None表示自动计算best_ML_model ML_estimators = { - estimator.__class__.__name__: estimator for estimator, _, _ in bclf + estimator.__class__.__name__: estimator for estimator, _, _ in bclf_estimators } ML_estimators["BEST_ML_MODEL"] = None # if algorithm=='BEST_ML_MODEL': @@ -335,5 +518,6 @@ def recognize(window, train_db, test_db, e_config, f_config, algorithm, audio_se print(f"{re_result=}") window["emotion_recognition_res"].update(f"{re_result}") -if __name__=="__main__": + +if __name__ == "__main__": main() diff --git a/SG/demo1.py b/SG/demo1.py index 67082740691f9d77cb43b620929e2374776a5b18..17bda9c575d78037872064c59bf9f8085062b7af 100644 --- a/SG/demo1.py +++ b/SG/demo1.py @@ -416,5 +416,34 @@ if __name__ == "__main__": # demo_event_value() # demoCombo() # radio_choose_demo() - demo_finalize() + # demo_finalize() + pass +import PySimpleGUI as sg + +# 创建一个带边框区域 +frame_layout = [[sg.Text("Important Result", font=("Helvetica", 14))], + [sg.HorizontalSeparator()], + [sg.Text("Result: "), sg.Text("", size=(20, 1), key="-RESULT-")]] + +frame = sg.Frame("Result Area", frame_layout, relief=sg.RELIEF_SUNKEN, border_width=2) + +# 创建一个GUI窗口 +layout = [[sg.Text("Enter a number:"), sg.Input(key="-NUMBER-")], + [sg.Button("Calculate"), sg.Button("Exit")], + [frame]] + +window = sg.Window("My GUI", layout) + +# 进入事件循环 +while True: + event, values = window.read() + if event == sg.WINDOW_CLOSED or event == "Exit": + break + elif event == "Calculate": + number = int(values["-NUMBER-"]) + result = number ** 2 + window["-RESULT-"].update(str(result)) + +# 关闭窗口并退出程序 +window.close() diff --git a/SG/demo_programs/Demo_All_Elements.py b/SG/demo_programs/Demo_All_Elements.py index 3a0be5fd6a00b414e13bd42648b248ceec74b9ae..7f7491d4f8d8797a48008b83e434facfae590e0e 100644 --- a/SG/demo_programs/Demo_All_Elements.py +++ b/SG/demo_programs/Demo_All_Elements.py @@ -1,3 +1,4 @@ +## """ Example of (almost) all Elements, that you can use in PySimpleGUI. Shows you the basics including: @@ -15,147 +16,276 @@ import PySimpleGUI as sg + def make_window(theme): sg.theme(theme) - menu_def = [['&Application', ['E&xit']], - ['&Help', ['&About']] ] - right_click_menu_def = [[], ['Edit Me', 'Versions', 'Nothing','More Nothing','Exit']] - graph_right_click_menu_def = [[], ['Erase','Draw Line', 'Draw',['Circle', 'Rectangle', 'Image'], 'Exit']] + menu_def = [["&Application", ["E&xit"]], ["&Help", ["&About"]]] + right_click_menu_def = [ + [], + ["Edit Me", "Versions", "Nothing", "More Nothing", "Exit"], + ] + graph_right_click_menu_def = [ + [], + ["Erase", "Draw Line", "Draw", ["Circle", "Rectangle", "Image"], "Exit"], + ] # Table Data data = [["John", 10], ["Jen", 5]] headings = ["Name", "Score"] - input_layout = [ - - # [sg.Menu(menu_def, key='-MENU-')], - [sg.Text('Anything that requires user-input is in this tab!')], - [sg.Input(key='-INPUT-')], - [sg.Slider(orientation='h', key='-SKIDER-'), - sg.Image(data=sg.DEFAULT_BASE64_LOADING_GIF, enable_events=True, key='-GIF-IMAGE-'),], - [sg.Checkbox('Checkbox', default=True, k='-CB-')], - [sg.Radio('Radio1', "RadioDemo", default=True, size=(10,1), k='-R1-'), sg.Radio('Radio2', "RadioDemo", default=True, size=(10,1), k='-R2-')], - [sg.Combo(values=('Combo 1', 'Combo 2', 'Combo 3'), default_value='Combo 1', readonly=False, k='-COMBO-'), - sg.OptionMenu(values=('Option 1', 'Option 2', 'Option 3'), k='-OPTION MENU-'),], - [sg.Spin([i for i in range(1,11)], initial_value=10, k='-SPIN-'), sg.Text('Spin')], - [sg.Multiline('Demo of a Multi-Line Text Element!\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7\nYou get the point.', size=(45,5), expand_x=True, expand_y=True, k='-MLINE-')], - [sg.Button('Button'), sg.Button('Popup'), sg.Button(image_data=sg.DEFAULT_BASE64_ICON, key='-LOGO-')]] - - asthetic_layout = [[sg.T('Anything that you would use for asthetics is in this tab!')], - [sg.Image(data=sg.DEFAULT_BASE64_ICON, k='-IMAGE-')], - [sg.ProgressBar(100, orientation='h', size=(20, 20), key='-PROGRESS BAR-'), sg.Button('Test Progress bar')]] - - logging_layout = [[sg.Text("Anything printed will display here!")], - [sg.Multiline(size=(60,15), font='Courier 8', expand_x=True, expand_y=True, write_only=True, - reroute_stdout=True, reroute_stderr=True, echo_stdout_stderr=True, autoscroll=True, auto_refresh=True)] - # [sg.Output(size=(60,15), font='Courier 8', expand_x=True, expand_y=True)] - ] - - graphing_layout = [[sg.Text("Anything you would use to graph will display here!")], - [sg.Graph((200,200), (0,0),(200,200),background_color="black", key='-GRAPH-', enable_events=True, - right_click_menu=graph_right_click_menu_def)], - [sg.T('Click anywhere on graph to draw a circle')], - [sg.Table(values=data, headings=headings, max_col_width=25, - background_color='black', - auto_size_columns=True, - display_row_numbers=True, - justification='right', - num_rows=2, - alternating_row_color='black', - key='-TABLE-', - row_height=25)]] - - popup_layout = [[sg.Text("Popup Testing")], - [sg.Button("Open Folder")], - [sg.Button("Open File")]] - - theme_layout = [[sg.Text("See how elements look under different themes by choosing a different theme here!")], - [sg.Listbox(values = sg.theme_list(), - size =(20, 12), - key ='-THEME LISTBOX-', - enable_events = True)], - [sg.Button("Set Theme")]] - - layout = [ [sg.MenubarCustom(menu_def, key='-MENU-', font='Courier 15', tearoff=True)], - [sg.Text('Demo Of (Almost) All Elements', size=(38, 1), justification='center', font=("Helvetica", 16), relief=sg.RELIEF_RIDGE, k='-TEXT HEADING-', enable_events=True)]] - layout +=[[sg.TabGroup([[ sg.Tab('Input Elements', input_layout), - sg.Tab('Asthetic Elements', asthetic_layout), - sg.Tab('Graphing', graphing_layout), - sg.Tab('Popups', popup_layout), - sg.Tab('Theming', theme_layout), - sg.Tab('Output', logging_layout)]], key='-TAB GROUP-', expand_x=True, expand_y=True), - - ]] + input_layout = [ + # [sg.Menu(menu_def, key='-MENU-')], + [sg.Text("Anything that requires user-input is in this tab!")], + [sg.Input(key="-INPUT-")], + [ + sg.Slider(orientation="h", key="-SKIDER-"), + sg.Image( + data=sg.DEFAULT_BASE64_LOADING_GIF, + enable_events=True, + key="-GIF-IMAGE-", + ), + ], + [sg.Checkbox("Checkbox", default=True, k="-CB-")], + [ + sg.Radio("Radio1", "RadioDemo", default=True, size=(10, 1), k="-R1-"), + sg.Radio("Radio2", "RadioDemo", default=True, size=(10, 1), k="-R2-"), + ], + [ + sg.Combo( + values=("Combo 1", "Combo 2", "Combo 3"), + default_value="Combo 1", + readonly=False, + k="-COMBO-", + ), + sg.OptionMenu( + values=("Option 1", "Option 2", "Option 3"), k="-OPTION MENU-" + ), + ], + [ + sg.Spin([i for i in range(1, 11)], initial_value=10, k="-SPIN-"), + sg.Text("Spin"), + ], + [ + sg.Multiline( + "Demo of a Multi-Line Text Element!\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7\nYou get the point.", + size=(45, 5), + expand_x=True, + expand_y=True, + k="-MLINE-", + ) + ], + [ + sg.Button("Button"), + sg.Button("Popup"), + sg.Button(image_data=sg.DEFAULT_BASE64_ICON, key="-LOGO-"), + ], + ] + + asthetic_layout = [ + [sg.T("Anything that you would use for asthetics is in this tab!")], + [sg.Image(data=sg.DEFAULT_BASE64_ICON, k="-IMAGE-")], + [ + sg.ProgressBar(100, orientation="h", size=(20, 20), key="-PROGRESS BAR-"), + sg.Button("Test Progress bar"), + ], + ] + # output tab + logging_layout = [ + [sg.Text("Anything printed will display here!")], + [ + sg.Multiline( + size=(60, 15), + font="Courier 8", + expand_x=True, + expand_y=True, + write_only=True, + reroute_stdout=True, + reroute_stderr=True, + echo_stdout_stderr=True, + autoscroll=True, + auto_refresh=True, + ) + ] + # [sg.Output(size=(60,15), font='Courier 8', expand_x=True, expand_y=True)] + ] + + graphing_layout = [ + [sg.Text("Anything you would use to graph will display here!")], + [ + sg.Graph( + (200, 200), + (0, 0), + (200, 200), + background_color="black", + key="-GRAPH-", + enable_events=True, + right_click_menu=graph_right_click_menu_def, + ) + ], + [sg.T("Click anywhere on graph to draw a circle")], + [ + sg.Table( + values=data, + headings=headings, + max_col_width=25, + background_color="black", + auto_size_columns=True, + display_row_numbers=True, + justification="right", + num_rows=2, + alternating_row_color="black", + key="-TABLE-", + row_height=25, + ) + ], + ] + + popup_layout = [ + [sg.Text("Popup Testing")], + [sg.Button("Open Folder")], + [sg.Button("Open File")], + ] + + theme_layout = [ + [ + sg.Text( + "See how elements look under different themes by choosing a different theme here!" + ) + ], + [ + sg.Listbox( + values=sg.theme_list(), + size=(20, 12), + key="-THEME LISTBOX-", + enable_events=True, + ) + ], + [sg.Button("Set Theme")], + ] + + layout = [ + [sg.MenubarCustom(menu_def, key="-MENU-", font="Courier 15", tearoff=True)], + [ + sg.Text( + "Demo Of (Almost) All Elements", + size=(38, 1), + justification="center", + font=("Helvetica", 16), + relief=sg.RELIEF_RIDGE, + k="-TEXT HEADING-", + enable_events=True, + ) + ], + ] + layout += [ + [ + sg.TabGroup( + [ + [ + sg.Tab("Input Elements", input_layout), + sg.Tab("Asthetic Elements", asthetic_layout), + sg.Tab("Graphing", graphing_layout), + sg.Tab("Popups", popup_layout), + sg.Tab("Theming", theme_layout), + sg.Tab("Output", logging_layout), + ] + ], + key="-TAB GROUP-", + expand_x=True, + expand_y=True, + ), + ] + ] layout[-1].append(sg.Sizegrip()) - window = sg.Window('All Elements Demo', layout, right_click_menu=right_click_menu_def, right_click_menu_tearoff=True, grab_anywhere=True, resizable=True, margins=(0,0), use_custom_titlebar=True, finalize=True, keep_on_top=True) + window = sg.Window( + "All Elements Demo", + layout, + right_click_menu=right_click_menu_def, + right_click_menu_tearoff=True, + grab_anywhere=True, + resizable=True, + margins=(0, 0), + use_custom_titlebar=True, + finalize=True, + keep_on_top=True, + ) window.set_min_size(window.size) return window + def main(): window = make_window(sg.theme()) - - # This is an Event Loop + + # This is an Event Loop while True: event, values = window.read(timeout=100) # keep an animation running so show things are happening - window['-GIF-IMAGE-'].update_animation(sg.DEFAULT_BASE64_LOADING_GIF, time_between_frames=100) + window["-GIF-IMAGE-"].update_animation( + sg.DEFAULT_BASE64_LOADING_GIF, time_between_frames=100 + ) if event not in (sg.TIMEOUT_EVENT, sg.WIN_CLOSED): - print('============ Event = ', event, ' ==============') - print('-------- Values Dictionary (key=value) --------') + print("============ Event = ", event, " ==============") + print("-------- Values Dictionary (key=value) --------") for key in values: - print(key, ' = ',values[key]) - if event in (None, 'Exit'): + print(key, " = ", values[key]) + if event in (None, "Exit"): print("[LOG] Clicked Exit!") break - elif event == 'About': + elif event == "About": print("[LOG] Clicked About!") - sg.popup('PySimpleGUI Demo All Elements', - 'Right click anywhere to see right click menu', - 'Visit each of the tabs to see available elements', - 'Output of event and values can be see in Output tab', - 'The event and values dictionary is printed after every event', keep_on_top=True) - elif event == 'Popup': + sg.popup( + "PySimpleGUI Demo All Elements", + "Right click anywhere to see right click menu", + "Visit each of the tabs to see available elements", + "Output of event and values can be see in Output tab", + "The event and values dictionary is printed after every event", + keep_on_top=True, + ) + elif event == "Popup": print("[LOG] Clicked Popup Button!") sg.popup("You pressed a button!", keep_on_top=True) print("[LOG] Dismissing Popup!") - elif event == 'Test Progress bar': + elif event == "Test Progress bar": print("[LOG] Clicked Test Progress Bar!") - progress_bar = window['-PROGRESS BAR-'] + progress_bar = window["-PROGRESS BAR-"] for i in range(100): - print("[LOG] Updating progress bar by 1 step ("+str(i)+")") + print("[LOG] Updating progress bar by 1 step (" + str(i) + ")") progress_bar.update(current_count=i + 1) print("[LOG] Progress bar complete!") elif event == "-GRAPH-": - graph = window['-GRAPH-'] # type: sg.Graph - graph.draw_circle(values['-GRAPH-'], fill_color='yellow', radius=20) - print("[LOG] Circle drawn at: " + str(values['-GRAPH-'])) + graph = window["-GRAPH-"] # type: sg.Graph + graph.draw_circle(values["-GRAPH-"], fill_color="yellow", radius=20) + print("[LOG] Circle drawn at: " + str(values["-GRAPH-"])) elif event == "Open Folder": print("[LOG] Clicked Open Folder!") - folder_or_file = sg.popup_get_folder('Choose your folder', keep_on_top=True) + folder_or_file = sg.popup_get_folder("Choose your folder", keep_on_top=True) sg.popup("You chose: " + str(folder_or_file), keep_on_top=True) print("[LOG] User chose folder: " + str(folder_or_file)) elif event == "Open File": print("[LOG] Clicked Open File!") - folder_or_file = sg.popup_get_file('Choose your file', keep_on_top=True) + folder_or_file = sg.popup_get_file("Choose your file", keep_on_top=True) sg.popup("You chose: " + str(folder_or_file), keep_on_top=True) print("[LOG] User chose file: " + str(folder_or_file)) elif event == "Set Theme": print("[LOG] Clicked Set Theme!") - theme_chosen = values['-THEME LISTBOX-'][0] + theme_chosen = values["-THEME LISTBOX-"][0] print("[LOG] User Chose Theme: " + str(theme_chosen)) window.close() window = make_window(theme_chosen) - elif event == 'Edit Me': + elif event == "Edit Me": sg.execute_editor(__file__) - elif event == 'Versions': - sg.popup_scrolled(__file__, sg.get_versions(), keep_on_top=True, non_blocking=True) + elif event == "Versions": + sg.popup_scrolled( + __file__, sg.get_versions(), keep_on_top=True, non_blocking=True + ) window.close() exit(0) -if __name__ == '__main__': - sg.theme('black') - sg.theme('dark red') - sg.theme('dark green 7') + +if __name__ == "__main__": + sg.theme("black") + sg.theme("dark red") + sg.theme("dark green 7") # sg.theme('DefaultNoMoreNagging') - main() \ No newline at end of file + main()