IT

[파이썬] tkinter 쓰레드 느림 현상 개선 방법

하이썬 2023. 7. 23. 23:49
반응형

파이썬 tkinter에서 쓰레드를 사용할 때 발생하는 느려짐 현상은 대표적으로 GUI 업데이트 문제로 인해 발생합니다. tkinter는 기본적으로 메인 쓰레드에서 GUI를 처리하므로, 메인 쓰레드가 바쁘게 되면 GUI 업데이트가 지연되어 응답이 느려질 수 있습니다.

이러한 문제를 해결하는 가장 일반적인 방법은 tkinter의 after() 메서드를 사용하여 간단한 이벤트 루프를 만드는 것입니다. 이 방법을 사용하면 쓰레드가 아니라 메인 쓰레드에서 GUI 업데이트를 수행할 수 있습니다. 다음은 이를 구현하는 방법입니다:

python
import 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 모듈을 사용하여 쓰레드 간 통신을 구현하는 방법도 있습니다.

반응형