Wayward:) 2019-12-14 16:29 采纳率: 50%
浏览 5102
已结题

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条回答

  • dabocaiqq 2019-12-16 00:11
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 spring后端vue前端
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题