Pyqt5 时间线在按下播放按钮时跳过帧

问题描述

我正在尝试将 Pyqt 时间线用于基于框架的方法。我希望它运行每一帧,无论如何,即使我添加 time.sleep 1 秒。如果 framechangeup 函数/方法有很多事情要做,它就会开始跳帧。

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *

import time


class mainWin(QDialog):
    def __init__(self,parent=None):
        super(mainWin,self).__init__(parent)

        ffr = 1
        lfr = 1440

        self.frameRate = 25

        self.timeLength = ((lfr + 1 - ffr) / self.frameRate) * 1000

        print(self.timeLength)

        self.tl = QTimeLine(self.timeLength)
        self.tl.setFrameRange(ffr,lfr)
        self.tl.setEasingCurve(QEasingCurve.Linear)
        self.tl.loopCount = 0

        self.tl.frameChanged.connect(self.framechangeup)

        self.center()
        self.winWidgets()

    def framechangeup(self):
        self.tl.setPaused(True)
        print(self.tl.currentFrame())
        self.cfr = self.tl.currentFrame()
        self.curF.setText(str(self.cfr))

        time.sleep(0.3)
        self.tl.resume()

    def winWidgets(self):
        hBox = QHBoxLayout()
        # hBox.addStretch(1)

        playBut = QPushButton("play",self)
        playBut.setToolTip("This is a <b>QPushButton</b> widget")
        playBut.resize(playBut.sizeHint())

        stpBut = QPushButton("stop",self)
        stpBut.setToolTip("This is a <b>QPushButton</b> widget")
        stpBut.resize(stpBut.sizeHint())

        hBox.addWidget(playBut)
        playBut.clicked.connect(self.playbut)

        hBox.addWidget(stpBut)
        stpBut.clicked.connect(self.stpbut)

        vBox = QVBoxLayout()

        cfr = 1

        editsBox = QHBoxLayout()

        cfLable = QLabel("cur Frame")

        self.curF = QLineEdit()
        self.curF.setReadOnly(True)
        self.curF.setText(str(cfr))

        lastF = QLineEdit()

        editsBox.addWidget(cfLable)
        editsBox.addWidget(self.curF)

        vBox.addLayout(editsBox)
        vBox.addLayout(hBox)
        self.setLayout(vBox)

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def playbut(self):
        self.tl.start()

    def stpbut(self):
        self.tl.stop()
        print("stp")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    exe = mainWin()
    exe.show()

    sys.exit(app.exec_())

即使我尝试在没有 Qtimeline 的情况下进行操作,我似乎也需要使用线程。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)