Hi Mike,

Thanks, this code is nice and short.  Is adding 'if button is None: break' to 
the 'Read' version of your code the right way to make it exit when the main 
window is closed? (On my machine it enters an infinite loop after I close the 
main window).

For comparison, I tried doing this with PyGObject.
I created the UI with glade, which auto-generated the attached XML file.  Then 
I had to write the following code (I had never used Glade or PyGObject before, 
so apologies if there are mistakes in the following):

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

def main():
    builder = Gtk.Builder()
    builder.add_from_file("sum.glade")

    get = builder.get_object
    a, b, answer, window = get("a"), get("b"), get("answer"), get("window")

    def update_sum(_entry):
        try:
            tanswer = int(a.get_text()) + int(b.get_text())
            answer.set_text(str(tanswer))
        except ValueError:
            pass

    a.connect("changed", update_sum)
    b.connect("changed", update_sum)
    window.connect("destroy", Gtk.main_quit)

    window.show_all()
    Gtk.main()

if __name__ == '__main__':
    main()

Having a visual editor for the UI feels like a plus, and I find the resulting 
XML verbose but acceptably readable.
On the other hand, I like the conciseness of your UI specs.

Cheers,
Clément.

On 2018-08-24 16:38, Mike Barnett wrote:
> I should have mentioned that you need the GitHub version of the code in order 
> to get the keyboard events. Rather than do a pip install you can download 
> this file and put it in your project folder:
> 
> https://github.com/MikeTheWatchGuy/PySimpleGUI/blob/master/PySimpleGUI.py
> 
> Sorry for any confusion.
> 
> I also got a question if this code blocks or is in a spin-loop.   The answer 
> is that the posted version blocks until some kind of form input.  Should you 
> want to turn the program into one that polls instead of blocks,  the loop 
> changes slightly to enable form close detection.  It's basically the same 
> with the Read call being replaced by ReadNonBlocking.
> 
> while True:
>     button, values = form.ReadNonBlocking()
>     if button is None and values is None:
>         break
>     a, b = values
>     try:
>         output.Update(int(a) + int(b))
>     except:
>         pass
> 
> 
> 
> @mike
> 
> -----Original Message-----
> From: Mike Barnett <mike_barn...@hotmail.com> 
> Sent: Friday, August 24, 2018 3:36 PM
> To: Chris Angelico <ros...@gmail.com>; Python-Ideas <python-ideas@python.org>
> Subject: RE: [Python-ideas] A GUI for beginners and experts alike
> 
> 
> So here's my alternative challenge:
> 
> Take two numbers as inputs. Add them together and display them in a third 
> field. Whenever either input is changed, recalculate the output.
> 
> This requires proper event handling, so it's less likely to create a useless 
> one-liner that has no bearing on real-world code.
> 
> ------------------------------------
> 
> 
> 
> Sure thing... post yours. I'll go ahead and post mine first.
> 
> Here's the window this code produces.
> 
> https://user-images.githubusercontent.com/13696193/44604157-02a2ac00-a7b3-11e8-928b-f67c5f2b3961.jpg
> 
> And here's the code in a more readable form since the email formatting sucks.
> https://user-images.githubusercontent.com/13696193/44604220-2cf46980-a7b3-11e8-86c5-ad3051222eaf.jpg
> 
> It's rather, uhm, simple to do....
> 
> 
> import PySimpleGUI as gui
> 
> output = gui.Text('')
> 
> layout = [ [gui.Text('Enter 2 numbers')],
>            [gui.Text('A'), gui.InputText()],
>            [gui.Text('B'), gui.InputText()],
>            [gui.Text('Answer = '), output],
>            ]
> 
> form = gui.FlexForm('Realtime Updates', return_keyboard_events=True)
> form.LayoutAndRead(layout)
> while True:
>     button, (a,b) = form.Read()
>     try:
>         answer = int(a) + int(b)
>         output.Update(answer)
>     except:
>         pass
> 
> 
> @mike
> _______________________________________________
> Python-ideas mailing list
> Python-ideas@python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
> 

Attachment: sum.glade
Description: application/glade

_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to