PySimpleGUI/DemoPrograms/Demo_Multithreaded_Long_Tas...

74 lines
2.9 KiB
Python
Raw Normal View History

#!/usr/bin/python3
import time
import PySimpleGUI as sg
"""
Demo Program - Multithreaded Long Tasks GUI
Presents one method for running long-running operations in a PySimpleGUI environment.
The PySimpleGUI code, and thus the underlying GUI framework, runs as the primary, main thread
The "long work" is contained in the thread that is being started.
So that you don't have to import and understand the threading module, this program uses window.start_thread to run a thread.
The thread is using TUPLES for its keys. This enables you to easily find the thread events by looking at event[0].
The Thread Keys look something like this: ('-THREAD-', message)
If event [0] == '-THREAD-' then you know it's one of these tuple keys.
Copyright 2022 PySimpleGUI
"""
def long_operation_thread(seconds, window):
"""
A worker thread that communicates with the GUI through a queue
This thread can block for as long as it wants and the GUI will not be affected
:param seconds: (int) How long to sleep, the ultimate blocking call
:param window: (sg.Window) the window to communicate with
:return:
"""
window.write_event_value(('-THREAD-', 'Starting thread - will sleep for {} seconds'.format(seconds)), None)
time.sleep(seconds) # sleep for a while
window.write_event_value(('-THREAD-', '** DONE **'), 'Done!') # put a message into queue for GUI
def the_gui():
"""
Starts and executes the GUI
Reads data from a Queue and displays the data to the window
Returns when the user exits / closes the window
"""
2019-12-24 23:52:47 +00:00
sg.theme('Light Brown 3')
layout = [[sg.Text('Long task to perform example')],
[sg.Output(size=(70, 12))],
[sg.Text('Number of seconds your task will take'),
sg.Input(default_text=5, key='-SECONDS-', size=(5, 1)),
sg.Button('Do Long Task', bind_return_key=True)],
[sg.Button('Click Me'), sg.Button('Exit')], ]
window = sg.Window('Multithreaded Window', layout)
# --------------------- EVENT LOOP ---------------------
while True:
event, values = window.read()
if event in (sg.WIN_CLOSED, 'Exit'):
break
elif event == 'Do Long Task':
seconds = int(values['-SECONDS-'])
print('Thread ALIVE! Long work....sending value of {} seconds'.format(seconds))
window.start_thread(lambda: long_operation_thread(seconds, window), ('-THREAD-', '-THEAD ENDED-'))
elif event == 'Click Me':
print('Your GUI is alive and well')
elif event[0] == '-THREAD-':
print('Got a message back from the thread: ', event[1])
# if user exits the window, then close the window and exit the GUI func
window.close()
if __name__ == '__main__':
the_gui()
print('Exiting Program')