I'm working on a simple graphical network application, using asyncio and tkinter. I'm running into the problem of combining the asyncio event loop with Tk's mainloop. If possible, I'd like to do it without threads, because both these libraries (but especially tkinter) aren't very thread safe. Currently, I'm using Tk.update in an asyncio coroutine, which runs only a single iteration of the tk event loop:
def run_tk(tk, interval=0.1):
yield from asyncio.sleep(interval)
except TclError as e:
if "application has been destroyed" not in e.args:
The missing of public method like
loop.run_once() is intentional.
Not every supported event loop has method to iterate one step. Often underlying API has methods for creating event loop and running it forever but emulating single step may be very ineffective.
If you really need it you may implement single-step iteration easy:
import asyncio def run_once(loop): loop.call_soon(loop.stop) loop.run_forever() loop = asyncio.get_event_loop() for i in range(100): print('Iteration', i) run_once(loop)