python - Python:时间/帧转换计算器
问题描述
这是一个非常初学者的问题,但我真的尝试过但失败了。
我正在尝试制作一个简单的动画时间计算器来帮助我完成工作。我希望它有 3 个用户输入:
1) 每秒帧数 2) 总帧数 3) 总时间
类似于: total_frames = seconds * framerate total_time = frames / framerate
我遇到的问题是:
如何将变量的结果链接到 gui 上的用户输入?然后,例如,当用户输入framerate和total_time时更新total_frames ,当用户输入framerate和total_frames时也更新total_time。
如何获得获取格式mm/ss/ff的总时间(其中 ff 是基于帧率的帧)。因此,就像普通的分钟和秒计时器一样,您的帧速率不是毫秒,而是每秒的最大值。
我已经设法让基本代码工作,只是打印出变量的结果。而且我还设法制作了一个基本的 gui,它使用 Qt 设计器从用户那里获取输入。
我希望我已经体面地解释了这一点。任何帮助都感激不尽。我是个菜鸟,但我想慢慢地到达那里。
尝试1:
我的代码:
from datetime import time
from calc import *
framerate = 24#input('Frames Per Second ?')
seconds = 10 #input('How Many Seconds ?')
frames = seconds * framerate
total_time = frames / framerate
print(frames)
print(total_time)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
AnimationCalculator = QtWidgets.QMainWindow()
ui = Ui_AnimationCalculator()
ui.setupUi(AnimationCalculator)
AnimationCalculator.show()
sys.exit(app.exec_())
我的用户界面:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_AnimationCalculator(object):
def setupUi(self, AnimationCalculator):
AnimationCalculator.setObjectName("AnimationCalculator")
AnimationCalculator.resize(341, 224)
palette = QtGui.QPalette()
brush = QtGui.QBrush(QtGui.QColor(105, 173, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(105, 173, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(105, 173, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(105, 173, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush)
brush = QtGui.QBrush(QtGui.QColor(105, 173, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush)
brush = QtGui.QBrush(QtGui.QColor(105, 173, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush)
AnimationCalculator.setPalette(palette)
self.centralwidget = QtWidgets.QWidget(AnimationCalculator)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(210, 80, 161, 61))
palette = QtGui.QPalette()
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255, 128))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255, 128))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush)
brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)
brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipText, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 128))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush)
self.label.setPalette(palette)
font = QtGui.QFont()
font.setFamily("Myriad Pro")
font.setPointSize(36)
font.setBold(True)
font.setWeight(75)
self.label.setFont(font)
self.label.setInputMethodHints(QtCore.Qt.ImhDigitsOnly|QtCore.Qt.ImhFormattedNumbersOnly)
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(210, 150, 161, 61))
palette = QtGui.QPalette()
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255, 128))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255, 128))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush)
brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)
brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipText, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 128))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush)
self.label_2.setPalette(palette)
font = QtGui.QFont()
font.setFamily("Myriad Pro")
font.setPointSize(36)
font.setBold(True)
font.setWeight(75)
self.label_2.setFont(font)
self.label_2.setInputMethodHints(QtCore.Qt.ImhDigitsOnly|QtCore.Qt.ImhFormattedNumbersOnly)
self.label_2.setObjectName("label_2")
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(210, 10, 161, 61))
palette = QtGui.QPalette()
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255, 128))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255, 128))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush)
brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush)
brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush)
brush = QtGui.QBrush(QtGui.QColor(120, 120, 120))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush)
brush = QtGui.QBrush(QtGui.QColor(255, 255, 255))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipText, brush)
brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 128))
brush.setStyle(QtCore.Qt.SolidPattern)
palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush)
self.label_3.setPalette(palette)
font = QtGui.QFont()
font.setFamily("Myriad Pro")
font.setPointSize(36)
font.setBold(True)
font.setWeight(75)
self.label_3.setFont(font)
self.label_3.setObjectName("label_3")
self.timeEdit_2 = QtWidgets.QTimeEdit(self.centralwidget)
self.timeEdit_2.setGeometry(QtCore.QRect(10, 150, 191, 61))
font = QtGui.QFont()
font.setPointSize(26)
self.timeEdit_2.setFont(font)
self.timeEdit_2.setObjectName("timeEdit_2")
self.spinBox = QtWidgets.QSpinBox(self.centralwidget)
self.spinBox.setGeometry(QtCore.QRect(10, 81, 191, 61))
font = QtGui.QFont()
font.setPointSize(26)
self.spinBox.setFont(font)
self.spinBox.setInputMethodHints(QtCore.Qt.ImhDigitsOnly)
self.spinBox.setWrapping(False)
self.spinBox.setAlignment(QtCore.Qt.AlignCenter)
self.spinBox.setReadOnly(False)
self.spinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.PlusMinus)
self.spinBox.setMaximum(50000)
self.spinBox.setSingleStep(1)
self.spinBox.setProperty("value", 0)
self.spinBox.setObjectName("spinBox")
self.spinBox_2 = QtWidgets.QSpinBox(self.centralwidget)
self.spinBox_2.setGeometry(QtCore.QRect(10, 10, 191, 61))
font = QtGui.QFont()
font.setPointSize(26)
self.spinBox_2.setFont(font)
self.spinBox_2.setInputMethodHints(QtCore.Qt.ImhDigitsOnly)
self.spinBox_2.setWrapping(False)
self.spinBox_2.setAlignment(QtCore.Qt.AlignCenter)
self.spinBox_2.setReadOnly(False)
self.spinBox_2.setButtonSymbols(QtWidgets.QAbstractSpinBox.PlusMinus)
self.spinBox_2.setMinimum(1)
self.spinBox_2.setMaximum(240)
self.spinBox_2.setSingleStep(1)
self.spinBox_2.setProperty("value", 24)
self.spinBox_2.setObjectName("spinBox_2")
AnimationCalculator.setCentralWidget(self.centralwidget)
self.retranslateUi(AnimationCalculator)
QtCore.QMetaObject.connectSlotsByName(AnimationCalculator)
def retranslateUi(self, AnimationCalculator):
_translate = QtCore.QCoreApplication.translate
AnimationCalculator.setWindowTitle(_translate("AnimationCalculator", "Animation Calculator"))
self.label.setText(_translate("AnimationCalculator", "Frames"))
self.label_2.setText(_translate("AnimationCalculator", "Time"))
self.label_3.setText(_translate("AnimationCalculator", "FPS"))
self.timeEdit_2.setDisplayFormat(_translate("AnimationCalculator", "HH:mm:ss"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
AnimationCalculator = QtWidgets.QMainWindow()
ui = Ui_AnimationCalculator()
ui.setupUi(AnimationCalculator)
AnimationCalculator.show()
sys.exit(app.exec_())
尝试2:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit
framerate = 24#input('Frames Per Second ?')
seconds = 5 #input('How Many Seconds ?')
total_frames = seconds * framerate
total_time = total_frames / framerate
def onChangeFPS():
fps = field_1.text()
print(fps)
def onChangeFrames():
framerate = field_2.text()
print(total_frames)
def onChangeSeconds():
total_seconds = field_3.text()
print(total_time)
app = QApplication(sys.argv)
widget_1 = QWidget()
field_1 = QLineEdit(widget_1)
field_1.move(1 , 20)
field_1.resize(200 , 30)
field_1.returnPressed.connect(onChangeFPS)
field_2 = QLineEdit(widget_1)
field_2.move(1 , 50)
field_2.resize(200 , 30)
field_2.returnPressed.connect(onChangeFrames)
field_3 = QLineEdit(widget_1)
field_3.move(1 , 80)
field_3.resize(200 , 30)
field_3.returnPressed.connect(onChangeSeconds)
widget_1.setGeometry(100,100,300,150)
widget_1.setWindowTitle("Animation Time Calculator")
widget_1.show()
sys.exit(app.exec_())
对不起代码墙,再次感谢!
更新 2021-09-19:好的,所以我尝试了很多东西,我意识到让脚本以基于初始输入选择代码流的方式工作(即:如果用户输入,它知道计算时间首先是帧,反之亦然)对我来说很难理解代码的过程流。
所以我决定尝试将其分解为几个定义,并询问用户他们想使用哪个版本。
我已经设法让它工作,它只是让用户输入帧速率来确定毫秒,并以我不理解的 mm:ss:frames 格式显示结果。
一旦我弄清楚这一点,我就会让 gui 运行,并会在我这样做时在此处更新。
这是我更新的代码:
def framecount():
fps = int(input("Enter Frames per Second: "))
total_time = float(input("Enter total time: "))
total_frame = fps * total_time
print("Total frames: {}".format(total_frame))
def timecount():
fps = int(input("Enter Frames per Second: "))
total_frame = int(input("Enter total frame: "))
total_time = total_frame / fps
print("Total time: {}".format(total_time)+" seconds")
choose = int(input("What would you like to calculate ? 1. Total Frames 2. Total Time : "))
if choose == 1:
framecount()
elif choose == 2:
timecount()
更新 2 2021-09-19:
似乎datetime.timedelta()可以用total_time的格式做我想做的事
这是代码,我唯一真正无法解决的问题是如何在每次用户输入fps时 +1 时将毫秒重置为零
这是我的代码:
from datetime import timedelta
def framecount():
fps = int(input("Enter Frames per Second: "))
total_time = float(input("Enter total time: "))
total_frame = fps * total_time
print("Total frames: {}".format(total_frame))
def timecount():
fps = int(input("Enter Frames per Second: "))
total_frame = int(input("Enter total frame: "))
total_time = timedelta( seconds=(total_frame / fps), milliseconds=total_frame )
print("Total time: {}".format(total_time))
choose = int(input("What would you like to calculate ? 1. Total Frames 2. Total Time : "))
if choose == 1:
framecount()
elif choose == 2:
timecount()
else:
print("Please choose option 1. or 2.)")
用我的测试输入打印出来:
你想计算什么?1. 总帧数 2. 总时间: 2输入每秒帧数:25输入总帧数:107总时间:0:00:04.387000
解决方案
fps = int(input("Enter Frames per Second: ") or None)
total_time = int(input("Enter total time: ") or None)
total_frame = int(input("Enter total frame: ") or None)
if not fps is None and not total_time is None:
total_frame = fps * total_time
elif not fps is None and not total_frame is None:
total_time = total_frame / fps
else:
# here you can enter default time, fps
您可以在代码顶部使用此部分来获取用户输入,然后根据输入相应地处理第三个变量。这里的优先级首先获得 fps 和总时间……</p>
这是最简单的版本,但如果您想要更复杂的版本,也可以这样做……让我知道
推荐阅读
- python - Python 中的字符串变量可以存储的最大字符数是多少?
- javascript - 按下按钮一次后,如何使图像切换回原始图像 src
- c# - 带有 ItemControl 的 WrapPanel
- c++ - 尝试在 Arduino 上使用 millis() 创建计时器功能
- ruby - 在 Ruby 中为类的实例动态定义超级方法
- reactjs - 使用 reactjs 登录后无法获取组件
- node.js - 如何使用 NodeJS 驱动程序对字段值使用 OR 过滤 MongoDB 集合?
- mongodb - @SpringBootTest 如何预填充嵌入式 MongoDB?
- python - Python数字数组程序
- java - 如何将 Jersey+Grizzly jar 部署到 AWS