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

2024-10-02 00:43:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Pyqt时间线进行基于帧的方法。我想让它运行每一帧,无论发生什么,即使我添加了时间。睡眠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的情况下完成它,我似乎也需要使用线程


Tags: importselfdefsystlvboxcfrqpushbutton

热门问题