2013-07-29 5 views
0

Je suis en train d'aller à un ensemble d'URL et de capturer là photos avec PyQt, le code fonctionne bien pour une url:l'image PyQt erreur de capture

#!/usr/bin/env python 
import sys, itertools 
import signal 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from PyQt4.QtWebKit import QWebPage 

urls = "http://www.gouvernement.fr/", "http://www.google.com/" 
outputs = "output1.png", "output2.png" 
#for url in urls: #and output in ouputs: 
for url, output in itertools.izip(urls, outputs): 

    def onLoadFinished(result): 
    if not result: 
     print "Request failed" 
     sys.exit(1) 

    # Set the size of the (virtual) browser window 
    webpage.setViewportSize(webpage.mainFrame().contentsSize()) 

    # Paint this frame into an image 
    image = QImage(webpage.viewportSize(), QImage.Format_ARGB32) 
    painter = QPainter(image) 
    webpage.mainFrame().render(painter) 
    painter.end() 
    image.save(output) 
    print ".png image successfully saved" 
    #sys.exit(0) 


    app = QApplication(sys.argv) 
    signal.signal(signal.SIGINT, signal.SIG_DFL) 

    webpage = QWebPage() 
    webpage.connect(webpage, SIGNAL("loadFinished(bool)"), onLoadFinished) 
    webpage.mainFrame().load(QUrl(url)) 
    sys.exit(app.exec_()) 

Mais comme il va throuhg un cliché, il se bloque juste et ne marche pas continuez pour l'instantané suivant. Pourquoi donc ?

+0

Le code tel qu'il est écrit ne fonctionnera pas, il est donc difficile de dire comment vous l'intention de travailler. –

+0

Corrigé maintenant. – Scooby

Répondre

1

L'indentation du code que vous avez collé ne précise pas à quelle distance votre boucle for va - je suppose que tout va jusqu'à la fin est dans la boucle?

Si oui, alors il est clair pourquoi votre code ne fonctionne pas: vous appelez app.exec_, qui bloque jusqu'à ce que la dernière fenêtre est fermée ou que vous appelez quit ou exit. Comme vous ne le faites jamais, il bloque pour toujours.

Si vous souhaitez traiter plusieurs URL de cette manière, vous devez utiliser vos gestionnaires d'événements pour enregistrer la page et charger l'URL suivante. Quelque chose comme cela devrait fonctionner:

#!/usr/bin/env python 
import sys, itertools 
import signal 
from PyQt4.QtCore import * 
from PyQt4.QtGui import * 
from PyQt4.QtWebKit import QWebPage 

urls = ["http://www.gouvernement.fr/", "http://www.google.com/"] 
outputs = ["output1.png", "output2.png"] 

def save_page(webpage, output): 
    # Set the size of the (virtual) browser window 
    webpage.setViewportSize(webpage.mainFrame().contentsSize()) 

    # Paint this frame into an image 
    image = QImage(webpage.viewportSize(), QImage.Format_ARGB32) 
    painter = QPainter(image) 
    webpage.mainFrame().render(painter) 
    painter.end() 
    image.save(output) 
    print ".png image successfully saved" 
    #sys.exit(0) 


app = QApplication(sys.argv) 
signal.signal(signal.SIGINT, signal.SIG_DFL) 

webpage = QWebPage() 

def onLoadFinished(result): 
    if not result: 
     print "Request failed" 
     sys.exit(1) 
    save_page(webpage, outputs.pop(0)) # pop output name from list and save 
    if urls: 
     url = urls.pop(0) # pop next url to fetch from list 
     webpage.mainFrame().load(QUrl(url)) 
    else: 
     app.quit() # exit after last url 

webpage.connect(webpage, SIGNAL("loadFinished(bool)"), onLoadFinished) 
webpage.mainFrame().load(QUrl(urls.pop(0))) 
sys.exit(app.exec_()) 
+0

Oui, vous avez corrigé avec l'indentation mais j'ai essayé votre code, il se recurse à travers la boucle mais python se bloque pour raison et même les images ne sont pas sauvegardées. Est-ce que tu l'as essayé? – Scooby

+0

Oui, je l'ai essayé. Le code fonctionne sans problèmes pour moi exactement comme il est. – mata

+0

Très bien, Il produit l'image, mais plante toujours mon python sur le bureau et l'ordinateur portable. Je reçois toujours les images bien. Très étrange mais merci! – Scooby