2010-05-02 15 views
0

J'ai écrit un grattoir en utilisant python un certain temps, et cela a bien fonctionné dans la ligne de commande. J'ai fait une interface graphique pour l'application maintenant, mais j'ai un problème avec un problème. Lorsque j'essaie de mettre à jour du texte à l'intérieur de l'interface graphique (par exemple, 'récupérer l'URL 12/50'), je ne vois pas comment la fonction du gratteur saisit plus de 100 liens. De même, lorsque vous passez d'une fonction de grattage à une fonction qui devrait mettre à jour le gui, à une autre fonction, la fonction de mise à jour de gui semble être ignorée pendant l'exécution de la fonction de scrape suivante. Un exemple serait:Python GUI Scraper problèmes suspendus

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

dans l'exemple ci-dessus, updateInfo est jamais exécutée, à moins que je termine le programme avec un KeyboardInterrupt.

Je pense que ma solution tourne, mais je ne suis pas sûre. Que puis-je faire pour résoudre ce problème?

J'utilise:

  • PyQt4
  • urllib2
  • BeautifulSoup

Répondre

2

La réponse de Lukáš Lalinský est très bonne. Une autre possibilité serait d'utiliser PyQt threads.

Si le problème est simplement la partie « mise à jour » (et non la nécessité d'un traitement asynchrone), essayez de mettre cet appel:

QCoreApplication.processEvents() 

entre scrapeLinksA et scrapeLinksB pour voir si cela aide (il interrompt temporairement la boucle d'événement principal pour voir s'il y en a d'autres (demandes de peinture par exemple) en attente). Si ce n'est pas le cas, veuillez nous fournir la source updateInfo.

2

Je vous suggère d'utiliser QNetworkAccessManager un moyen non-blocage du téléchargement des sites Web. C'est une approche différente, donc vous allez probablement réécrire la partie manipulation de votre application. Au lieu d'attendre que la page soit téléchargée pour que vous puissiez l'analyser, vous disposez de plusieurs fonctions plus petites, connectées via des signaux et exécutées lorsque certains événements se produisent (par exemple, "la page est téléchargée").