2011-01-27 8 views
2

저는 파이썬 3/tkinter를 사용하고 있습니다.프로그램의 메인 루프를 GUI 밖으로 옮길 수 있습니까?

코드 샘플을 살펴보면 주 루프가 일반적으로 코드의 GUI 부분에 있음을 알았고 나머지 코드는 필요할 때 GUI 호출을위한 콜백을 제공합니다.

그러나 내 시뮬레이션은 사용자 상호 작용과 독립적으로 실행됩니다. UI는 때때로 시뮬레이션에서 어떤 일이 일어나고 있는지에 대한 시각을 제공하기 위해 존재하지만, 시뮬레이션에서 어떤 일이 일어나는지는 제어하지 않습니다. 그래서 메인 루프가 UI가 아닌 시뮬레이션과 관련되기를 바랍니다. 내가 어떻게 그럴 수 있니?

+0

python/tkinter에 대해 모르겠습니까? 예 : Qt는 비 UI 스레드에서 다중 이벤트 루프 및 이벤트 루프를 허용합니다. –

+1

mainloop-type 구문을 필요로하지 않는 GUI 툴킷이 있으며 물건을 표시하기 위해 메소드를 호출 할 수있는 객체를 단순히 표시하는 GUI 툴킷이 있습니까? (나는 이상하게 여길 것이고, 나는 단지 궁금하다.) – max

답변

2

로직과 프리젠 테이션을 분리하지 않는 이유는 무엇입니까? 단일 텍스트 기반의 protcol에 응답하여 cmds를 수신하고 결과를 다시 보내려면 sim 백엔드를 작성한 다음 예를 들어 GUI 프로그램을 통해 결과를 보내십시오. 유닉스 소켓.

1

GUI 이벤트를 검사하고 처리하는 기능을 호출하는 사용자 고유의 메인 루프를 작성하십시오.

+0

내가 그렇게하면 내가 알아야 할 것이 있는가? 나는 tk/tkinter를 배우는 중이다. 그러나 GUI는 비교적 간단하다. – max

+0

GUI 메시지를 처리하지 않는 매초마다 GUI가 응답하지 않는 또 다른 순간입니다. –

+0

tkinter는이 특별한 목적을위한 합리적인 도구입니까? 또한 GUI 기능이 대개 자체 스레드로 분리되지 않는 이유가 있습니까? – max

1

이 경우에는 별도의 스레드에서 처리를 수행 한 다음 GUI 스레드가 해당 스레드로 메시지를 보내고 받아야합니다.

그러나 처리 스레드에서 GUI를 직접 업데이트하지 마십시오. 대신 effbot's example과 유사한 메시지 대기열을 사용하여 GUI에 메시지를 보낼 수 있습니다. 중요한 것은 queue.get_nowait()입니다. 대기열에 아무것도없는 경우 다른 스레드를 차단하지 않고 GUI에서 주기적으로 실행할 수 있습니다.

+0

별도의 스레드 또는 별도의 프로세스를 파악할 수 없습니다. –

+0

별도의 스레드를 참조하고 있습니다. 그러나 GUI와 처리 스레드간에 대기열 만 공유해야합니다. –

관련 문제