On 12/31/2017 8:52 PM, Terry Reedy wrote:

To do everything in the main thread, one can replace 'root.mainloop' with loop.run_forever (in the main thread) and repeated root.update calls.

Wu Xi's example, rewritten more or less as suggested:

from tkinter import *
from tkinter import messagebox
import asyncio
import random

async def one_url(url):
    """ One task. """
    sec = random.randint(1, 8)
    await asyncio.sleep(sec  )
    return 'url: {}  ---  sec: {}'.format(url, sec)

async def do_urls():
    """ Creating and starting 10 tasks.         """
    tasks   = [one_url(url)  for url  in range(10)]
    completed, pending =  await asyncio.wait(tasks)
    results = [task.result() for task in completed]
    print('\n'.join(results))


def do_nofreeze():
    messagebox.showinfo(message='see, Tkinter is still responsive')

def widgets(master):
    Button(master, text='Frozen?', command=do_nofreeze).pack()

# A production version of this should make it possible to cancel.
# However, when loop stops, updates will stop.
def tk_update(interval):
    root.update()
    loop.call_later(interval, tk_update)

if __name__ == '__main__':
    root = Tk()
    widgets(root)
    loop = asyncio.get_event_loop()
    tk_update(.01)
    loop.run_until_complete(do_urls())



--
Terry Jan Reedy

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

Reply via email to