Форум сайта python.su
Пишу графическое приложение, которое должно парсить сайт. Пока писала отдельно gui, отдельно парсер, то все было хорошо, как решила все объединить возникли проблемы.
Проблема в том, что не могу запустить парсер в отдельном потоке. Для демонстрации проблемы вот такой код накидала:
from PyQt4 import QtCore import asyncio import aiohttp class Main(QtCore.QThread): def __init__(self): super(Main, self).__init__() def run(self): loop = asyncio.get_event_loop() with aiohttp.ClientSession(loop=loop) as session: content = loop.run_until_complete( self.fetch_page(session, 'http://python.org')) print(content) async def fetch_page(session, url): with aiohttp.Timeout(10): async with session.get(url) as response: assert response.status == 200 return await response.read() app = QtCore.QCoreApplication([]) m = Main() m.start() m.wait() app.exec_()
Отредактировано marina932 (Фев. 22, 2016 20:20:45)
Офлайн
from PyQt4 import Qt if __name__=="__main__": app = Qt.QApplication([]) #w = Qt.QWidget() #w.show() m = Main() app.exec_()
Отредактировано vic57 (Фев. 22, 2016 20:17:19)
Офлайн
vic57
Не в этом дело, посмотри на traceback, ну и вообще в коде все это есть, просто на форум выкладываю естественно только проблемный кусок (когда убирала лишнее, забыла вставить создание event loop pyqt).
Офлайн
попробуй через subprocess,Thread,Popen реализовать. связь с гуем можно через Qt emit signal сделать. ИМХО от QtCore.QThread наследоваться тут не лучший вариант
loop = asyncio.get_event_loop() with aiohttp.ClientSession(loop=loop) as session:
from threading import Thread,Event from time import sleep class MyTimer(Thread): def __init__(self, interval=1): Thread.__init__(self) self.stopped = Event() self.count = 0 self.interval = interval def stop(self): self.stopped.set() def run(self): while not self.stopped.wait(self.interval): self.count += 1 print 'count:',self.count if __name__=="__main__": t = MyTimer() t.start() sleep(10) t.stop()
Отредактировано vic57 (Фев. 23, 2016 00:47:40)
Офлайн
Тут не нужен новый поток. Все дело в том что у Qt свой цикл обработки сообщений, а у async свой, и в одном из них надо вызывать другой, чтобы дать ему обработать сообщения. Я так скрещивал PyQt и twisted. Для async попробуйте вот этот пакет Quamash
Офлайн
PooH
Огромное спасибо, очень сильно помогли, это то, что было нужно.
Отредактировано marina932 (Фев. 24, 2016 12:13:02)
Офлайн
У вас отсутствует главный цикл.
Офлайн
GulyaiVasko77
Не знаю для, кого это было написано, но проблема уже давно решена благодаря PooH и главный цикл приложения ни где не терялся
Офлайн