본문 바로가기

공부 일지 #13 | 미니 토이 프로젝트-Timer & Stopwatch

@studying:)2025. 7. 31. 16:42

학습 날짜 2025.07.30


Python 수업을 마무리하며, 짝꿍과 함께(또는 혼자서) 지금까지 배운 내용을 활용해 작은 프로그램을 만들어보는 시간을 가졌다.
우리는 함께 하나의 프로젝트를 만들어보기로 결정했고, ChatGPT에게 아이디어를 추천받아 실습에서는 다뤄보지 않았던 Timer와 Stopwatch를 주제로 정했다.
두 명이 함께 작업하는 만큼 기능이 두 가지인 프로젝트로 의도적으로 선택했고, 나는 Timer, 짝꿍은 Stopwatch 기능을 각각 구현하기로 했다.

 

Timer

이 프로젝트는 Python의 GUI 라이브러리인 tkinter를 활용해 구현한 Timer&Stopwatch 프로그램입니다.
사용자가 입력한 시(hour)와 분(minute)을 기준으로 타이머가 동작하며, 일시 정지(Pause)와 초기화(Reset) 기능도 함께 제공합니다.
이번 프로젝트는 짝꿍과 함께 진행되었으며, 저는 Timer 기능 구현을 맡아 개발하였습니다.
본 문서와 코드에는 제가 구현한 부분만 정리되어 있습니다.

 

기술 스택

  • Python 3.12
  • tkinter (GUI 제작용 표준 라이브러리)

 

주요 기능

  • 시(hour)와 분(minute) 입력으로 타이머 시간 설정 가능
  • 타이머 시작, 일시 정지, 초기화 기능 제공
  • 타이머 종료 시 빨간색 텍스트로 종료 표시
  • .after() 메서드를 사용해 1초 단위로 시간 감소

 

사용 방법

  • 프로그램 실행 후 "Timer" 버튼을 클릭한다.
  • 두 개의 입력창에 시와 분을 입력한다.
  • Start 버튼을 누르면 타이머가 시작된다.
  • Pause 버튼을 누르면 타이머가 정지되며, 다시 Start를 누르면 이어서 작동한다.
  • Reset 버튼을 누르면 타이머는 00:00:00으로 초기화되며, 입력창도 0시 0분으로 되돌아간다.

 

코드 설명

📦 class

  • __init__(self, window)
    • 새창을 입력을 받음, 변수 설정
    • 시간 입력: Entry를 통해 시(hour)와 분(minute)을 입력
    • 시간 출력: Label에 타이머 시간이 HH:MM:SS 형식으로 표시됨
    • 버튼 3종: Start, Pause, Reset 각 기능 연결
class timer:
    def __init__(self, window):
        self.window = window
        self.total = 0
        self.running = 0
        self.hour = StringVar(master=self.window, value="0")
        self.minute = StringVar(master=self.window, value="0")

        # 시간 설정 Entry
        self.lb_hour = Label(self.window, text="hour: ", font=("Helvetica", 12))
        self.ent_hour = Entry(self.window, textvariable=self.hour, width=8)
        self.lb_min = Label(self.window, text="minute: ", font=("Helvetica", 12))
        self.ent_min = Entry(self.window, textvariable=self.minute, width=8)

        self.lb_hour.grid(column=0, row=0, pady=20)
        self.ent_hour.grid(column=1, row=0, ipady=3)
        self.lb_min.grid(column=4, row=0)
        self.ent_min.grid(column=5, row=0, ipady=3)

        # 타이머 출력 라벨
        self.lb_time = Label(self.window, text="00:00:00", font=("맑은 고딕", 48))
        self.lb_time.grid(column=0, row=2, columnspan=6, pady=10)

        # 버튼들
        self.bt_start = Button(self.window, text="Start", width=8, height=2, command=self.fn_start)
        self.bt_pause = Button(self.window, text="Pause", width=8, height=2, command=self.fn_pause)
        self.bt_reset = Button(self.window, text="Reset", width=8, height=2, command=self.fn_reset)
        self.bt_start.grid(column=0, row=1, columnspan=2, padx=12)
        self.bt_pause.grid(column=2, row=1, columnspan=2, padx=12)
        self.bt_reset.grid(column=4, row=1, columnspan=2, padx=12)
  • fn_start()
    • 입력된 시간을 초 단위로 변환해 총 시간(total) 계산
    • count_down() 호출하여 타이머 시작
    def fn_start(self):
        self.running = 1
        if self.total == 0:
            self.total = (int(self.ent_hour.get()) * 3600) + (int(self.ent_min.get()) * 60)
        self.count_down()
  • fn_stop(): 타이머 정지 (self.running = 0)
    def fn_pause(self):
        self.running = 0
  • fn_reset(): 시간 초기화 및 화면 초기 상태로 리셋
    def fn_reset(self):
        self.running, self.total = 0, 0
        self.hour.set("0")
        self.minute.set("0")
        self.lb_time.config(text="00:00:00", fg="black")
  • count_down
    • .after() 메서드로 1초마다 재귀 호출
    • self.total이 0이 될 때까지 매초 감소
    • 종료 시, 시간이 빨간색으로 표시되고 중지됨
    def count_down(self):
        if self.running:
            self.lb_time.config(text=f"{self.total//3600:02}:{(self.total%3600)//60:02}:{(self.total%3600)%60:02}")
            if self.total>0:
                self.window.after(1000, self.count_down)
                self.total -= 1
            else:
                self.lb_time.config(text="00:00:00", fg="red")
                self.running = 0

 

🔨 함수

  • timer_wnd
    • Timer 기능 전용 창을 새롭게 띄움
    • Toplevel()을 사용해 메인 앱과는 별도의 서브 윈도우를 생성하며, 타이머 위젯들이 이 창에 배치
def timer_wnd():
    t_wnd = Toplevel(app)
    t_wnd.geometry("400x300")
    t_wnd.title("Timer")
    t_wnd.config(padx=40, pady=30)

    tm = timer(t_wnd)

함수가 호출되었을 시 실행 화면

 

📌 실행부

  • 사용자에게 Timer와 Stopwatch 중 하나를 선택할 수 있는 창을 제공
if __name__ == "__main__":
    app = Tk()
    app.geometry("300x200")
    app.config(padx=30, pady=20)
    app.title("Timer & Stopwatch")

    lb_title = Label(app, text="Which one do you want?", font=("Helvetica", 16))
    lb_title.grid(column=0, row=0, columnspan=3, pady=20)

    bt_timer = Button(app, text="Timer", width=8, height=2, command=timer_wnd)
    bt_timer.grid(column=0, row=1)

    bt_stopwatch = Button(app, text="Stopwatch", width=8, height=2, command=stopwatch_wnd)
    bt_stopwatch.grid(column=2, row=1)

    app.mainloop()

실행 화면

 

참고자료 및 도구

  • DelftStack - tkinter 튜토리얼 참고
  • 초기화 기능은 chatGPT를 활용 및 참고
studying:)
@studying:) :: what i studied

studying:) 님의 학습 여정을 기록하는 블로그입니다.

목차