New Demo - Dispatchers - from the Udemy course

This commit is contained in:
PySimpleGUI 2021-05-02 10:46:19 -04:00
parent abf98c4a56
commit 3ccd004865
1 changed files with 108 additions and 0 deletions

View File

@ -0,0 +1,108 @@
"""
Demo Dispatchers
Alternative to if/else event processing
Adapted from "The Official Python GUI Programming with PySimpleGUI Course"
Most PySimpleGUI demos follow the simple if-else event processing, but there are
other ways to process or dispatch events.
Event Dispatchers:
* If-Else
* Dictionaries
* Functions as keys
The handlers in this demo are all functions that are called once the event is detected
The dispatch dictionary maps from an event to a function. It's more compact than a series
of if/else statements if you have a lot of different events and are handling events in functions
Keep it SIMPLE. Add complexity as you need it. If it is clearer to do the event processing in the
event loop rather than functions, then do it in the event loop.
http://www.PySimpleGUI.org
Copyright 2021 PySimpleGUI
"""
import PySimpleGUI as sg
SYMBOL_X = ''
SYMBOL_CHECK = ''
## ## ## # # #### # ###### ##### ####
## ## # # ## # # # # # # # # #
## ## # # # # # # # # # # # #
####### ###### # # # # # # #### ##### ####
## ## # # # ## # # # # # # #
## ## # # # # # # # # # # # #
## ## # # # # #### ###### ###### # # ####
def do_go(window):
window['-STATUS-'].update(SYMBOL_CHECK, text_color='pink')
def do_stop(window):
window['-STATUS-'].update(SYMBOL_CHECK, text_color='pink')
def do_tuple(window):
window['-STATUS-'].update(SYMBOL_CHECK, text_color='pink')
def do_other(window):
window['-STATUS-'].update(SYMBOL_CHECK, text_color='yellow')
def do_simple(window):
window['-STATUS-'].update(SYMBOL_CHECK, text_color='yellow')
def do_not_found(window):
window['-STATUS-'].update(SYMBOL_X, text_color='red')
# # ## ### # #
## ## # # # ## #
# ## # # # # # # #
# ## # ###### # # # #
# # # # # # ##
# # # # # # #
# # # # ### # #
def main():
# --------- A Dispatch Dictionary -------
dispatch_dict = {'Go':do_go, 'Stop':do_stop, (1,2):do_tuple}
# --------- Define layout and create Window -------
layout = [[sg.Text('Dispatching Approaches')],
[sg.Text('Status:'), sg.Text(size=(3, 1), key='-STATUS-')],
[sg.Text(size=(50, 1), key='-OUT-')],
[sg.Button('Simple'), sg.Button('Go'), sg.Button('Stop'), sg.Button('Other', key=do_other),
sg.Button('Tuple', key=(1,2)), sg.Button('Bad')]]
window = sg.Window('Dispatchers', layout, font='Default 16', keep_on_top=True)
# --------- Event Loop -------
while True:
event, values = window.read()
if event == sg.WIN_CLOSED: # Test for window closed (always do this one)
break
window['-OUT-'].update(f'Event = {event}')
# --------- Dispatching of events ---------
# Event processing.... a minimal if-else to show 3 dispatchers
if event == 'Simple': # Dispatch using direct string compare
do_simple(window)
elif callable(event): # Dispatch when event is a function
event(window)
elif event in dispatch_dict: # Dispatch using a dispatch dictionary
func = dispatch_dict.get(event)
func(window)
else: # None of the above
do_not_found(window)
# --------- After event loop ---------
window.close()
if __name__ == '__main__':
main()