Merge pull request #1406 from PySimpleGUI/Dev-latest
New Demo program showing long tasks
This commit is contained in:
commit
6af5d9176b
|
@ -0,0 +1,74 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
import queue
|
||||||
|
import threading
|
||||||
|
import time
|
||||||
|
|
||||||
|
import PySimpleGUI as sg
|
||||||
|
|
||||||
|
# Put your long-running code in here
|
||||||
|
def worker_thread(thread_name, gui_queue):
|
||||||
|
print('Starting thread - {} '.format(thread_name))
|
||||||
|
# this is our "long running function call"
|
||||||
|
time.sleep(5) # sleep for a while
|
||||||
|
|
||||||
|
# at the end of the work, before exiting, send a message back to the GUI indicating end
|
||||||
|
gui_queue.put('{} - done'.format(thread_name)) # put a message into queue for GUI
|
||||||
|
|
||||||
|
|
||||||
|
###### ## ## ####
|
||||||
|
## ## ## ## ##
|
||||||
|
## ## ## ##
|
||||||
|
## #### ## ## ##
|
||||||
|
## ## ## ## ##
|
||||||
|
## ## ## ## ##
|
||||||
|
###### ####### ####
|
||||||
|
|
||||||
|
def the_gui(gui_queue):
|
||||||
|
|
||||||
|
layout = [[sg.Text('Multithreaded Work Example')],
|
||||||
|
[sg.Text('', size=(25, 1), key='_OUTPUT_')],
|
||||||
|
# [sg.Output(size=(40,6))],
|
||||||
|
[sg.Button('Go'), sg.Button('Exit')], ]
|
||||||
|
|
||||||
|
window = sg.Window('Multithreaded Window').Layout(layout)
|
||||||
|
# --------------------- EVENT LOOP ---------------------
|
||||||
|
message = None
|
||||||
|
while True:
|
||||||
|
event, values = window.Read(timeout=100) # wait for up to 100 ms for a GUI event
|
||||||
|
if event is None or event == 'Exit':
|
||||||
|
break
|
||||||
|
if event == 'Go':
|
||||||
|
window.Element('_OUTPUT_').Update('Starting long work....')
|
||||||
|
# simulate STARTING long run by starting a thread
|
||||||
|
threading.Thread(target=worker_thread, args=('Thread 1', gui_queue,), daemon=True).start()
|
||||||
|
|
||||||
|
# --------------- Loop through all messages coming in from threads ---------------
|
||||||
|
try: # see if something has been posted to Queue
|
||||||
|
message = gui_queue.get_nowait()
|
||||||
|
except queue.Empty: # get_nowait() will get exception when Queue is empty
|
||||||
|
pass # nothing in queue so do nothing
|
||||||
|
|
||||||
|
# if message received from queue, display the message in the Window
|
||||||
|
if message is not None and message.startswith('Thread 1'):
|
||||||
|
# this is the place you would execute code at ENDING of long running task
|
||||||
|
window.Element('_OUTPUT_').Update(message)
|
||||||
|
window.Refresh() # do a refresh because could be showing multiple messages before next Read
|
||||||
|
message = None
|
||||||
|
|
||||||
|
# if user exits the window, then close the window and exit the GUI func
|
||||||
|
window.Close()
|
||||||
|
|
||||||
|
|
||||||
|
## ## ### #### ## ##
|
||||||
|
### ### ## ## ## ### ##
|
||||||
|
#### #### ## ## ## #### ##
|
||||||
|
## ### ## ## ## ## ## ## ##
|
||||||
|
## ## ######### ## ## ####
|
||||||
|
## ## ## ## ## ## ###
|
||||||
|
## ## ## ## #### ## ##
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# -- Create a Queue to communicate with GUI --
|
||||||
|
gui_queue = queue.Queue() # queue used to communicate between the gui and the threads
|
||||||
|
the_gui(gui_queue)
|
||||||
|
print('Exiting Program')
|
Loading…
Reference in New Issue