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