From 799ce7c9c15408ec6c08cdad1e888de2b81db75c Mon Sep 17 00:00:00 2001 From: PySimpleGUI Date: Thu, 18 Mar 2021 21:31:11 -0400 Subject: [PATCH 1/2] Most complete "Desktop Widget" design pattern. Can choose the theme, alpha channel, location, and it's all saved in the settings file for the future sessions. 99 lines... not bad for 99 lines..... --- .../Demo_Desktop_Widget_Days_Counter.py | 80 +++++++++++++++---- 1 file changed, 64 insertions(+), 16 deletions(-) diff --git a/DemoPrograms/Demo_Desktop_Widget_Days_Counter.py b/DemoPrograms/Demo_Desktop_Widget_Days_Counter.py index 97e0b7ce..5a9d690b 100644 --- a/DemoPrograms/Demo_Desktop_Widget_Days_Counter.py +++ b/DemoPrograms/Demo_Desktop_Widget_Days_Counter.py @@ -17,45 +17,83 @@ import datetime ALPHA = 0.9 THEME = 'Dark green 3' # May add ability to change theme from the user interface. For now forcing to constant -sg.user_settings_set_entry('-theme-', THEME) GSIZE = (160, 160) UPDATE_FREQUENCY_MILLISECONDS = 1000*60*60 # update every hour -def main(location): +def choose_theme(location): + layout = [ + [sg.Text('Try a theme')], + [sg.Listbox(values=sg.theme_list(), size=(20, 20), key='-LIST-', enable_events=True)], + [sg.OK(), sg.Cancel()]] + + window = sg.Window('Look and Feel Browser', layout, location=location) + old_theme = sg.theme() + while True: # Event Loop + event, values = window.read() + if event in (sg.WIN_CLOSED, 'Exit', 'OK', 'Cancel'): + break + sg.theme(values['-LIST-'][0]) + test_window=make_window(location=(location[0]-200, location[1]), test_window=True) + test_window.read(close=True) + if sg.popup_yes_no(f'Do you want to keep {values["-LIST-"]}?', location=location) == 'Yes': + break + window.close() + + if event not in ('Cancel', sg.WIN_CLOSED) and values['-LIST-']: + sg.theme(values['-LIST-'][0]) + sg.user_settings_set_entry('-theme-', values['-LIST-'][0]) + return values['-LIST-'][0] + else: + sg.theme(old_theme) + return None + +def make_window(location, test_window=False): title = sg.user_settings_get_entry('-title-', '') - # May add ability to change theme from the user interface. For now use constant - theme = sg.user_settings_get_entry('-theme-', THEME) - sg.theme(theme) + if not test_window: + theme = sg.user_settings_get_entry('-theme-', THEME) + sg.theme(theme) + + alpha = sg.user_settings_get_entry('-alpha-', ALPHA) font = 'Courier 70' - title_font = 'Courier 8' - refresh_font = 'Courier 8' + refresh_font = title_font = 'Courier 8' layout = [ [sg.Text(title, size=(20,1), font=title_font, justification='c', k='-TITLE-')], - [sg.Text(size=(3,1), font=font, k='-T-', justification='c')], - [sg.pin(sg.Text(size=(15,2), font=refresh_font, k='-REFRESHED-', justification='c'))], - ] + [sg.Text('0', size=(3,1), font=font, k='-T-', justification='c', enable_events=test_window)]] - window = sg.Window('Day Number', layout, location=location, no_titlebar=True, grab_anywhere=True, margins=(0, 0), element_justification='c', element_padding=(0, 0), alpha_channel=ALPHA, finalize=True, right_click_menu=[[''], ['Choose Date', 'Choose Title', 'Edit Me', 'Refresh', 'Show Refresh', 'Hide Refresh', 'Exit']]) + if test_window: + layout += [[sg.Text('Click to close', font=title_font)]] + right_click_menu = [[''], ['Choose Date', 'Exit']] + else: + right_click_menu = [[''], ['Choose Date', 'Choose Title', 'Edit Me', 'Theme', 'Save Location', 'Refresh', 'Show Refresh', 'Hide Refresh', 'Alpha', [str(x) for x in range(1,11)],'Exit', ]] + layout += [[sg.pin(sg.Text(size=(15,2), font=refresh_font, k='-REFRESHED-', justification='c'))]] + + + window = sg.Window('Day Number', layout, location=location, no_titlebar=True, grab_anywhere=True, margins=(0, 0), element_justification='c', element_padding=(0, 0), alpha_channel=alpha, finalize=True, right_click_menu=right_click_menu) + + window['-REFRESHED-'].update(visible=sg.user_settings_get_entry('-show refresh-', True)) + return window + +def main(location): + loc = sg.user_settings_get_entry('-location-', location) + window = make_window(loc) saved_date = sg.user_settings_get_entry('-start date-', (1,1,2021)) start_date = datetime.datetime(saved_date[2], saved_date[0], saved_date[1]) - window['-REFRESHED-'].update(visible=sg.user_settings_get_entry('-show refresh-', True)) while True: # Event Loop # First update the status information - now = datetime.datetime.now() - delta =now-start_date + delta = datetime.datetime.now() - start_date window['-T-'].update(f'{delta.days}') # for debugging show the last update date time - date_time = now.strftime("%m/%d/%Y\n%I:%M:%S %p") - window['-REFRESHED-'].update(f'{date_time}') + window['-REFRESHED-'].update(datetime.datetime.now().strftime("%m/%d/%Y\n%I:%M:%S %p")) # -------------- Start of normal event loop -------------- event, values = window.read(timeout=UPDATE_FREQUENCY_MILLISECONDS) + print(event, values) if event == sg.WIN_CLOSED or event == 'Exit': break if event == 'Edit Me': @@ -73,9 +111,19 @@ def main(location): elif event == 'Show Refresh': window['-REFRESHED-'].update(visible=True) sg.user_settings_set_entry('-show refresh-', True) + elif event == 'Save Location': + sg.user_settings_set_entry('-location-', window.current_location()) elif event == 'Hide Refresh': window['-REFRESHED-'].update(visible=False) sg.user_settings_set_entry('-show refresh-', False) + elif event in [str(x) for x in range(1,11)]: + window.set_alpha(int(event)/10) + sg.user_settings_set_entry('-alpha-', int(event)/10) + elif event == 'Theme': + loc = window.current_location() + if choose_theme(loc) is not None: + # this is result of hacking code down to 99 lines in total. Not tried it before. Interesting test. + _, window = window.close(), make_window(loc) window.close() From 88ed763023150f193f353da40f025164f252f59e Mon Sep 17 00:00:00 2001 From: PySimpleGUI Date: Thu, 18 Mar 2021 21:34:19 -0400 Subject: [PATCH 2/2] Open get title and get date windows at same location as the main window --- DemoPrograms/Demo_Desktop_Widget_Days_Counter.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DemoPrograms/Demo_Desktop_Widget_Days_Counter.py b/DemoPrograms/Demo_Desktop_Widget_Days_Counter.py index 5a9d690b..bebdf2c2 100644 --- a/DemoPrograms/Demo_Desktop_Widget_Days_Counter.py +++ b/DemoPrograms/Demo_Desktop_Widget_Days_Counter.py @@ -99,12 +99,12 @@ def main(location): if event == 'Edit Me': sg.execute_editor(__file__) elif event == 'Choose Date': - new_start = sg.popup_get_date() + new_start = sg.popup_get_date(location=window.current_location()) if new_start is not None: start_date = datetime.datetime(new_start[2], new_start[0], new_start[1]) sg.user_settings_set_entry('-start date-', new_start) elif event == 'Choose Title': - new_title = sg.popup_get_text('Choose a title for your date') + new_title = sg.popup_get_text('Choose a title for your date', location=window.current_location()) if new_title is not None: window['-TITLE-'].update(new_title) sg.user_settings_set_entry('-title-', new_title)