我对python相当陌生(仅学习了几周),我正在使用python3.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进行新的地址创建,有时需要几秒钟,但由于它位于线程上,用户可以自由地继续使用它,而该函数看起来就像它不起作用。我想知道我怎么能有一个像“生成新地址.”这样的加载指示器.或者类似的东西。处理这种情况的最好方法是什么?也许是一个小进度条,还是加载gif覆盖?我是否需要从线程中得到某种回调,以便知道何时隐藏加载警告?如果是的话,我怎么做呢?
发布于 2018-04-06 03:07:21
对于这种类型的任务,可以使用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_())
https://stackoverflow.com/questions/49684431
复制相似问题