问题描述
我正在尝试将 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 (将#修改为@)