Wayward:)
2019-12-14 16:29
采纳率: 50%
浏览 4.4k

PyQt5计时器QTimer的停止和重启

由于我有一个耗时的子程序,所以我想用QTimer()加上进度条的方法优化用户的等待时间,
但是,当我初始化计时器,并start()后,发现相关的超时槽函数并没有触发,这是为什么了?

"""创建一个带提示的进度条"""
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys
import time

class MyProgressBar(QWidget):
    def __init__(self,showMessage = "提示信息",parent = None):
        super(MyProgressBar, self).__init__(parent)
        self.message = showMessage
        self.setWindowTitle("加载数据")
        self.pbar = QProgressBar() # 构建一个进度条
        self.label = QLabel()
        # 添加到布局
        self.layout = QVBoxLayout()
        self.setLayout(self.layout)
        self.layout.addWidget(self.label) # 提示信息
        self.layout.addWidget(self.pbar) # 进度条
        self.label.setText(self.message)

        self.timer = QTimer(self)  # 初始化一个时钟
        self.step = 0  # 进度条的值
        self.timer.start(50)
        self.timer.timeout.connect(self.update)
        self.show()
        #self.setWindowFlags(Qt.WindowStaysOnTopHint)
    def setMessage(self,message):
        """重新设置信息,并重启进度条"""
        print(self.timer.isActive())
        self.message = message
        self.step = 0
        if not self.timer.isActive():
            self.timer.start(50)
        self.show()
    def callback(self, signal):
        print("调用回调函数",signal)
        if signal is False:
            return
        if self.timer.isActive(): # 当前正在运行
            self.pbar.setValue(100)
            self.timer.stop()
            self.step = 0 # 重置
            QMessageBox.information(
                self,
                "提示",
                "{},已经完成".format(self.message),
                QMessageBox.Yes | QMessageBox.No
            )
        #self.setWindowModality(Qt.NonModal)
        self.hide()
    def update(self):
        print("调用的时钟事件")
        self.pbar.setValue(self.step) # 赋新值
        if self.step >= 100:
            # 停止进度条
            self.timer.stop()
            self.step = 0
        # 卡在99%,等后台程序运行完成则到100%
        elif self.step < 99:
            self.step += 1
def worker():
    time.sleep(5)
if __name__ == '__main__':
    app = QApplication(sys.argv)
    myui = MyProgressBar(showMessage="第一次")
    worker() # 模拟耗时程序
    myui.callback(True)
    # time.sleep(1)
    # myui.setMessage("第二次")
    # time.sleep(5)
    # myui.callback(True)
    sys.exit(app.exec_())

而且,发现删除耗时程序worker()和回调函数后,进度条能一直到99%并卡住?

1条回答 默认 最新

相关推荐 更多相似问题