Lambda returning tuple question, multi-expression

Cameron Simpson cs at cskk.id.au
Wed Mar 8 17:44:56 EST 2023


On 08Mar2023 16:56, aapost <aapost at idontexist.club> wrote:
>When making a UI there are a lot of binding/trace operations that need 
>to occur that lead to a lot of annoying 1 use function definitions. I 
>don't really see lambda use like below.
>
>Giving 2 working lambda examples using a returned tuple to accomplish 
>multiple expressions - what sort of gotchas, if any, might make the 
>following bad practice if I am missing something?

There're no real gotchas: tuples are evaluated left to right, so you 
should have things happen in the order you've expressed them (if the 
order matters). What you lose with a lambda is control constructs like 
loops and if-statements (well, there's the `x if foo else y` but that 
gets cumbersome quickly). Once things get complicated you may want to 
define a more complication function using `def`:

     def callback1():
         ... do complicated stuff ...

     b.config(command=callback1)

The only other issue, which applies across the board with GUIs and is 
nothing specific to lambdas is that the GUI only renders and operates 
while the main loop is running. When your callbacks do trivial stuff 
you're fine. If they block (eg waiting for user input or network calls 
etc) the GUI is also blocked. You need threads or other concurrent 
approaches if the GUI is to stay responsive.

The flip side of that is that a concurrent context like a Thread should 
not interact with the GUI directly. In things like Qt I've actually had 
that mistake crash the app because the Qt framework is (was?) not thread 
safe. You need to arrange that GUI actions occur in the main programme 
thread. I think the same applies with tk, and is anyway probably good 
practice for any GUI. It's not as hard as it sounds - typically when 
something happens asynchronously you arrange to issue an "event", and 
the GUI mainloop will process that as it happens - the event callback 
will be fired (called) by the main loop itself and thus the callback 
gets to do its thing in the main loop.

Cheers,
Cameron Simpson <cs at cskk.id.au>


More information about the Python-list mailing list