Python: Time/Frames Conversion Calculator

Viewed 335

This is a very beginner question but I have really tried and failed.

I am trying to make a simple animation time calculator to help me with work. I want it to have 3 user inputs:

1) Frames Per Second 2) Total Frames 3) Total Time

Something like: total_frames = seconds * framerate total_time = frames / framerate

The problems I'm having are:

  1. How do I link the result of the variables to the user input on the gui ? And then have, for example, total_frames to update when the user has input framerate and total_time, but also have total_time update when the user has input framerate and total_frames .

  2. How to get the total time to get the format mm/ss/ff ( with ff being frames based on framerate ). So like a normal minutes and seconds timer but instead of milliseconds you have the framerate as max per second.

I have managed to get the basic code working just printing out the results of the variables. And I have also managed to make a basic gui that takes input from the user with Qt designer.

I hope I have explained that decently. Any help will be much appreciated. I'm a total noob but trying to get there slowly.

attempt 1:

my code:

    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_())

my gui:

    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_())

Attempt 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_())

Sorry for the wall of code and thanks again !

UPDATE 2021-09-19: Ok, so I have tried a lot of things and I realised having the script work in a way that chooses the flow of code based on the initial input ( ie: it knows to calculate time if the user put in frames first, or vice versa) is way to hard for me to underdstand with the procedural flow of the code.

So I decided to try break it up into a couple definitions and ask the user which version they would like to use.

I have managed to get it working, it's just getting the miliseconds to be determined by the user input for framerate, and displaying the result in a mm:ss:frames format that I don't understand.

Once I figure that out I'm going to get the gui going and will update that here when I do.

Here's my updated code:

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()

UPDATE 2 2021-09-19:

It seems that datetime.timedelta() can do what I want with the format for total_time

This is the code, the only thing I really can't work out is how to get milliseconds to reset to zero every time it goes +1 over the user input for fps

This is my code:

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.)")

with my test inputs this prints out:

What would you like to calculate ? 1. Total Frames 2. Total Time : 2 Enter Frames per Second: 25 Enter total frame: 107 Total time: 0:00:04.387000

1 Answers
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

You can use this part at the top of your code to get the user inputs and then process the 3rd variable accordingly to the inputs. Here the priority gets fps and total time first…

This is the easiest version but if you want more sophisticated ones those can be done too… let me know

Related