Merge pull request #3260 from PySimpleGUI/Dev-latest

Dev latest
This commit is contained in:
PySimpleGUI 2020-08-07 07:35:33 -04:00 committed by GitHub
commit 1d93cb7e26
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 97 additions and 7 deletions

View File

@ -4,43 +4,54 @@ import PySimpleGUI as sg
Both windows are immediately visible. Each window updates the other. Both windows are immediately visible. Each window updates the other.
There's an added capability to "re-open" window 2 should it be closed. This is done by simply calling the make_win2 function
again when the button is pressed in window 1.
The program exits when both windows have been closed
Copyright 2020 PySimpleGUI.org Copyright 2020 PySimpleGUI.org
""" """
def make_win1(): def make_win1():
layout = [[sg.Text('Window 1')], layout = [[sg.Text('Window 1')],
[sg.Text('Enter something to output to Window 2')], [sg.Text('Enter something to output to Window 2')],
[sg.Input(key='-IN-')], [sg.Input(key='-IN-', enable_events=True)],
[sg.Text(size=(25,1), key='-OUTPUT-')], [sg.Text(size=(25,1), key='-OUTPUT-')],
[sg.Button('Output to Window 2'), sg.Button('Exit')]] [sg.Button('Reopen')],
[sg.Button('Exit')]]
return sg.Window('Window Title', layout, finalize=True) return sg.Window('Window Title', layout, finalize=True)
def make_win2(): def make_win2():
layout = [[sg.Text('Window 2')], layout = [[sg.Text('Window 2')],
[sg.Text('Enter something to output to Window 1')], [sg.Text('Enter something to output to Window 1')],
[sg.Input(key='-IN-')], [sg.Input(key='-IN-', enable_events=True)],
[sg.Text(size=(25,1), key='-OUTPUT-')], [sg.Text(size=(25,1), key='-OUTPUT-')],
[sg.Button('Output to Window 1'), sg.Button('Exit')]] [sg.Button('Exit')]]
return sg.Window('Window Title', layout, finalize=True) return sg.Window('Window Title', layout, finalize=True)
def main(): def main():
window1, window2 = make_win1(), make_win2() window1, window2 = make_win1(), make_win2()
window2.move(window1.current_location()[0], window1.current_location()[1]+200) window2.move(window1.current_location()[0], window1.current_location()[1]+220)
while True: # Event Loop while True: # Event Loop
window, event, values = sg.read_all_windows() window, event, values = sg.read_all_windows()
if window == sg.WIN_CLOSED: # if all windows were closed if window == sg.WIN_CLOSED: # if all windows were closed
break break
if event == sg.WIN_CLOSED or event == 'Exit': if event == sg.WIN_CLOSED or event == 'Exit':
window.close() window.close()
if window == window2: # if closing win 2, mark as closed if window == window2: # if closing win 2, mark as closed
window2 = None window2 = None
elif window == window1: # if closing win 1, exit program elif window == window1: # if closing win 1, mark as closed
window1 = None window1 = None
elif event.startswith('Output to'): elif event == 'Reopen':
if not window2:
window2 = make_win2()
window2.move(window1.current_location()[0], window1.current_location()[1] + 220)
elif event == '-IN-':
output_window = window2 if window == window1 else window1 output_window = window2 if window == window1 else window1
if output_window: # if a valid window, then output to it if output_window: # if a valid window, then output to it
output_window['-OUTPUT-'].update(values['-IN-']) output_window['-OUTPUT-'].update(values['-IN-'])

View File

@ -2871,6 +2871,85 @@ while True: # Event Loop
window.close() window.close()
``` ```
---------------------
# Recipe Multiple Windows - `read_all_windows`
Beginning in version 4.28.0 you'll find that working with multiple windows in the tkinter port of PySimpleGUI to be much much easier.
This Recipe shows 2 windows. Both of them are active and can be interacted with. When you enter something in window 1 it is updated in window 2. Notice that the keys are named the same in both windows. This makes it really easy to write generic code that will update fields in either window, the only difference will be which Window is updated.
You'll find that you'll have less chances for problems like "reusing layouts" if you put your layout and window creation into a function. This will guarantee a "fresh" window every time you call the function. If you close window 2 and then click the "Reopen" button in window 1, then all that is needed is to call the `make_win2` function again and move the new window to the location below the first window.
The program remains active until both windows have been closed.
```python
import PySimpleGUI as sg
"""
Demo - 2 simultaneous windows using read_all_window
Both windows are immediately visible. Each window updates the other.
Copyright 2020 PySimpleGUI.org
"""
def make_win1():
layout = [[sg.Text('Window 1')],
[sg.Text('Enter something to output to Window 2')],
[sg.Input(key='-IN-', enable_events=True)],
[sg.Text(size=(25,1), key='-OUTPUT-')],
[sg.Button('Reopen')],
[sg.Button('Exit')]]
return sg.Window('Window Title', layout, finalize=True)
def make_win2():
layout = [[sg.Text('Window 2')],
[sg.Text('Enter something to output to Window 1')],
[sg.Input(key='-IN-', enable_events=True)],
[sg.Text(size=(25,1), key='-OUTPUT-')],
[sg.Button('Exit')]]
return sg.Window('Window Title', layout, finalize=True)
def main():
window1, window2 = make_win1(), make_win2()
window2.move(window1.current_location()[0], window1.current_location()[1]+220)
while True: # Event Loop
window, event, values = sg.read_all_windows()
if window == sg.WIN_CLOSED: # if all windows were closed
break
if event == sg.WIN_CLOSED or event == 'Exit':
window.close()
if window == window2: # if closing win 2, mark as closed
window2 = None
elif window == window1: # if closing win 1, mark as closed
window1 = None
elif event == 'Reopen':
if not window2:
window2 = make_win2()
window2.move(window1.current_location()[0], window1.current_location()[1] + 220)
elif event == '-IN-':
output_window = window2 if window == window1 else window1
if output_window: # if a valid window, then output to it
output_window['-OUTPUT-'].update(values['-IN-'])
else:
window['-OUTPUT-'].update('Other window is closed')
if __name__ == '__main__':
main()
```
--------------------
## Multiple Windows ## Multiple Windows