首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何为python上的长处理线程创建加载警告?

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

Stack Overflow用户
提问于 2018-04-06 02:41:03
回答 1查看 804关注 0票数 0

我对python相当陌生(仅学习了几周),我正在使用python3.6和Pyqt5来完成我的第一个应用程序。它是为我老板的公司的私人区块链而设的一个区块链钱包。我把一切都做好了(如果你问我的话,这是奇迹)。我使用线程,这样当块链的API需要很长时间处理时,GUI就不会被冻结。所以我有一段代码

代码语言:javascript
运行
复制
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进行新的地址创建,有时需要几秒钟,但由于它位于线程上,用户可以自由地继续使用它,而该函数看起来就像它不起作用。我想知道我怎么能有一个像“生成新地址.”这样的加载指示器.或者类似的东西。处理这种情况的最好方法是什么?也许是一个小进度条,还是加载gif覆盖?我是否需要从线程中得到某种回调,以便知道何时隐藏加载警告?如果是的话,我怎么做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-06 03:07:21

对于这种类型的任务,可以使用QProgressDialog,在下面的部分中有一个示例:

代码语言:javascript
运行
复制
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_())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49684431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档