Кнопка все еще жива и отвечает. Мне всегда нравится отключать / включать функцию на другой кнопке, чтобы вы случайно не запускали несколько задач, но это просто пользовательский интерфейс.

у использоватьasyncio в сочетании сtkinter GUI. Я новичок вasyncio и мое понимание этого не очень подробно. Пример здесь запускает 10 задач при нажатии на первую кнопку. Задача просто имитировать работу сsleep() на несколько секунд.

Пример кода работает нормально с Python3.6.4rc1. Но проблема является то, что графический интерфейс заблокирован. Когда я нажимаю первую кнопку и запускаю 10 асинхронных задач, я не могу нажать вторую кнопку в графическом интерфейсе, пока все задачи не будут выполнены. Графический интерфейс никогда не должен зависать - это моя цель.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

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

def do_freezed():
    """ Button-Event-Handler to see if a button on GUI works. """
    messagebox.showinfo(message='Tkinter is reacting.')

def do_tasks():
    """ Button-Event-Handler starting the asyncio part. """
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(do_urls())
    finally:
        loop.close()

async def one_url(url):
    """ One task. """
    sec = random.randint(1, 15)
    await asyncio.sleep(sec)
    return 'url: {}\tsec: {}'.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))


if __name__ == '__main__':
    root = Tk()

    buttonT = Button(master=root, text='Asyncio Tasks', command=do_tasks)
    buttonT.pack()
    buttonX = Button(master=root, text='Freezed???', command=do_freezed)
    buttonX.pack()

    root.mainloop()
Побочная проблема

... из-за этой ошибки я не могу запустить задачу второй раз.

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.6/tkinter/__init__.py", line 1699, in __call__
    return self.func(*args)
  File "./tk_simple.py", line 17, in do_tasks
    loop.run_until_complete(do_urls())
  File "/usr/lib/python3.6/asyncio/base_events.py", line 443, in run_until_complete
    self._check_closed()
  File "/usr/lib/python3.6/asyncio/base_events.py", line 357, in _check_closed
    raise RuntimeError('Event loop is closed')
RuntimeError: Event loop is closed
Многопоточность

Как многопоточность может быть возможным решением? Только два потока - каждый цикл имеет свой собственный поток?

Ответы на вопрос(1)

Ваш ответ на вопрос