Tkinter와 스레딩(Threading) 개요
Tkinter 애플리케이션에서 스레딩(Threading)을 활용하면 여러 함수를 동시에 호출할 수 있으며, 특정 작업들을 비동기적으로 실행할 수 있습니다. 이를 통해 GUI가 멈추지 않고 부드럽게 반응하는 애플리케이션을 만들 수 있습니다.
파이썬에서 스레드를 사용하려면 먼저 threading 모듈을 임포트하고, 내장된 Thread 클래스를 서브클래싱(subclassing)합니다. 그런 다음 새로 정의한 클래스 내부에서 run() 메서드를 오버라이드하여 실제 실행하고자 하는 로직을 작성하면 됩니다.
즉, 스레딩을 활용하면 한 번에 여러 작업을 병렬로 처리할 수 있습니다. Tkinter 애플리케이션에서 스레딩을 구현하려면 Thread() 생성자를 사용하면 되며, target 매개변수에 실행할 함수를 지정하는 방식이 가장 간단합니다.
이번 글에서는 일정 시간 동안 대기(sleep)한 후 레이블의 텍스트를 변경하는 스레드를 만들어 보겠습니다. 이 예제에서는 time 모듈과 threading 모듈을 함께 임포트하여 사용합니다.
예제 코드
# 필요한 라이브러리 임포트
from tkinter import *
import time
import threading
# Tkinter 인스턴스 생성
win = Tk()
# 윈도우 크기 설정
win.geometry("700x400")
# 스레드로 실행할 함수 정의
def thread_fun():
label.config(text="버튼을 클릭하거나 잠시 기다려 주세요")
time.sleep(5)
label.config(text="5초가 지났습니다!")
label = Label(win)
label.pack(pady=20)
# 버튼 생성
b1 = Button(win, text="시작", command=lambda: threading.Thread(target=thread_fun).start())
b1.pack(pady=20)
win.mainloop()코드 설명
thread_fun() 함수는 스레드 내에서 실행되며, 먼저 레이블에 안내 문구를 표시하고 time.sleep(5)로 5초간 대기한 뒤, 완료 메시지로 텍스트를 업데이트합니다. 버튼의 command 옵션에는 람다(lambda) 함수를 사용하여 버튼이 클릭될 때마다 새로운 스레드가 시작되도록 했습니다.
command=threading.Thread(target=thread_fun).start()처럼 괄호와 함께 직접 호출하면 프로그램 실행 시점에 즉시 스레드가 시작되어 버튼 클릭과 무관하게 동작합니다. 버튼 클릭 시점에 스레드를 시작하려면 위 코드처럼 lambda로 감싸 콜백 형태로 전달해야 합니다.실행 결과
위 코드를 실행하면 화면에 버튼이 생성되고, 버튼을 클릭하면 레이블(label)의 텍스트를 변경하는 스레드가 백그라운드에서 동작합니다.

5초가 지나면 스레드는 자동으로 종료되며, 레이블에는 완료 메시지가 표시됩니다.

마무리
이처럼 Tkinter에서 스레딩을 활용하면 시간이 오래 걸리는 작업(네트워크 요청, 파일 처리 등)을 메인 GUI 스레드와 분리하여 실행할 수 있습니다. 덕분에 애플리케이션이 응답 없음 상태에 빠지는 것을 방지하고 더 나은 사용자 경험을 제공할 수 있습니다.