0

私は一連の URL に移動し、PyQt を使用してスナップショットをキャプチャしようとしています。コードは 1 つの URL に対して正常に動作します。

#!/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_())

しかし、1 つのスナップショットを通過すると、ハングするだけで、次のスナップショットには進みません。何故ですか ?

4

1 に答える 1

1

for貼り付けたコードのインデントでは、ループがどこまで進んでいるかが明確になりません-最後がループ内にあるまですべてを推測しますか?

もしそうなら、あなたのコードが動かない理由は明らかです: を呼び出すと、最後のウィンドウが閉じられるかorapp.exec_を呼び出すまでブロックされます。あなたが決してしないように、それは永遠にブロックします。quitexit

この方法で複数の URL を処理する場合は、イベント ハンドラーを使用してページを保存し、次の URL を読み込む必要があります。このようなものが動作するはずです:

#!/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_())
于 2013-07-29T18:54:51.410 に答える