0
编辑:
我准备这个SSCCE为您提供便利:(只要运行它)QNetworkReply不会中止/关闭
from PyQt4 import QtCore, QtGui, QtNetwork
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
import time
import sys
import json
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
class SSCCE(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(800, 578)
QMetaObject.connectSlotsByName(MainWindow)
def main(self):
request = QNetworkRequest()
request.setUrl(QUrl("http://search.twitter.com/search.json?q=blue&rpp=1"))
self.network_manager = QNetworkAccessManager()
self.network_manager.finished.connect(self._request_finished)
self.network_manager.post(request, self.urlencode_post({'a' : 'b'}))
def urlencode_post(self, data):
post_params = QUrl()
for (key, value) in data.items():
post_params.addQueryItem(key, unicode(value))
return post_params.encodedQuery()
def func2(self):
request = QNetworkRequest()
request.setUrl(QUrl("http://search.twitter.com/search.json?q=red&rpp=1"))
request.setRawHeader('content-Type', 'application/x-www-form-urlencoded;charset=UTF-8')
self.network_manager.finished.connect(self.func3)
self.network_manager.get(request)
def func3(self, reply):
if not reply.error() == QNetworkReply.NoError:
# request probably failed
print(reply.error())
print(reply.errorString())
else:
reply.close()
def func1(self, reply):
ans = reply.readAll()
print(ans)
time.sleep(5)
print("""\n
IT PRINTS THEM BOTH:
===================
%s
"""%ans)
self.func2()
def _request_finished(self, reply):
if not reply.error() == QNetworkReply.NoError:
# request probably failed
print(reply.error())
print(reply.errorString())
else:
reply.close()
self.func1(reply)
app = QApplication(sys.argv)
MainWindow = QMainWindow()
ui = SSCCE()
ui.setupUi(MainWindow)
ui.main()
MainWindow.show()
sys.exit(app.exec_())
原题:
我的代码:(相关部分)
def update(self):
request = QNetworkRequest()
request.setUrl(QUrl("someurl"))
self.network_manager.finished.connect(self._update)
self.network_manager.get(request)
def _update(self, reply): # update stage 2
if not reply.error() == QNetworkReply.NoError:
# request probably failed
print(reply.error())
print(reply.errorString())
print("retrying")
self.update()
else:
reply.abort()
#print(str(reply.readAll().data()))
data = json.loads(str(reply.readAll().data())) # get data
#work with the data (irrelevant)
def sendBearer_req(self):
request = QNetworkRequest()
request.setUrl(QUrl("someotherurl"))
self.network_manager = QNetworkAccessManager()
self.network_manager.finished.connect(self._request_finished)
self.network_manager.post(request, self.urlencode_post({'some' : 'thing'}))
def sendBearer(self, reply):
reply.abort()
ans = reply.readAll()
print(ans)
time.sleep(5)
print(ans)
try:
self.bearer = json.loads(str(ans))
self.update()
except:
raise #for debugging
self.sendBearer_req() #retry
def _request_finished(self, reply):
if not reply.error() == QNetworkReply.NoError:
# request probably failed
print(reply.error())
print(reply.errorString())
print("retrying")
self.sendBearer_req()
else:
self.sendBearer(reply)
问题:
这部分:
reply.abort()
ans = reply.readAll()
print(ans)
time.sleep(5)
print(ans)
我敢肯定的abort
没有在第一print
因为工作它打印正是我想要的,但随后,当它会等待,显然它会继续执行代码并在发送另一个请求时输入update
函数。因此,在第二个print
这两个答复混合在一起,它打印这两个。
(顺便说一句我试过close
以及 - 同样的结果)
我在做什么错?
我不明白你的问题。每个请求都会发出“完成”信号。因此,每个请求都会调用_request_finished。并且您打印两次相同的字符串,并在两者之间进行睡眠。显然,它会打印两次。你想做什么? – Avaris 2013-05-03 18:43:44
@Avaris我的问题不是它打印了两次,而是在第二次打印时打印出原始值+第二次请求的结果。看看我的答案,看看我如何修复它:) – 2013-05-03 18:46:39
第二次打印不会同时打印。第二次打印打印一个回复,该功能再次被另一个回复调用。由于您之间有睡眠,网络请求将在此期间完成。所以第二个电话会在第一个电话后立即发生。您看到的打印结果分别是“前一次打印的第二次打印”和“下一次打印的第一次打印”。 – Avaris 2013-05-03 18:51:46