New Demo - Dispatchers - from the Udemy course
This commit is contained in:
parent
abf98c4a56
commit
3ccd004865
|
@ -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()
|
Loading…
Reference in New Issue