diff --git a/DemoPrograms/Demo_SDK_Help_Func_Parms.py b/DemoPrograms/Demo_SDK_Help_Func_Parms.py new file mode 100644 index 00000000..269826ec --- /dev/null +++ b/DemoPrograms/Demo_SDK_Help_Func_Parms.py @@ -0,0 +1,110 @@ +import PySimpleGUI as sg +import inspect +import sys + +""" + Displays a window showing the parms for the PySimpleGUI functions + + The default view is to only show function names that are all lower case. + You can change this by right clicking and choosing "Upper Case Too" + + Copyright 2022 PySimpleGUI Project +""" + + +def main(): + """ + Display a window that will display the docstrings for each PySimpleGUI Element and the Window object + + """ + + sg.set_options(font='courier 12') + + functions = [m for m in inspect.getmembers(sys.modules['PySimpleGUI'], inspect.isfunction)] + functions_names_lower = [f for f in functions if f[0][0].islower()] + functions_names_upper = [f for f in functions if f[0][0].isupper()] + # functions_names = sorted(functions_names_lower) + sorted(functions_names_upper) + # func_names_str = [f[0] for f in functions if f[0][0].islower()] + func_names_str = [f[0] for f in functions] + + func_parm_dict = {} + + # for func_str, func in functions_names_lower: + for func_str, func in functions: + # Build info about init method + args = inspect.signature(func) + params = args.parameters + func_parm_list = [] + for a in params.values(): + func_def = str(a).split('=') + if len(func_def) == 1: + name, default = func_def[0], '*Required*' + if name[0] == '*': + default = '*Optional*' + elif len(func_def) == 2: + name, default = func_def[0], func_def[1] + elif len(func_def) == 0: + name, default = '', '' + else: + name, default = func_def[0], '*Object*' + func_parm_list.append((name, default)) + func_parm_dict[func_str] = func_parm_list + + sg.theme('black') + sg.theme_background_color('#131314') + sg.theme_text_element_background_color('#131314') + sg.theme_input_background_color('#131314') + ml = sg.Multiline(size=(35, 20), key='-ML-', write_only=True, reroute_stdout=False, expand_y=True, expand_x=True) + + layout = [ + [sg.Titlebar('Func Parm Viewer', background_color='#131314', text_color='white')], + # [sg.Combo([e for e in sorted(func_names_str)],background_color='#131314', size=(25,30), enable_events=True, key='-COMBO-'), sg.T(' '*6, grab=True)], + [sg.Combo([e for e in sorted([f[0] for f in functions if f[0][0].islower()])],background_color='#131314', size=(25,30), enable_events=True, readonly=True, expand_x=True, key='-COMBO-', tooltip='Right click for more options')], + sg.vtop([ml], expand_x=True, expand_y=True)] + [[sg.Sizegrip()]] + + window = sg.Window('Func Parms', layout, use_default_focus=False, keep_on_top=True, no_titlebar=True, margins=(0,0), right_click_menu=[[],['Edit Me', 'Upper Case Too', 'Lower Case Only', 'Exit']], resizable=True) + while True: # Event Loop + event, values = window.read() + if event in (sg.WIN_CLOSED, 'Exit'): + break + if event == 'Edit Me': + sg.execute_editor(__file__) + continue + elif event.startswith('Upper'): + window['-COMBO-'].update(values=[f[0] for f in functions if not f[0][0].startswith('_')]) + elif event.startswith('Lower'): + window['-COMBO-'].update(values=[f[0] for f in functions if f[0][0].islower()]) + else: + # ml.print(event, values) + if event == '-COMBO-': + func_chosen = values[event] + else: + func_chosen = None + window['-ML-'].update('') + + ml.print(f'= {func_chosen} =', background_color='#FFFF00', text_color='black') + func_parms = func_parm_dict[func_chosen] + # print(func_parms) + for parm, default in func_parms: + ml.print(f'{parm:18}', text_color='green yellow', end=' = ') + if default != inspect._empty: + if isinstance(default, str): + if default in ('None', '(None, None)', '(None,None)'): + color = 'pink' + elif default in ('False', 'True'): + color = '#00FF7F' + else: + color = None + ml.print(f'{default}', end='\n', text_color=color) + else: + ml.print(default, end='\n') + else: + ml.print(f'{default}', end='\n') + ml.set_vscroll_position(0) + + window.close() + + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/DemoPrograms/Demo_SDK_Help_Init_Update_Parms.py b/DemoPrograms/Demo_SDK_Help_Init_Update_Parms.py new file mode 100644 index 00000000..ff792193 --- /dev/null +++ b/DemoPrograms/Demo_SDK_Help_Init_Update_Parms.py @@ -0,0 +1,96 @@ +import PySimpleGUI as sg +import inspect + +""" + Displays a window showing the Init and Update parms for the PySimpleGUI Elements + + The Function based elements (e.g. Push) can be found using the Demo Program Demo_SDK_Help_Func_Parms.py + + If you've seen the Udemy course, then you saw this tool used in the element lessons + + The Pink parameter signify the "Common" paramters that are shared among many of the elements + + Copyright 2022 PySimpleGUI Project +""" + +def main(): + """ + Display a window that displays the parms for the init and update methods for each element + + """ + + common_parms = ['key','k','font','pad','p', 'visible','size','s', 'change_submits', 'enable_events','right_click_menu','tooltip','metadata', 'expand_x', 'expand_y'] + element_classes = sg.Element.__subclasses__() + element_names = {element.__name__: element for element in element_classes} + element_names['Window'] = sg.Window + element_names['SystemTray'] = sg.SystemTray + # vars3 = [m for m in inspect.getmembers(sys.modules[__name__])] + element_arg_default_dict = {} + element_arg_default_dict_update = {} + for element in element_classes: + # Build info about init method + args = inspect.getfullargspec(element.__init__).args[1:] + defaults = inspect.getfullargspec(element.__init__).defaults + if len(args) != len(defaults): + diff = len(args) - len(defaults) + defaults = ('NO DEFAULT',)*diff + defaults + args_defaults = [] + for i, a in enumerate(args): + args_defaults.append((a, defaults[i])) + element_arg_default_dict[element.__name__] = args_defaults + + # Build info about update method + args = inspect.getfullargspec(element.update).args[1:] + defaults = inspect.getfullargspec(element.update).defaults + if args is None or defaults is None: + element_arg_default_dict_update[element.__name__] = (('',''),) + continue + if len(args) != len(defaults): + diff = len(args) - len(defaults) + defaults = ('NO DEFAULT',)*diff + defaults + args_defaults = [] + for i, a in enumerate(args): + args_defaults.append((a, defaults[i])) + element_arg_default_dict_update[element.__name__] = args_defaults if len(args_defaults) else (('',''),) + + sg.theme('black') + sg.theme_background_color('#131314') + sg.theme_text_element_background_color('#131314') + sg.theme_input_background_color('#131314') + ml = sg.Multiline(size=(40, 30), key='-ML-', write_only=True, reroute_stdout=True, expand_y=True, expand_x=True) + layout = [ [sg.Titlebar('Element Init & Update Parm Viewer', background_color='#131314', text_color='white')], + [sg.Combo([e for e in sorted(element_names.keys())],background_color='#131314', size=(25,30), enable_events=True, readonly=True, expand_x=True, key='-COMBO-')], + sg.vtop([ml], expand_y=True, expand_x=True) ] + [[sg.Sizegrip()]] + # layout += [[Button('Exit', size=(15, 1))]] + + window = sg.Window('Init & Update Parms', layout, use_default_focus=False, keep_on_top=True, no_titlebar=True, margins=(0,0),font='Courier 12', right_click_menu=sg.MENU_RIGHT_CLICK_EDITME_EXIT, resizable=True) + # ml = window['-ML-'] # type: sg.MLine + while True: # Event Loop + event, values = window.read() + if event in (sg.WIN_CLOSED, 'Exit'): + break + # ml.print(event, values) + if event == '-COMBO-': + element_chosen = values[event] + else: + element_chosen = None + if element_chosen in element_arg_default_dict: + window['-ML-'].update('') + ml.print('========== Init Parms ==========', background_color='#FFFF00', text_color='black') + for parm, default in element_arg_default_dict[element_chosen]: + ml.print(f'{parm:18}', text_color='hot pink' if parm in common_parms else 'green yellow', end=' = ') + ml.print(default, text_color='hot pink' if parm in common_parms else 'white', end = ',\n') + ml.print('========== Update Parms ==========', background_color='#FFFF00', text_color='black') + # print(element_arg_default_dict_update[element_chosen]) + for parm, default in element_arg_default_dict_update[element_chosen]: + ml.print(f'{parm:18}', text_color='hot pink' if parm in common_parms else 'green yellow', end=' = ') + ml.print(default, text_color='hot pink' if parm in common_parms else 'white', end = ',\n') + elif event == 'Edit Me': + sg.execute_editor(__file__) + + window.close() + + + +if __name__ == '__main__': + main() \ No newline at end of file