2017-11-17 8 views
0

QtWaitingSpinnerを使用しています:https://github.com/snowwlex/QtWaitingSpinner。スピナーを作成して開始するには、spinner = QtWaitingSpinner(self); spinner.start()のようにします。残念なことに、GUIからPOSTリクエストを作成しようとすると、応答が返されるまでスピナーが停止します。その結果、スピナーがまったく表示されません。スピナーを早期に開始すると、スピンナーは応答を待つ間に回転を停止します。 QThreadやasyncioのような非同期メソッドを使わなければならないと思うが、これを回避する最良の方法は何か不明だ。誰かが私にそれを処理する最善の方法を示すことができれば、私は感謝するだろう。ここで私がやっているの簡易版である:QTimerのような要素は動作しませんので、投稿リクエストでPyQt5ローディングスピナーが停止する

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のループをブロックしています。 1つの解決策は、別のスレッドでそのタスクを実行することです。これを行う簡単な方法は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

関連する問題