2013-05-03 61 views
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以及 - 同樣的結果)

我在做什麼錯?

+0

我不明白你的問題。每個請求都會發出「完成」信號。因此,每個請求都會調用_request_finished。並且您打印兩次相同的字符串,並在兩者之間進行睡眠。顯然,它會打印兩次。你想做什麼? – Avaris 2013-05-03 18:43:44

+0

@Avaris我的問題不是它打印了兩次,而是在第二次打印時打印出原始值+第二次請求的結果。看看我的答案,看看我如何修復它:) – 2013-05-03 18:46:39

+0

第二次打印不會同時打印。第二次打印打印一個回覆,該功能再次被另一個回覆調用。由於您之間有睡眠,網絡請求將在此期間完成。所以第二個電話會在第一個電話後立即發生。您看到的打印結果分別是「前一次打印的第二次打印」和「下一次打印的第一次打印」。 – Avaris 2013-05-03 18:51:46

回答

2

我發現問題了!

的問題是,我還沒有斷開從它連接到原功能的網絡管理員finished信號,因此造成的回覆去

我解決了這兩個功能(新的連接和舊)它使用.disconnect()命令只需再次連接前:

self.network_manager.finished.disconnect() #this!!! 
self.network_manager.finished.connect(self._update) 

,並在SSCCE:

self.network_manager.finished.disconnect() #this!!! 
self.network_manager.finished.connect(self.func3) 

希望我幫助你未來的觀衆!