- [tkinter]메세지를 수신하여 GUI 변경하기 목차
외부 이벤트나 메시지를 받아서 gui를 변경하는 일이 생겼다
나는 Queue를 사용하여 이 상황을 처리하였다.
맨 처음에 아래와 같이 import를 하였다
import threading <- 쓰레드 수행용
import queue <- 큐 수행용
다음으로 가상으로 Queue를 이용한 메시지를 송신하는 class 선언
class ClockThread(threading.Thread):
def __init__(self, sq1, sq2, rq):
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__(self, rq1):
tk.Tk.__init__(self)
self._frame = None
self.fromSerialQ = rq1
self.after(200, self.checkReceivedQueue) <- 200msec 마다 self.checkReceivedQueue( ) 가 주기적으로 실행됨
def checkReceivedQueue(self):
try:
data = self.fromSerialQ.get()
print('rcv= {}'.format(data)) <- 수신된 메시지를 출력한다
except queue.Empty:
pass
finally:
self.after(200, self.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
즐거운 시간되세요^^
'python & 라즈베리파이' 카테고리의 다른 글
[python]리스트(list) 내용 삭제 및 빈 리스트 검사 (0) | 2020.11.13 |
---|---|
[tkinter]canvas(캔버스)에서 text(텍스트) 지우기/삭제하기 (0) | 2020.11.13 |
[Python]class내 변수 선언의 사소한 실수 (0) | 2020.11.11 |
[tkinter]ttk의 style과 configure 사용 (0) | 2020.11.05 |
[python]argument of type 'int' is not iterable (0) | 2020.11.03 |