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

时间:2018-04-06 02:41:03

标签: python pyqt5

我是python的新手(只有几周学习),我正在使用python 3.6和Pyqt5完成我的第一个应用程序。 它包含一个区块链钱包,用于我老板公司的私人区块链。 我有一切正常(如果你问我,奇迹)。 我正在使用线程,因此当区块链的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叠加? 我是否必须从线程获得某种回调,以便我知道何时隐藏加载警告?如果是这样,我该怎么做?

1 个答案:

答案 0 :(得分:1)

对于此类任务,您可以使用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_())