如何在PyQt4中的loadFinished之后返回值

时间:2013-01-13 16:58:23

标签: python qt pyqt pyside

我有一个脚本,运行正常:

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()时,程序开始工作,并加载网站:

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次后,它会检查另一个条件并决定下一步该做什么。 最后,程序加载多个网站后。在变量中收集的所需数据称为self.results

所以我的问题是如何通过检查loadFinished()的条件来返回search()的结果。

换句话说,我需要提出某种算法来检查loadFinished是否不会加载任何其他网站,而search()函数将返回所需的变量。我想创建另一个变量self.result = False,而不是更改loadFinished()search()中的条件,将所有内容放在while loop中,然后放在return结果之后。但它不起作用......

搜索()

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

1 个答案:

答案 0 :(得分:1)

看起来你可以在这里使用发电机。在此QWebView示例中,loadWebsites被调用,直到StopIteration被引发,在这种情况下,procDone将被发送,其中包含已加载的网站数量。该信号的输出在时隙on_procDone中捕获。 (在这种情况下,输出为3,因为["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_())