Am 24.12.13 16:41, schrieb Tobias M.:
On 23.12.2013 20:59, Terry Reedy wrote:
What would be easiest for user-developers would be if someone were
able to wrap a gui loop in a way to give it the needed interface, so
the gui loop itself replaced and became the asyncio loop.

That's a good idea, maybe I will try this. On the other hand this means
that for every gui toolkit there must be a separate wrapper. I hoped this can
be avoided.

To be done properly, it needs to be adapted for every toolkit. But the good news is, that it has already been achieved: IPython is able to integrate the readline library into all major GUI toolkits (%gui). Maybe you can rip off the code from there.

On 23.12.2013 17:47, Chris Angelico wrote:
while gtk.events_pending(): gtk.main_iteration()

No doubt other toolkits have something similar.
On 23.12.2013 20:59, Terry Reedy wrote:
I think tk(inter) has 'run pending events' or something.

In Tk(inter) it is "update"

I didn't know functions like this exist in gui toolkits. Am I right in
thinking that using these functions you don't have to use the built-in
event loop. Instead you can write your own loop and just call 'run
pending events' continuously?

As Chris already explained, you then lose the advantages of the asynchronous operation. The reason behind the toolkits insisting on their main loop being run is, that they can wait for an event in a blocking way. Typically, under Linux, they call select() and on Windows WaitForMultipleObjects(), which blocks (sleeps) until an event arrives. Now to integrate your event source, you need to add it to this single blocking call.

Specifically, in the case of Tcl/Tk: The event loop is intrinsically able to wait for asynchronous IO from sockets, pipes, or serial lines to implement "fileevent". However, this is probably not useful since Python doesn't open files through Tcl's VFS layer. The easiest way is to run another thread, which waits in a blocking way, and to raise an event in the main thread. This is done from the C side by Tcl_ThreadQueueEvent() and Tcl_ThreadAlert() to wake up the event loop, or from the Tcl script level by the Threads package and sending a message to the main thread. Unfortunately this message queue stuff is quite complicated (it's described on the notifier man page http://www.tcl.tk/man/tcl/TclLib/Notifier.htm ). Further complication might come from the fact that some Linux distributions still ship with a Tcl that is not threads enabled. When I needed to add an unrelated event source, namely the events from GPIB devices, I simply used Tcl_AsyncProc() to do it, but I'm not sure whether this leads to race conditions.

        Christian
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to