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

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
4

1 回答 1

1

看起来你可以在这里使用生成器。在此QWebView示例中,loadWebsites调用 untilStopIteration引发,在这种情况下procDone,将与加载的网站数量一起发出。该信号的输出被捕获在 slot 中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_())
于 2013-01-14T06:46:04.640 回答