Merge pull request #3160 from PySimpleGUI/Dev-latest

Dev latest
This commit is contained in:
PySimpleGUI 2020-07-18 15:37:15 -04:00 committed by GitHub
commit 5624f8ae14
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 37 additions and 30 deletions

View File

@ -1,8 +1,8 @@
import threading
import time
import PySimpleGUI as sg
"""
Threaded Demo - Uses Window.write_event_value communications
@ -30,8 +30,7 @@ def the_thread(window):
i = 0
while True:
time.sleep(1)
sg.cprint(f'thread info (in thread) = {threading.current_thread().name}', c='white on purple')
window.write_event_value('-THREAD-', i)
window.write_event_value('-THREAD-', (threading.current_thread().name, i)) # Data sent is a tuple of thread name and counter
i += 1
@ -40,27 +39,27 @@ def main():
The demo will display in the multiline info about the event and values dictionary as it is being
returned from window.read()
Every time "Start" is clicked a new thread is started
Try clicking "go" to see that the window is active while the thread stuff is happening in the background
Try clicking "Dummy" to see that the window is active while the thread stuff is happening in the background
"""
layout = [ [sg.Text('My Window')],
[sg.Multiline(size=(40,20), key='-ML-', autoscroll=True, reroute_stdout=True, write_only=True, reroute_cprint=True)],
[sg.Input(key='-IN-')],
[sg.Button('Go'), sg.B('Start'), sg.Button('Exit')] ]
layout = [ [sg.Text('Output Area - cprint\'s route to here', font='Any 15')],
[sg.Multiline(size=(65,20), key='-ML-', autoscroll=True, reroute_stdout=True, write_only=True, reroute_cprint=True)],
[sg.T('Input so you can see data in your dictionary')],
[sg.Input(key='-IN-', size=(30,1))],
[sg.B('Start A Thread'), sg.B('Dummy'), sg.Button('Exit')] ]
window = sg.Window('Window Title', layout)
while True: # Event Loop
event, values = window.read()
sg.cprint(event, values)
sg.cprint(f'thread info = {threading.current_thread().name}')
if event == sg.WIN_CLOSED or event == 'Exit':
break
if event == 'Start':
thread = threading.Thread(target=the_thread, args=(window,), daemon=True)
thread.start()
if event.startswith('Start'):
threading.Thread(target=the_thread, args=(window,), daemon=True).start()
if event == THREAD_EVENT:
sg.cprint(f'Data from the thread = {values[THREAD_EVENT]}', colors='white on red')
sg.cprint(f'Data from the thread ', colors='white on purple', end='')
sg.cprint(f'{values[THREAD_EVENT]}', colors='white on red')
window.close()

View File

@ -1,6 +1,6 @@
#!/usr/bin/python3
version = __version__ = "4.25.0.1 Unreleased\nMoved creation of the multi-threaded "
version = __version__ = "4.26.0 Released 18-Jul-2020"
port = 'PySimpleGUI'
@ -6973,7 +6973,6 @@ class Window:
self.user_bind_event = None # Used when user defines a tkinter binding using bind method - event data from tkinter
self.modal = modal
self.thread_queue = None # type: queue.Queue
self.thread_key = None # type: Any
self.thread_strvar = None # type: tk.StringVar
self.read_closed_window_count = 0
@ -8295,15 +8294,11 @@ class Window:
def _create_thread_queue(self, key):
def _create_thread_queue(self):
"""
Sets the key that will be returned if a thread communicates with this window.
:param key:
:type key: Any
Creates the queue used by threads to communicate with this window
"""
self.thread_key = key
if self.thread_queue is None:
self.thread_queue = queue.Queue()
@ -8312,7 +8307,7 @@ class Window:
self.thread_strvar.trace('w', self._window_tkvar_changed_callback)
def write_event_value(self, key=None, value=None):
def write_event_value(self, key, value):
"""
Adds a key & value tuple to the queue that is used by threads to communicate with the window
@ -8323,12 +8318,11 @@ class Window:
"""
if self.thread_queue is None:
self._create_thread_queue(key)
print('*** Warning Window.write_event_value - no thread queue found ***')
return
if self.thread_queue:
key = key if key is not None else self.thread_key
self.thread_queue.put(item=(key, value))
self.thread_strvar.set('new item')
self.thread_queue.put(item=(key, value))
self.thread_strvar.set('new item')
def _queued_event_read(self):
@ -12045,7 +12039,7 @@ def StartupTK(my_flex_form):
my_flex_form.TKroot = root
my_flex_form._create_thread_queue('initialized queue')
my_flex_form._create_thread_queue()
# Make moveable window
if (my_flex_form.GrabAnywhere is not False and not (

View File

@ -3434,7 +3434,7 @@ Parameter Descriptions:
|Type|Name|Meaning|
|--|--|--|
| str | default_text | Text initially shown in the input box as a default value(Default value = '') |
| Any | default_text | Text initially shown in the input box as a default value(Default value = ''). Will automatically be converted to string |
| (int, int) (width, height) | size | w=characters-wide, h=rows-high |
| bool | disabled | set disable state for element (Default = False) |
| char | password_char | Password character if this is a password field (Default value = '') |
@ -9869,7 +9869,7 @@ Returns True if the window was closed
Adds a key & value tuple to the queue that is used by threads to communicate with the window
```
write_event_value(key=None, value=None)
write_event_value(key, value)
```
Parameter Descriptions:

View File

@ -7384,6 +7384,13 @@ k element parameter
* New global variable __tclversion_detailed__ - string with full tkinter version (3 numbers instead of 2)
* Warning is displayed if tcl version is found to be 8.5.
## 4.26.0 PySimpleGUI 18-Jul-2020
* Multi-threaded tkvar initialization location changed so that thread doesn't intialize it now
* Removed thread key - no longer needed
* Window.write_event_values - now requires both parms
* Upgrade button typo
### Upcoming
There will always be overlapping work as the ports will never actually be "complete" as there's always something new that can be built. However there's a definition for the base functionality for PySimpleGUI. This is what is being strived for with the current ports that are underway.

View File

@ -7384,6 +7384,13 @@ k element parameter
* New global variable __tclversion_detailed__ - string with full tkinter version (3 numbers instead of 2)
* Warning is displayed if tcl version is found to be 8.5.
## 4.26.0 PySimpleGUI 18-Jul-2020
* Multi-threaded tkvar initialization location changed so that thread doesn't intialize it now
* Removed thread key - no longer needed
* Window.write_event_values - now requires both parms
* Upgrade button typo
### Upcoming
There will always be overlapping work as the ports will never actually be "complete" as there's always something new that can be built. However there's a definition for the base functionality for PySimpleGUI. This is what is being strived for with the current ports that are underway.