1

正常に動作するスクリプトがあります。

if __name__ == '__main__':
    app = QApplication(sys.argv)
    bot = GBot()
    bot.search('hot tea', num=20)
    if signal.signal(signal.SIGINT, signal.SIG_DFL):
        sys.exit(app.exec_())
    app.exec_()

search()を呼び出すと、プログラムが動作を開始し、Webサイトをロードします。

def _loadFinished(self, ok):
        current_url = self.page().currentFrame().url().toString()
        if str(current_url).endswith('.com/'):
            self.home_search()
        else:
            self.get_links_text_from_page()
            
        if self.count >= self.desired_number_of_results:
            self.close()

ロードが1回終了すると、別の状態をチェックし、次に何をするかを決定します。最後に、プログラムが複数のWebサイトをロードした後。と呼ばれる変数に収集された目的のデータself.results

だから私の質問は、loadFinished()の条件をチェックすることによって、search()から結果を返す方法です。

search()言い換えれば、loadFinishedが他のWebサイトをロードしないかどうかをチェックし、関数が目的の変数を返すようなアルゴリズムを考え出す必要があります。self.result = False条件を変更してすべてを配置するloadFinished()のではなく、別の変数を作成することを考えていました。その後、結果が得られます。しかし、それは機能しません...search()while loopreturn

探す()

def search(self, keyword, num=None, output=None):
    self.keyword = keyword
    if output is "json":
    # need to return `self.results` ONLY after program finished. because before that,
    # this variable is empty
    self.load('somewebsite.com')
    pass
4

1 に答える 1

1

ここでジェネレーターを使用できるようです。このQWebView例では、が発生loadWebsitesするまで呼び出されます。この場合、ロードされたWebサイトの数とともに発行されます。その信号の出力はスロットにキャプチャされます。(この場合の出力は、のためです):StopIterationprocDoneon_procDone3["http://www.example.com"]*3

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from PyQt4 import QtCore, QtGui, QtWebKit, QtNetwork

class myWindow(QtWebKit.QWebView):
    procDone = QtCore.pyqtSignal(int)

    def __init__(self, parent=None):
        super(myWindow, self).__init__(parent)

        self.websites      = iter(["http://www.example.com"]*3)
        self.websitesTotal = 0

        self.loadFinished.connect(self.on_loadFinished)
        self.procDone.connect(self.on_procDone)

        self.loadWebsites()

    def loadWebsites(self):
        try:
            website = self.websites.next()

        except StopIteration:
            self.procDone.emit(self.websitesTotal)

        else:
            self.load(QtCore.QUrl(website))

    @QtCore.pyqtSlot(bool)
    def on_loadFinished(self, ok):
        self.websitesTotal += 1
        print "Loaded: {0}".format(self.url().toString())
        self.loadWebsites()

    @QtCore.pyqtSlot(int)
    def on_procDone(self, total):
        print "Total of websites: {0}".format(total)
        self.websitesTotal = 0

if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('myWindow')

    main = myWindow()
    main.show()

    sys.exit(app.exec_())
于 2013-01-14T06:46:04.640 に答える