from tkinter import * ; from tkinter import messagebox import asyncio , random
async def one_url(url): """ This is a multi threaded tkinter demo where tasks run in the background and aim to not freeze the tk GUI, py v3.7""" sec = random.randint(1, 8) await asyncio.sleep(sec ) return 'url: {} took {} seconds'.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='GUI Frozen?', command=do_nofreeze).pack() def tk_update(interval): """ A production version of this should make it possible to cancel. However, when loop stops, updates will stop. T. Reedy""" loop.call_later( interval, root.update ) root.update() if __name__ == '__main__': root = Tk() widgets(root) loop = asyncio.get_event_loop() tk_update(.05) loop.run_until_complete(do_urls()) # wow! no call to root.mainloop() anymore. somehow like in IDLE - but it freezes now :-( -- https://mail.python.org/mailman/listinfo/python-list