python - PyQt5 加载微调器在发布请求时停止

标签 python pyqt python-requests pyqt4 pyqt5

我正在使用此处的 QtWaitingSpinner:https://github.com/snowwlex/QtWaitingSpinner .您可以像这样创建并启动微调器:spinner = QtWaitingSpinner(self); spinner.start()。不幸的是,当我尝试从我的 GUI 发出 POST 请求时,微调器会停止,直到返回响应。因此,我根本看不到微调器,或者如果我过早地启动微调器,它会在等待响应时停止旋转。我认为我将不得不使用某种异步方法,如 QThread 或 asyncio,但尚不清楚解决此问题的最佳方法是什么。如果有人能告诉我处理它的最佳方法,我将不胜感激。这是我正在做的事情的简化版本:

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 这样的元素不起作用。一种解决方案是在另一个线程上运行该任务,一种简单的方法是使用 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中找到

关于python - PyQt5 加载微调器在发布请求时停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47359847/

相关文章:

Python 请求包含 cookie 错误

python - Instagram 私有(private) API 403,即使有 cookie 和 header

python - 使用 Image Viewer (Eye of GNOME) 在一个目录中打开多个图像

python - 如何在 Tkinter 的屏幕上将窗口居中?

Python for 循环——它到底做了什么

python - GPIO 事件未显示在 QTreeModel/QWidget/QMainWindow 中

python - 到 PyQt5 'connect' 转换

python - 使用 Python 脚本重启远程服务器

python - 如何从 QFontDatabase 中删除某些字体?

python - 使用 python 套接字连接时服务器的响应为空