Tkinter 작업 스레드와 Queue: 멈추지 않는 화면 구조

오래 걸리는 작업은 작업 스레드에서 수행하고, Tkinter 위젯 변경은 메인 스레드에서 큐를 읽어 처리합니다.

어떤 상황에서 적용하나요?

아래는 백그라운드 함수가 계산 결과를 Queue에 넣고 메인 스레드가 꺼내는 최소 예제입니다. GUI 없이 통신 구조를 시험합니다. 실제 앱에서는 root.after로 큐 확인 함수를 반복 예약하세요.

검증 범위: 아래 코드는 외부 서비스에 요청하지 않는 로컬 예제입니다. 실제 서비스 연결은 별도로 검증해야 합니다.

최소 예제로 동작 확인하기

from queue import Queue
from threading import Thread

events = Queue()

def worker(numbers):
    try:
        events.put(("done", sum(numbers)))
    except Exception as exc:
        events.put(("error", type(exc).__name__))

thread = Thread(target=worker, args=([1, 2, 3],))
thread.start()
kind, value = events.get(timeout=2)
thread.join(timeout=2)
assert not thread.is_alive()
assert (kind, value) == ("done", 6)
print(kind, value)

결과는 어떻게 확인하나요?

done 6이 출력됩니다. Tkinter 콜백에서 events.get처럼 기다리는 호출을 직접 쓰면 화면이 멈출 수 있으므로 실제 GUI에서는 get_nowait와 Empty 처리를 사용해 즉시 반환해야 합니다.

실제 업무에 적용할 때 확인할 점

실행 중 창 닫기와 취소 신호를 처리하고 네트워크 호출에도 시간 제한을 두세요. 메인 스레드에서 종료를 무한 join으로 기다리지 않습니다. 스레드는 CPU 계산을 항상 빠르게 만드는 도구가 아니며 공유 자료를 수정할 때는 동기화가 필요합니다.

공식 자료와 다음 단계

관련 공식 문서에서 사용하는 버전의 기능과 제한을 확인하세요.

학습 경로: 업무 자동화 가이드 · 입력 오류 처리

작성: 로그 · 2026-10-17 수정: 확인되지 않은 경험담과 성능 보장 표현을 제거하고 예제·적용 조건·공식 근거를 보완했습니다.

댓글

이 블로그의 인기 게시물

API 키 저장 방법: 해싱과 암호화의 차이, Fernet 예제

파이썬 Google Sheets API 연동: 서비스 계정 권한과 읽기·쓰기

Pandas 결측치 처리: isna, fillna, dropna 선택 기준