[tkinter]메세지를 수신하여 GUI 변경하기

2020년 11월 12일 by 진아사랑해

    [tkinter]메세지를 수신하여 GUI 변경하기 목차
반응형

외부 이벤트나 메시지를 받아서 gui를 변경하는 일이 생겼다

나는 Queue를 사용하여 이 상황을 처리하였다.

 

맨 처음에 아래와 같이 import를 하였다

import threading  <- 쓰레드 수행용

import queue  <- 큐 수행용

 

다음으로 가상으로 Queue를 이용한 메시지를 송신하는 class 선언

class ClockThread(threading.Thread):

    def __init__(selfsq1sq2rq):

        threading.Thread.__init__(self)        

        self.toGuiQ = sq1

        self.toSerialQ = sq2

        self.fromSerialQ = rq

 

    def run(self):

        while(1):

            self.now = time.strftime("%H:%M:%S")

            self.toGuiQ.put(self.now)

            time.sleep(5)   <- 5초 마다 반복하여 while문을 수행

            #print(self.now)  <- 이 구문이 잘 수행되는지 확인용 프린트

 

다음으로 tkinter내에서 수신하는 부분 선언(after 문을 사용하여 일정한 시간 후에 재실행되게 함)

class StartApp(tk.Tk):

    def __init__(selfrq1):

        tk.Tk.__init__(self)

        self._frame = None

        self.fromSerialQ = rq1

        self.after(200self.checkReceivedQueue)  <- 200msec 마다 self.checkReceivedQueue( ) 가 주기적으로 실행됨

 

    def checkReceivedQueue(self):

        try:

            data = self.fromSerialQ.get()    

            print('rcv= {}'.format(data))   <- 수신된 메시지를 출력한다

        except queue.Empty:

            pass

        finally:    

            self.after(200self.checkReceivedQueue)  <- 200msec 후에 다시 checkReceivedQueue( )를 수행한다

 

다음으로

if __name__ == "__main__":

    from_clock_queue = queue.Queue(5)  <- 용도에 따라 사용할 Queue를 선언한다

    to_serial_queue = queue.Queue(5

    to_gui_queue = queue.Queue(5)  

 

    clock= ClockThread(to_gui_queue, to_serial_queue, from_clock_queue)  

    clock.start()  <- clock 쓰레드를 실행한다

    root= StartApp(to_gui_queue)  <- Gui를 위한 앱을 실행한다

    root.mainloop()  <- tkinter의 이벤트 루프를 실행한다

 

이 방식으로 다른 쓰레드에서 보낸 메시지를 tkinter에서 수신할 수 있다

즉, after문을 사용하여 tkinter내에 별도의 쓰레드처럼 동작하게 하는 것이다

 

참고: riptutorial.com/ko/python/example/4691/%EC%8A%A4%EB%A0%88%EB%93%9C-%EA%B0%84-%ED%86%B5%EC%8B%A0

 

즐거운 시간되세요^^

 

 

 

반응형