Используйте asyncio и Tkinter (или другую библиотеку графического интерфейса) вместе, не замораживая графический интерфеPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Используйте asyncio и Tkinter (или другую библиотеку графического интерфейса) вместе, не замораживая графический интерфе

Сообщение Anonymous »

Я хочу использовать asyncio в сочетании с графическим интерфейсом tkinter.
Я новичок в asyncio, и мое понимание этого метода не очень подробное.
В приведенном здесь примере при нажатии на первую кнопку запускается 10-е задание. Задача просто имитирует работу с помощью Sleep() в течение нескольких секунд.

Код примера отлично работает с Python 3.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()
Проблема _side

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

Код: Выделить всё

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
Многопоточность

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

РЕДАКТИРОВАТЬ: после рассмотрения этого вопроса и ответов он относится почти ко всем библиотекам графического интерфейса. (например, PygObject/Gtk, wxWidgets, Qt, ...).

Подробнее здесь: https://stackoverflow.com/questions/478 ... ng-the-gui
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»