Async как шаблон в pyqt? Или более чистый фоновый рисунок?
Я пытаюсь написать короткую (один файл pyqt) программу, которая отзывчива (поэтому зависимости вне python / lxml / qt, особенно те, которые я не могу просто вставить в файл, имеют некоторые недостатки для этого варианта использования, но я все еще могу готов попробовать их). Я пытаюсь выполнить, возможно, длительные (и отменяемые) операции в рабочем потоке (на самом деле фоновая операция имеет блокировку вокруг нее для предотвращения одновременного выполнения нескольких операций (поскольку используемая библиотека может использоваться только по одному вызову за раз) и тайм-ауты, так что порождение нескольких потоков также будет хорошо).
Насколько я могу понять, «основной» способ сделать это с помощью Qt. (код заметки не проверен, поэтому может быть ошибочным)
class MainWindow(QWidget):
#self.worker moved to background thread
def initUI(self):
...
self.cmd_button.clicked.connect(self.send)
...
@pyqtslot()
def send(self):
...
...#get cmd from gui
QtCore.QTimer.singleShot(0, lambda : self.worker(cmd))
@pyqtslot(str)
def end_send(self, result):
...
...# set some gui to display result
...
class WorkerObject(QObject):
def send_cmd(self, cmd):
... get result of cmd
QtCore.QTimer.singleShot(0, lambda: self.main_window.end_send())
(Я правильно использую QTimer (он работает на другом потоке справа)?)
Я действительно предпочел бы иметь что-то более простое и более абстрактное в соответствии с асинхронностью c #. (обратите внимание, я не использовал asyncio, поэтому я могу ошибаться)
class MainWindow(QWidget):
...
@asyncio.coroutine
def send(self):
...
...#get cmd from gui
result = yield from self.worker(cmd)
#set gui textbox to result
class WorkerObject(QObject):
@asyncio.coroutine
def send_cmd(self, cmd):
... get result of cmd
yield from loop.run_in_executor(None, self.model.send_command, cmd)
Я слышал, что Python 3 имеет схожие функции и есть задний порт, но работает ли он правильно с qt?
Если кто-нибудь знает другой разумный образец. это тоже было бы полезно / приемлемый ответ.