IT
[파이썬] tkinter 쓰레드 느림 현상 개선 방법
하이썬
2023. 7. 23. 23:49
반응형
파이썬 tkinter에서 쓰레드를 사용할 때 발생하는 느려짐 현상은 대표적으로 GUI 업데이트 문제로 인해 발생합니다. tkinter는 기본적으로 메인 쓰레드에서 GUI를 처리하므로, 메인 쓰레드가 바쁘게 되면 GUI 업데이트가 지연되어 응답이 느려질 수 있습니다.
이러한 문제를 해결하는 가장 일반적인 방법은 tkinter의 after()
메서드를 사용하여 간단한 이벤트 루프를 만드는 것입니다. 이 방법을 사용하면 쓰레드가 아니라 메인 쓰레드에서 GUI 업데이트를 수행할 수 있습니다. 다음은 이를 구현하는 방법입니다:
pythonimport tkinter as tk
def update_gui():
# 여기에 GUI 업데이트 로직을 작성합니다.
# 쓰레드가 수행되지 않더라도 이 함수는 메인 쓰레드에서 주기적으로 호출됩니다.
# 필요에 따라 GUI 요소들을 업데이트하거나 변경사항을 반영할 수 있습니다.
# 예시: 레이블의 텍스트 업데이트
label.config(text="Updated text")
# 주기적으로 업데이트를 호출하기 위해 after() 메서드를 사용합니다.
root.after(1000, update_gui) # 1000ms (1초) 후에 update_gui 함수를 호출합니다.
def long_running_task():
# 쓰레드에서 실행되는 장시간 작업을 정의합니다.
# 이 함수에서는 오래 걸리는 작업을 수행하고, 결과를 GUI에 반영할 때는 update_gui()를 사용합니다.
pass
# tkinter 윈도우 생성
root = tk.Tk()
# 레이블 추가
label = tk.Label(root, text="Hello, tkinter!")
label.pack()
# GUI 업데이트를 위한 함수 호출
update_gui()
# 쓰레드에서 장시간 작업을 실행하는 경우, Thread 클래스를 사용하여 실행할 수 있습니다.
# 예시: import threading
# task_thread = threading.Thread(target=long_running_task)
# task_thread.start()
# tkinter 이벤트 루프 실행
root.mainloop()
위 예제에서 update_gui()
함수는 매 초마다 호출되며, 이 함수를 통해 GUI 요소들을 업데이트합니다. 만약 별도의 쓰레드에서 오래 걸리는 작업을 실행해야 한다면, 주석 처리된 부분과 같이 Thread
클래스를 사용하여 쓰레드에서 작업을 실행하고, 작업이 끝난 후 update_gui()
를 호출하여 GUI를 업데이트할 수 있습니다.
이렇게 하면 메인 쓰레드와 쓰레드 사이의 작업 분리가 이루어지므로 GUI가 느려지는 문제를 해결할 수 있습니다. 하지만 tkinter는 스레드 안전(thread-safe)하지 않으므로, GUI 업데이트에 사용되는 변수나 위젯 등에 대한 동기화를 직접 처리해야 합니다. 만약 복잡한 상호작용이 필요하다면, threading
모듈 외에 queue
모듈을 사용하여 쓰레드 간 통신을 구현하는 방법도 있습니다.
반응형