30  스톱워치 앱 (Stopwatch App)

시간을 측정하고 랩 타임(Lap Time)을 기록할 수 있는 스톱워치 앱을 만들어 봅시다. 소수점 이하의 정밀한 시간을 실시간으로 보여주고, 필요할 때마다 중간 기록을 남기는 것이 목표입니다.

이 프로젝트는 시간 측정 기술과 실시간 UI 업데이트, 그리고 간단한 데이터 리스트를 다루는 방법을 익히기에 아주 좋은 과제입니다. 특히 운동이나 실험 시 유용한 스톱워치를 직접 설계해 보세요.

30.1 주요 개발 포인트

  • 정밀한 시간 측정 (High Precision Timer): time.time() 이나 time.perf_counter()를 사용하여 정확한 시간을 측정합니다.
  • 시작, 일시정지, 재개, 초기화 기능: 타이머의 상태를 제어하고 중단된 시점부터 다시 시작할 수 있도록 합니다.
  • 랩 타임 기록 및 리스트 관리: ‘Lap’ 버튼을 누를 때마다 현재 시간을 기록하고 목록으로 보여줍니다.
  • 실시간 UI 업데이트 (Live Update): 0.1초 또는 0.01초 단위로 경과 시간을 화면에 매끄럽게 업데이트합니다.
  • 사용자 인터페이스 (GUI): 큰 숫자로 현재 시간을 보여주고, 랩 기록을 아래쪽에 표 형태로 배치한 UI를 구축합니다.

30.2 Python 구현 예시 (Tkinter 활용 간단한 스톱워치 시뮬레이션)

import time

class SimpleStopwatch:
    """
    시간을 측정하고 랩 타임을 기록하는 기능을 관리합니다.
    """
    def __init__(self):
        self.start_time = 0
        self.elapsed_time = 0
        self.is_running = False
        self.laps = []

    def start(self):
        """
        스톱워치를 시작하거나 재개합니다.
        """
        if not self.is_running:
            self.start_time = time.time() - self.elapsed_time
            self.is_running = True
            print("스톱워치 시작!")

    def pause(self):
        """
        스톱워치를 일시정지합니다.
        """
        if self.is_running:
            self.elapsed_time = time.time() - self.start_time
            self.is_running = False
            print(f"일시정지됨. 경과 시간: {self.elapsed_time:.2f}초")

    def reset(self):
        """
        스톱워치를 초기화합니다.
        """
        self.start_time = 0
        self.elapsed_time = 0
        self.is_running = False
        self.laps = []
        print("초기화 완료.")

    def record_lap(self):
        """
        현재 랩 타임을 기록합니다.
        """
        if self.is_running:
            current_lap = time.time() - self.start_time
            self.laps.append(current_lap)
            print(f"랩 {len(self.laps)}: {current_lap:.2f}초")

if __name__ == "__main__":
    stopwatch = SimpleStopwatch()
    
    # 3초간 실행 후 랩 기록 시나리오 테스트
    stopwatch.start()
    time.sleep(1.2)
    stopwatch.record_lap()
    time.sleep(1.5)
    stopwatch.pause()
    
    # 최종 결과 요약
    print(f"\n총 경과 시간: {stopwatch.elapsed_time:.2f}초")
    print(f"랩 기록 목록: {['{:.2f}s'.format(l) for l in stopwatch.laps]}")