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:
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 .
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