From 799ce7c9c15408ec6c08cdad1e888de2b81db75c Mon Sep 17 00:00:00 2001 From: PySimpleGUI Date: Thu, 18 Mar 2021 21:31:11 -0400 Subject: [PATCH] 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()