我是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叠加? 我是否必须从线程获得某种回调,以便我知道何时隐藏加载警告?如果是这样,我该怎么做?
答案 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_())