퇴근 타이머 만듦
2022. 8. 23. 16:41

대충 이렇게 생긴... 타이머이다...
지금이 전체 근무시간의 얼마 정도 지났는지... 집에 가기까지는 얼마나 남았는지를 보여준다.
현재 시점에서 얼마나 남았는지도 구하게 할까 했는데 그렇게까지 하긴 귀찮다.......
협력업체 분이 오신다길래 시각적으로 보여줄 수 있을만한 gui를 만든다더니...
그냥 해본 말인 건지 그 분도 안 오고 할 것도 없어져서...(야근도했는데 ㄱ=)
기왕 gui 배운 김에 만들어봤다...
이하 코드 전문
import sys
from datetime import datetime
from datetime import timedelta
from PyQt5 import uic
from PyQt5.QtWidgets import *
from PyQt5.QtWidgets import (QApplication,QFileDialog)
from PyQt5.QtCore import QTimer, QTime
from PyQt5 import QtCore, QtWidgets
class WindowClass(QDialog):
def __init__(self):
super().__init__()
#gui설정 (pyqt)
Dialog.setObjectName("dialog")
Dialog.resize(372, 201)
Dialog.setWindowFlags(Dialog.windowFlags() | QtCore.Qt.WindowMinimizeButtonHint | QtCore.Qt.WindowSystemMenuHint)
self.verticalLayoutWidget = QtWidgets.QWidget(Dialog)
self.verticalLayoutWidget.setGeometry(QtCore.QRect(270, 20, 81, 81))
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.StartStopButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.StartStopButton.setObjectName("StartStopButton")
self.verticalLayout.addWidget(self.StartStopButton)
self.ResetButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.ResetButton.setObjectName("ResetButton")
self.verticalLayout.addWidget(self.ResetButton)
self.pBar = QtWidgets.QProgressBar(Dialog)
self.pBar.setGeometry(QtCore.QRect(20, 120, 331, 23))
self.pBar.setMinimum(0)
self.pBar.setProperty("value", 0)
self.pBar.setAlignment(QtCore.Qt.AlignCenter)
self.pBar.setTextVisible(True)
self.pBar.setObjectName("pBar")
self.gridLayoutWidget = QtWidgets.QWidget(Dialog)
self.gridLayoutWidget.setGeometry(QtCore.QRect(20, 20, 221, 81))
self.gridLayoutWidget.setObjectName("gridLayoutWidget")
self.gridLayout = QtWidgets.QGridLayout(self.gridLayoutWidget)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
self.EndTime = QtWidgets.QTimeEdit(self.gridLayoutWidget)
self.EndTime.setTime(QtCore.QTime(18, 0, 0))
self.EndTime.setObjectName("EndTime")
self.gridLayout.addWidget(self.EndTime, 1, 1, 1, 1)
self.label_2 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_2.setLayoutDirection(QtCore.Qt.LeftToRight)
self.label_2.setFrameShape(QtWidgets.QFrame.NoFrame)
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
self.label_2.setObjectName("label_2")
self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)
self.StartTime = QtWidgets.QTimeEdit(self.gridLayoutWidget)
self.StartTime.setAcceptDrops(False)
self.StartTime.setTime(QtCore.QTime(9, 0, 0))
self.StartTime.setObjectName("StartTime")
self.gridLayout.addWidget(self.StartTime, 0, 1, 1, 1)
self.label_1 = QtWidgets.QLabel(self.gridLayoutWidget)
self.label_1.setLayoutDirection(QtCore.Qt.LeftToRight)
self.label_1.setAlignment(QtCore.Qt.AlignCenter)
self.label_1.setObjectName("label_1")
self.gridLayout.addWidget(self.label_1, 0, 0, 1, 1)
self.horizontalLayoutWidget = QtWidgets.QWidget(Dialog)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(20, 160, 331, 21))
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.label = QtWidgets.QLabel(self.horizontalLayoutWidget)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.horizontalLayout.addWidget(self.label)
self.left_time = QtWidgets.QLabel(self.horizontalLayoutWidget)
self.left_time.setAlignment(QtCore.Qt.AlignCenter)
self.left_time.setObjectName("left_time")
self.horizontalLayout.addWidget(self.left_time)
#문자
_translate = QtCore.QCoreApplication.translate
Dialog.setWindowTitle(_translate("Dialog", "타이머"))
self.StartStopButton.setText(_translate("Dialog", "시작"))
self.ResetButton.setText(_translate("Dialog", "초기화"))
self.pBar.setFormat(_translate("Dialog", "%p%"))
self.EndTime.setDisplayFormat(_translate("Dialog", "hh:mm"))
self.label_1.setText(_translate("Dialog", "시작"))
self.StartTime.setDisplayFormat(_translate("Dialog", "hh:mm"))
self.label_2.setText(_translate("Dialog", "종료"))
self.label.setText(_translate("Dialog", "남은시간 :"))
self.left_time.setText(_translate("Dialog", "남은시간"))
# 프로그레스바
self.pBar.setValue(0)
# 타이머
self.timer = QTimer()
#기본 시간
self.StartTime.setTime(QTime(9,00,00))
self.EndTime.setTime(QTime(18,00,00))
#변수
self.i = 0
self.toggleFlag = 0
# 이벤트
self.StartStopButton.clicked.connect(self.doAction)
self.ResetButton.clicked.connect(self.ResetAll)
self.timer.timeout.connect(self.timerEvent)
def ResetAll(self):
reply = QMessageBox.question(self, "초기화", "초기화할까요?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes :
self.timer.stop()
self.StartStopButton.setText('시작')
self.StartTimeValue = None
self.EndTimeValue = None
self.step = 0
self.i = 0
self.TimeLeft = 0
self.toggleFlag = 0
self.pBar.setValue(0)
self.pBar.setFormat('%.02f%%' % 0)
self.left_time.setText('남은시간')
def doAction(self):
if self.timer.isActive():
self.timer.stop()
self.StartStopButton.setText('시작')
else:
if self.toggleFlag == 0 :
self.StartTimeValue = (datetime.strptime(self.StartTime.time().toString(),'%H:%M:%S'))
self.EndTimeValue = (datetime.strptime(self.EndTime.time().toString(),'%H:%M:%S'))
self.TimeLeft = (self.EndTimeValue - self.StartTimeValue)
self.diff = int(self.TimeLeft.seconds)
if self.TimeLeft.days < 0 :
QMessageBox.warning(self, "오류", "다시 입력하세요.", QMessageBox.Yes)
else :
self.timer.start(1000)
self.StartStopButton.setText('정지')
self.timerEvent()
def timerEvent(self):
# print(self.i,self.diff)
self.toggleFlag = 1
if self.i >= self.diff :
self.timer.stop()
self.StartStopButton.setText('종료')
self.left_time.setText('종료됨')
self.step = (self.i / self.diff) * 100
self.pBar.setFormat('%.02f%%' % self.step)
self.pBar.setValue(self.step)
self.TimeLeft = self.TimeLeft - timedelta(seconds=1)
self.left_time.setText(str(self.TimeLeft))
self.i += 1
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Dialog = QtWidgets.QDialog()
ui = WindowClass()
Dialog.show()
sys.exit(app.exec_())
엄청 간단하게 만든 건데도 datetime 때문에 머리아팠다... 시간만 따로 쓸 수는 없는건가...
그리고 원래는 anaconda 설치하면서 같이 깔린 designer로 ui를 만들었는데 pyinstaller로 패키징이 안 돼서
직접 py코드로 변환해 위에다 붙여넣었더니 저렇게 기나긴 나열이 되어버렸다.
파이썬으로는... exe 같은 거 만들지 말자...
이것도 exe 변환은 했는데 파일 크기가 엄청 커지는 바람에 여기 업로드를 못 함...ㄱ=
뭔가... 좀 더 깔끔하게 코드를 만들 수 있으면 좋을텐데...
모르겠다... 공부하기도 머리쓰기도 노력하기도 싫다...
퇴근이... 하고싶다...
