如何在python上为长处理线程创建加载警告?

如何在python上为长处理线程创建加载警告?,python,pyqt5,Python,Pyqt5,我对pythononly还相当陌生,只需几周的学习时间,就可以完成我的第一个使用Python3.6和Pyqt5 for GUI的应用程序。 它包含在我老板公司的私有区块链的区块链钱包中。 如果你问我的话,我一切正常。 我使用线程,这样当区块链的API需要很长时间处理时,GUI不会冻结。 所以我有这段代码 def modalCreateAddress(): name, ok = QInputDialog.getText(None, 'Name the address', 'Enter th

我对pythononly还相当陌生,只需几周的学习时间,就可以完成我的第一个使用Python3.6和Pyqt5 for GUI的应用程序。 它包含在我老板公司的私有区块链的区块链钱包中。 如果你问我的话,我一切正常。 我使用线程,这样当区块链的API需要很长时间处理时,GUI不会冻结。 所以我有这段代码

def modalCreateAddress():
    name, ok = QInputDialog.getText(None, 'Name the address', 'Enter the address name:')
    if ok:
        _thread.start_new_thread(createAddress, (password, name))
很明显,这个函数createAddress调用API来创建一个新的地址,有时需要几秒钟,但由于它在线程上,用户可以自由地继续使用GUI,而这个函数看起来好像不起作用。 我想知道我如何能设法有一种加载指示器,如生成新地址。。。或者类似的。 处理这种情况的最佳方法是什么?也许是一个小进度条,或者加载gif覆盖?
我是否需要从线程获取某种回调,以便知道何时隐藏加载警告?如果是,我该怎么做?

对于此类任务,您可以使用QProgressDialog,在以下部分中有一个示例:

import sys
import time
import thread

from PyQt5.QtCore import QObject, pyqtSignal, Qt
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QPushButton, QInputDialog, QApplication, QProgressDialog

class Message(QObject):
    finished = pyqtSignal()

def createAddress(password, name, obj):
    time.sleep(5)
    obj.finished.emit()


class Widget(QWidget):
    def __init__(self, *args, **kwargs):
        QWidget.__init__(self, *args, **kwargs)
        lay = QVBoxLayout(self)
        button = QPushButton("Start processing")
        lay.addWidget(button)
        button.clicked.connect(self.start_task)
        self.message_obj = Message()

    def start_task(self):
        password = "password"
        name, ok = QInputDialog.getText(None, 'Name the address', 'Enter the address name:')
        if ok:
            self.progress_indicator = QProgressDialog(self)
            self.progress_indicator.setWindowModality(Qt.WindowModal)
            self.progress_indicator.setRange(0, 0)
            self.progress_indicator.setAttribute(Qt.WA_DeleteOnClose)
            self.message_obj.finished.connect(self.progress_indicator.close, Qt.QueuedConnection)
            self.progress_indicator.show()
            thread.start_new_thread(createAddress, (password, name, self.message_obj))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    app.setStyle("fusion")
    w = Widget()
    w.show()
    sys.exit(app.exec_())

你能测量你任务的进度吗?不太可能,一个简单的脉冲全进度条或加载警告就足够了。。。