2010-05-02 4 views
0

Я написал скребок с использованием python некоторое время назад, и он отлично работал в командной строке. Я создал графический интерфейс для приложения сейчас, но у меня возникают проблемы с одной проблемой. Когда я пытаюсь обновить текст внутри gui (например, «выборка URL 12/50»), я не могу видеть, как функция в скребке захватывает более 100 ссылок. Кроме того, при переходе от одной функции соскабливания к функции, которая должна обновлять gui, к другой функции, функция обновления gui, кажется, пропускается, когда выполняется следующая функция очистки. Примером может быть:Python GUI Скребок висит проблемы

scrapeLinksA() #takes 20 seconds 
updateInfo("LinksA done") 
scrapeLinksB() #takes another 20 seconds 

в приведенном выше примере, updateInfo никогда не выполняется, если я не закончить программу с KeyboardInterrupt.

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

Я использую:

  • PyQt4
  • urllib2
  • BeautifulSoup

ответ

2

Ответ Lukáš Lalinský очень хороший.

Другой возможностью было бы использовать PyQt threads.

Если проблема просто «обновление» часть (и не нужно для асинхронной обработки), попытайтесь поместить этот вызов:

QCoreApplication.processEvents() 

между scrapeLinksA и scrapeLinksB, чтобы увидеть, если это помогает (он временно прерывает основной цикл события, чтобы увидеть, есть ли другие (запросы на рисование, например) в ожидании).

Если это не так, сообщите нам источник updateInfo.

2

Я хотел бы предложить использовать QNetworkAccessManager для неблокируемой способ загрузки веб-сайтов. Это другой подход, поэтому вы, вероятно, перепишете часть обработки вашего приложения. Вместо того, чтобы ждать загрузки страницы, чтобы вы могли ее разобрать, у вас есть несколько меньших функций, связанных через сигналы, и они выполняются, когда происходят некоторые события (например, «страница загружается»).