스레드를 사용하여 메인 이벤트 루프 고정 해제
집약적인 작업이 실행되는 동안 진행률 표시줄과 같은 GUI 요소가 "정지"되는 경우가 많습니다. 메인 스레드에서. 이는 사용자 상호 작용 및 GUI 업데이트를 처리하는 기본 이벤트 루프가 차단되었기 때문에 발생합니다. 이를 방지하기 위해 멀티스레딩을 사용하여 별도의 스레드에서 장기 실행 작업을 실행할 수 있습니다.
주어진 특정 시나리오에서는 버튼을 클릭하면 5초 동안 진행률 표시줄 애니메이션이 시작되어야 합니다. 그러나 관찰된 동작은 이 기간 동안 버튼이 정지된다는 것입니다. 이 문제는 스레드를 사용하여 해결할 수 있지만 기본 스레드에 스레드를 결합하면 스레드가 완료될 때까지 기다리게 되어 GUI를 효과적으로 차단합니다.
대체 접근 방식: 로직을 클래스로 분리
단일 GUI 클래스 내에서 모든 것을 처리하는 대신 논리 부분을 다른 클래스에 배치하고 해당 클래스에서 GUI를 인스턴스화하는 것이 가능합니다. 그러나 이를 위해서는 GUI 클래스에서 논리 클래스 메서드를 호출하는 방법이 필요합니다.
스레딩을 사용한 솔루션
이 문제를 해결하려면 대기열 객체를 사용하여 GUI 클래스와 로직 클래스를 고려할 수 있습니다. 다음 단계에서는 이 접근 방식을 간략하게 설명합니다.
코드 구현
아래는 구현 예입니다. 스레드 작업을 사용하여 진행률 표시줄 애니메이션 처리:
import queue class GUI: # Code for GUI setup goes here def tb_click(self): self.progress() self.prog_bar.start() self.queue = queue.Queue() ThreadedTask(self.queue).start() self.master.after(100, self.process_queue) def process_queue(self): try: msg = self.queue.get_nowait() # Show result of the task if needed self.prog_bar.stop() except queue.Empty: self.master.after(100, self.process_queue) class ThreadedTask(threading.Thread): def __init__(self, queue): super().__init__() self.queue = queue def run(self): time.sleep(5) # Simulate long running process self.queue.put("Task finished")
이 접근 방식은 장기 실행 작업이 별도의 스레드에서 실행되는 동안 메인 스레드의 실행 및 응답을 효과적으로 유지합니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3