Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 스톱워치 만들기 – tkinter GUI 완전 정복

스톱워치(stopwatch)는 두 사건 사이의 시간 간격을 측정하는 도구로, 일반적으로 초 단위에서 분 단위까지 측정합니다. 육상 경기나 수영 같은 스포츠 경기뿐만 아니라, 산업 현장에서 열의 흐름이나 전류의 흐름을 측정하는 등 다양한 용도로 활용됩니다.

파이썬(Python)은 기본 제공되는 tkinter 라이브러리를 사용하여 손쉽게 GUI 기반의 스톱워치를 만들 수 있습니다. 이 라이브러리는 시작(Start), 정지(Stop), 초기화(Reset) 버튼을 갖춘 스톱워치 화면을 구성하는 데 필요한 다양한 GUI 기능을 제공합니다.

핵심 요소: label.after() 메서드

이 프로그램의 핵심은 tkinter의 after() 메서드입니다. 이 메서드는 지정된 시간(밀리초)이 지난 후에 특정 함수를 반복적으로 호출할 수 있게 해주며, 이를 통해 매초마다 카운트가 증가하는 타이머 동작을 구현합니다.

label.after(parent, ms, function=None)

parent   : 이 함수를 사용하는 위젯(widget) 객체
ms       : 대기 시간 (밀리초 단위)
function : ms 후에 호출될 콜백(callback) 함수

전체 예제 코드

아래 프로그램은 위에서 설명한 after() 메서드를 핵심 요소로 사용하여, 시작·정지·초기화 버튼이 있는 스톱워치 GUI를 구성한 예제입니다.

import tkinter as tink

count = -1
run = False

def var_name(mark):
    def value():
        if run:
            global count
            # 시작 직전 표시
            if count == -1:
                show = "Starting"
            else:
                show = str(count)
            mark['text'] = show
            # 1초(1000ms)마다 카운트 증가
            mark.after(1000, value)
            count += 1
    value()

# 실행 중일 때
def Start(mark):
    global run
    run = True
    var_name(mark)
    start['state'] = 'disabled'
    stop['state'] = 'normal'
    reset['state'] = 'normal'

# 정지 상태일 때
def Stop():
    global run
    start['state'] = 'normal'
    stop['state'] = 'disabled'
    reset['state'] = 'normal'
    run = False

# 초기화할 때
def Reset(label):
    global count
    count = -1
    if run == False:
        reset['state'] = 'disabled'
        mark['text'] = 'Welcome'
    else:
        mark['text'] = 'Start'

base = tink.Tk()
base.title("PYTHON STOPWATCH")
base.minsize(width=300, height=200)
mark = tink.Label(base, text="Welcome", fg="blue", font="Times 25 bold", bg="white")
mark.pack()
start = tink.Button(base, text='Start', width=25, command=lambda: Start(mark))
stop = tink.Button(base, text='Stop', width=25, state='disabled', command=Stop)
reset = tink.Button(base, text='Reset', width=25, state='disabled', command=lambda: Reset(mark))
start.pack()
stop.pack()
reset.pack()
base.mainloop()

코드 작동 방식 살펴보기

  • Start 버튼: run 변수를 True로 설정하고, after() 메서드를 통해 1초마다 카운트를 증가시키며 화면에 표시합니다. 실행 중에는 Start 버튼이 비활성화되고, Stop과 Reset 버튼이 활성화됩니다.
  • Stop 버튼: run 변수를 False로 만들어 카운팅을 멈춥니다. 이후 Start 버튼을 누르면 멈춘 시점부터 이어서 측정할 수 있습니다.
  • Reset 버튼: 카운트를 -1로 되돌려 처음 상태로 초기화하며, 정지 상태라면 "Welcome" 화면으로 돌아갑니다.

아래 이미지들은 스톱워치를 실행했을 때 나타나는 네 가지 상황을 보여줍니다.

스톱워치 시작

파이썬으로 스톱워치 만들기 – tkinter GUI 완전 정복

실행 중인 스톱워치

파이썬으로 스톱워치 만들기 – tkinter GUI 완전 정복

스톱워치 정지

파이썬으로 스톱워치 만들기 – tkinter GUI 완전 정복

스톱워치 초기화

파이썬으로 스톱워치 만들기 – tkinter GUI 완전 정복

마무리 및 확장 아이디어

tkinter의 after() 메서드만 활용하면 별도의 외부 라이브러리 없이도 간단한 스톱워치를 만들 수 있습니다. 여기에 더 나아가 시간을 "00:00:00" 형식의 시:분:초로 포맷하거나, 랩타임(Lap Time) 기록 기능, 폰트와 색상 테마 변경 등을 추가하면 훨씬 완성도 높은 스톱워치 애플리케이션을 만들 수 있습니다.