如何在python上为长处理线程创建加载警告?
我对pythononly还相当陌生,只需几周的学习时间,就可以完成我的第一个使用Python3.6和Pyqt5 for GUI的应用程序。 它包含在我老板公司的私有区块链的区块链钱包中。 如果你问我的话,我一切正常。 我使用线程,这样当区块链的API需要很长时间处理时,GUI不会冻结。 所以我有这段代码如何在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
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_())
你能测量你任务的进度吗?不太可能,一个简单的脉冲全进度条或加载警告就足够了。。。