Tkinter는 GUI 기반 데스크톱 애플리케이션을 제작하기 위한 파이썬 표준 라이브러리입니다. 다양한 함수, 모듈, 메서드를 제공하므로 별도의 설치 없이도 애플리케이션의 핵심 기능을 손쉽게 구현할 수 있습니다.
이번 글에서는 Tkinter와 time 모듈 같은 파이썬 표준 라이브러리만을 사용해 카운트다운 타이머를 만들어 보겠습니다. 이 애플리케이션의 기본 기능은 지정한 시간 동안 타이머를 실행하는 것이며, 다음과 같은 구성 요소로 이루어집니다.
- 시(HH), 분(MM), 초(SS)를 각각 설정할 수 있는 Entry 위젯
- countdowntimer() 함수를 실행하는 버튼(Button)
- 입력된 문자열을 시·분·초에 맞게 정수 값으로 변환하는 countdowntimer() 함수
- update() 메서드를 통해 함수와 위젯의 상태에 따라 창을 실시간으로 갱신하는 로직
전체 코드 예제
# 필요한 라이브러리 임포트
from tkinter import *
import time
# tkinter 프레임 인스턴스 생성
win = Tk()
# 창 크기 설정
win.geometry('700x350')
# 창 크기를 고정
win.resizable(False, False)
# 배경색 설정
win.config(bg='skyblue4')
# 시(HH), 분(MM), 초(SS)를 입력받는 Entry 위젯 생성
sec = StringVar()
Entry(win, textvariable=sec, width=2,
font='Helvetica 14').place(x=380, y=120)
sec.set('00')
mins = StringVar()
Entry(win, textvariable=mins, width=2, font='Helvetica 14').place(x=346, y=120)
mins.set('00')
hrs = StringVar()
Entry(win, textvariable=hrs, width=2, font='Helvetica 14').place(x=310, y=120)
hrs.set('00')
# 타이머 함수 정의
def countdowntimer():
times = int(hrs.get()) * 3600 + int(mins.get()) * 60 + int(sec.get())
while times > -1:
minute, second = (times // 60, times % 60)
hour = 0
if minute > 60:
hour, minute = (minute // 60, minute % 60)
sec.set(second)
mins.set(minute)
hrs.set(hour)
# 화면의 시간 업데이트
win.update()
time.sleep(1)
if (times == 0):
sec.set('00')
mins.set('00')
hrs.set('00')
times -= 1
# Label 위젯 생성
Label(win, font=('Helvetica bold', 22), text='Set the Timer', bg='skyblue4', fg="white").place(x=260, y=70)
# 타이머를 시작하는 버튼 위젯
Button(win, text='START', bd='2', bg='IndianRed1', font=('Helvetica bold', 10), command=countdowntimer).place(x=335, y=180)
win.mainloop()실행 결과
프로그램을 실행하면 창에 카운트다운 타이머가 나타납니다.

Entry 입력란의 값을 변경해 원하는 시간을 설정한 뒤 [START] 버튼을 클릭하면, 지정한 시간부터 초 단위로 카운트다운이 즉시 시작됩니다.

동작 원리 살펴보기
타이머의 핵심 로직은 countdowntimer() 함수에 있습니다. 먼저 Entry 위젯에서 읽어온 시·분·초 값을 각각 3600초, 60초, 1초 단위로 환산해 총 남은 시간(초)을 계산합니다. 이후 while 반복문 안에서 몫(//)과 나머지(%) 연산을 사용해 전체 초를 시·분·초 형태로 다시 변환하고, StringVar 객체의 set() 메서드로 화면에 표시합니다.
win.update()는 GUI 이벤트를 즉시 새로고침하여 변경된 숫자가 화면에 반영되도록 하며, time.sleep(1)은 1초씩 대기해 실제 시계처럼 작동하게 만듭니다. 남은 시간이 0이 되면 세 Entry 값이 모두 '00'으로 초기화되면서 타이머가 종료됩니다.
참고: 더 부드러운 타이머 구현
time.sleep()은 메인 스레드를 일시적으로 멈추기 때문에 타이머가 실행되는 동안 창의 버튼 클릭 등 다른 이벤트 처리가 지연될 수 있습니다. 이를 개선하려면 Tkinter의 after() 메서드를 사용해 1초마다 함수를 재귀적으로 호출하는 방식으로 구현하면, UI가 멈추지 않으면서도 자연스럽게 동작하는 타이머를 만들 수 있습니다.