퇴근 타이머 만듦

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 변환은 했는데 파일 크기가 엄청 커지는 바람에 여기 업로드를 못 함...ㄱ=

 

뭔가... 좀 더 깔끔하게 코드를 만들 수 있으면 좋을텐데...

모르겠다... 공부하기도 머리쓰기도 노력하기도 싫다...

퇴근이... 하고싶다...

 

다 쓰고 나니까 여기까지 찼다. 이것만 뚫어져라 보는 중...

 

Created by BANANA