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