QT4Reactor/Скрапи/PyQt4

Как правильно использовать Qt4Reactor?

У меня есть приложение PyQt4, на котором запущен Scrapy для анализа веб-сайта и отображения результатов в пользовательском интерфейсе.

Когда пользователь нажимает кнопку, парсер запускается в другом процессе. Пользовательский интерфейс блокируется, и парсер работает. Когда парсер завершен, данные отображаются в пользовательском интерфейсе. Что я хочу, так это неблокирующий пользовательский интерфейс, когда работает Scrapy.

Поскольку Scrapy построен на основе Twisted, мне приходится использовать новый процесс вместо потока, чтобы запустить его из пользовательского интерфейса.

Мой вопрос: как максимально упростить неблокирующий пользовательский интерфейс?

Я пытался использовать Qt4Reactor следующим образом:

if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)

    import qt4reactor
    qt4reactor.install()

    MainWindow = DiscogsRenamer()
    MainWindow.show()

    sys.exit(app.exec_())
    reactor.runReturn()

Это приводит к ошибке:

Traceback (most recent call last):
    File "/home/f/work/py/discogs_renamer/main.py", line 224, in <module>
        qt4reactor.install()
    File "/usr/local/lib/python2.7/dist-packages/qt4reactor.py", line 338, in posixinstall
        installReactor(p)
    File "/usr/local/lib/python2.7/dist-packages/twisted/internet/main.py", line 32, in installReactor
        raise error.ReactorAlreadyInstalledError("reactor already installed")
twisted.internet.error.ReactorAlreadyInstalledError: reactor already installed

Я разместил еще один вопрос в этой теме: Интеграция цикла событий Scrapy/Twisted в основном цикле PyQt4

Заранее спасибо.


person user937284    schedule 26.02.2013    source источник


Ответы (1)


Вы должны импортировать и установить() qt4reactor до импорта twisted.internet.reactor.

import qt4reactor
qt4reactor.install()
from twisted.internet import reactor
person amsh    schedule 18.02.2014