2017-11-17 5 views
0

Ich benutze die QtWaitingSpinner hier gefunden: https://github.com/snowwlex/QtWaitingSpinner. Sie können einen Spinner wie folgt erstellen und starten: spinner = QtWaitingSpinner(self); spinner.start(). Leider, wenn ich versuche, eine POST-Anfrage von meiner GUI zu machen, hält der Spinner an, bis eine Antwort zurückgegeben wurde. Folglich sehe ich den Spinner überhaupt nicht, oder wenn ich den Spinner vorzeitig einsetze, hört er auf zu drehen, während er auf die Antwort wartet. Ich denke, dass ich eine asynchrone Methode wie QThread oder asyncio verwenden muss, aber es ist unklar, was der beste Weg ist, um dies zu umgehen. Wenn mir jemand den besten Weg zeigen könnte, wäre ich dankbar. Hier ist eine vereinfachte Version von dem, was ich tue:PyQt5 Laden Spinner hält auf Post Anfrage

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() 

Antwort

1

Das Problem Sie sind requests wird, um die Qt-Schleife zu blockieren, so Elemente wie QTimer nicht funktionieren. Eine Lösung besteht darin, diese Aufgabe in einem anderen Thread auszuführen. Eine einfache Methode ist die Verwendung von QRunnable und QThreadPool.

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() 

Ein komplettes Beispiel kann in den folgenden link

+0

Wirklich zu schätzen Ihre Hilfe eines Mann, danke zu finden! – Stefan