2013-05-03 123 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) 

希望我帮助你未来的观众!