PyQt5加载spinner暂停发帖请求
问题描述:
我使用的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()
答
的问题,你是requests
阻止Qt的循环,所以像QTimer
元素不起作用。一种解决方案是在另一个线程上运行该任务,一种简单的方法是使用QRunnable
和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()
一个完整的例子可以在下面的link
真的很感谢你的帮助的人找到了,谢谢! – Stefan