2017-11-17 326 views
0

我使用的QtWaitingSpinner在這裏找到:https://github.com/snowwlex/QtWaitingSpinner。您可以創建並啓動微調器,如下所示:spinner = QtWaitingSpinner(self); spinner.start()。不幸的是,當我嘗試從我的GUI發出POST請求時,微調器停止響應直到返回響應。因此,我根本沒有看到旋轉器,或者如果我提前啓動旋鈕,它會在等待響應時停止旋轉。我想我必須使用某種異步方法,比如QThread或asyncio,但目前還不清楚解決這個問題的最佳方式是什麼。如果任何人都可以告訴我處理它的最佳方式,我會很感激。下面是我在做什麼的簡化版本:PyQt5加載spinner暫停發帖請求

class Obj(QDialog): 
    # some button calls this function when pressed 
    def submit(self): 
     #start spinner 
     spinner = QtWaitingSpinner(self) 
     spinner.start() 

     # post some data to some url, spinner should spin 
     r = requests.post('some_url.com', json=some_data) 

     # stop spinner 
     spinner.stop() 

回答

1

的問題,你是requests阻止Qt的循環,所以像QTimer元素不起作用。一種解決方案是在另一個線程上運行該任務,一種簡單的方法是使用QRunnableQThreadPool

class RequestRunnable(QRunnable): 
    def __init__(self, url, json, dialog): 
     QRunnable.__init__(self) 
     self.mUrl = url 
     self.mJson = json 
     self.w = dialog 

    def run(self): 
     r = requests.post(self.mUrl, json=self.mJson) 
     QMetaObject.invokeMethod(self.w, "setData", 
           Qt.QueuedConnection, 
           Q_ARG(str, r.text)) 


class Dialog(QDialog): 
    def __init__(self, *args, **kwargs): 
     QDialog.__init__(self, *args, **kwargs) 
     self.setLayout(QVBoxLayout()) 
     btn = QPushButton("Submit", self) 
     btn.clicked.connect(self.submit) 
     self.spinner = QtWaitingSpinner(self) 

     self.layout().addWidget(btn) 
     self.layout().addWidget(self.spinner) 

    def submit(self): 
     self.spinner.start() 
     runnable = RequestRunnable("https://api.github.com/some/endpoint", 
            {'some': 'data'}, 
            self) 
     QThreadPool.globalInstance().start(runnable) 

    @pyqtSlot(str) 
    def setData(self, data): 
     print(data) 
     self.spinner.stop() 
     self.adjustSize() 

一個完整的例子可以在下面的link

+0

真的很感謝你的幫助的人找到了,謝謝! – Stefan