我有一个脚本,运行正常:
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
答案 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_())