From e6d0eca440387521c382b85a23f79933ae3d8286 Mon Sep 17 00:00:00 2001 From: PySimpleGUI Date: Sat, 18 Jul 2020 15:34:48 -0400 Subject: [PATCH 1/2] Release 4.26.0 --- PySimpleGUI.py | 24 +++++++++--------------- docs/call reference.md | 4 ++-- docs/index.md | 7 +++++++ readme.md | 7 +++++++ 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/PySimpleGUI.py b/PySimpleGUI.py index 0d8a92b3..3a293d68 100644 --- a/PySimpleGUI.py +++ b/PySimpleGUI.py @@ -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 ( diff --git a/docs/call reference.md b/docs/call reference.md index d55ca0fc..b033d297 100644 --- a/docs/call reference.md +++ b/docs/call reference.md @@ -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: diff --git a/docs/index.md b/docs/index.md index 0f65fd8f..9b606cba 100644 --- a/docs/index.md +++ b/docs/index.md @@ -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. diff --git a/readme.md b/readme.md index 0f65fd8f..9b606cba 100644 --- a/readme.md +++ b/readme.md @@ -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. From 110e5a0dafd9aeb94e1a067acfd0af9448d41246 Mon Sep 17 00:00:00 2001 From: PySimpleGUI Date: Sat, 18 Jul 2020 15:36:12 -0400 Subject: [PATCH 2/2] Removed cprint from thread. Added dummy button --- .../Demo_Multithreaded_Write_Event_Value.py | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/DemoPrograms/Demo_Multithreaded_Write_Event_Value.py b/DemoPrograms/Demo_Multithreaded_Write_Event_Value.py index 485ae8ee..1ffedfd4 100644 --- a/DemoPrograms/Demo_Multithreaded_Write_Event_Value.py +++ b/DemoPrograms/Demo_Multithreaded_Write_Event_Value.py @@ -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()