diff --git a/DemoPrograms/Demo_System_Tray_GUI_Window_Design_Pattern.py b/DemoPrograms/Demo_System_Tray_GUI_Window_Design_Pattern.py new file mode 100644 index 00000000..7fcefa1a --- /dev/null +++ b/DemoPrograms/Demo_System_Tray_GUI_Window_Design_Pattern.py @@ -0,0 +1,85 @@ +import PySimpleGUI as sg +# import PySimpleGUIWx as sg +# import PySimpleGUIQt as sg +import time + +""" + Design pattern - System Tray and GUI Window + + This design pattern will show you how to run a system tray icon and a GUI window + simultaneously. BOTH the system tray and the window will be active at the same time. + + The "close window" action is similar to what most windows programs do that have a tray icon. + When you close the window with an "X", it closes the GUI window and shows a message in the + tray that the window has been "Minimized". + + To make things "easier", a new window is created each time rather than trying to hide and unhide. + On some systems, the hide method doesn't work very well (Raspberry Pi for example). + + You can "Minimize" to the tray in 3 ways in this program: + 1. Click the "X" on the window + 2. Click the button "Minimize to tray" + 3. Right click tray icon and choose "Hide" + + To exit the entire program, you will need to do this from the System tray by choosing "Exit" + + Copyright 2020 PySimpleGUI.org +""" + +icon = sg.DEFAULT_BASE64_ICON + +sg.theme('Dark Red') +delay_time = 15 * 60 + +def time_as_int(): + return int(round(time.time())) + +def make_a_window(): + + layout = [ [sg.Text(f'{delay_time // 60 % 60:2}:{delay_time % 60:02}', key='-OUT-', size=(20, 2), justification='c', font='Any 24')], + [sg.Button('Start', size=(10,1))],[sg.Button('Minimize\nTo Tray', size=(10,2))] ] + + return sg.Window('Window Title', layout, element_justification='c', icon=icon) + +def main(): + + menu_def = ['UNUSED', ['Show','Hide','Exit']] + + tray = sg.SystemTray(menu=menu_def, data_base64=icon) + window = make_a_window() + start, current, paused = time_as_int(), 0, True + + while True: + event = tray.read(timeout=100) + if event == 'Exit': + break + elif event in('Show', sg.EVENT_SYSTEM_TRAY_ICON_DOUBLE_CLICKED) and not window: + print('Showing a new window') + window, paused = make_a_window(), True + elif event == 'Hide' and window: + window.close() + window = None + + if window: + event, values = window.read(timeout=1000) + if event in (sg.WIN_CLOSED, 'Minimize\nTo Tray'): + print('Minimizing to tray') + tray.show_message('Minimizing', 'Minimizing to Tray') + window.close() + window = None + continue + elif event == 'Start': + start, paused = time_as_int(), False + if not paused: + remaining = delay_time - (time_as_int() - start) + if remaining < 0: + tray.show_message('Look away', 'It is time to look away for 20 seconds') + start = time_as_int() + else: + window['-OUT-'].update(f'{remaining//60%60:2}:{remaining%60:02}') + tray.close() + if window: + window.close() + + +main() \ No newline at end of file