2011-04-20 2 views
0

나는 Tcl/Tk에서 간단한 창을 띄워서 OK 버튼을 누르면 시뮬레이션이 실행됩니다. 나는 리눅스를 사용하고있다. 시뮬레이션이 끝나면 창은 사라집니다. 문제는 시뮬레이션이 실행되는 동안 윈도우가 켜져 있다는 것입니다. OK 버튼을 누른 후에 창을 사라지게하고 싶습니다.Tcl/Tk - OK를 눌렀을 때 창을 없애는 법 OK가 시뮬레이션을 실행하면

wm withdraw .mywindow을 사용해 보았지만 윈도우가 표시된 영역 (OK 버튼 포함)을 흰색으로 만듭니다.

Google 검색 중 update이 발견되었지만 harmful이라고합니다.

+0

아마도 시뮬레이션을 수행하기 위해 새 프로세스/포크를 생성 하시겠습니까? 대답은 아니지만 해결책으로 될 수 있습니다 –

+0

또는 스레드를 시작하십시오. 많은 가능성, 각각은 호의와 반대의 것들을 가지고 있습니다. –

+0

'Update'는 많은 C 스택을 소비하는 중첩 된 이벤트 루프로 인해 문제가 생기기 쉽기 때문에 위험하다고합니다. –

답변

3

을 수행하면 화면 다시 그리기를 처리하는 이벤트 루프이기 때문에 이벤트 루프가 입력 될 때까지 실제로 사라지지 않습니다.

문제를 해결하기위한 몇 가지 선택 사항이 있습니다. 하나는 update idletasks입니다. 이는 화면 그리기와 같은 "유휴"작업 만 처리하고 버튼 및 기타 사용자 생성 이벤트에 응답하는 작업은 처리하지 않는 update의 변형입니다. 그래서, 솔루션 하나하는 것입니다 :

그런데
wm withdraw .mywindow 
update idletasks 
run_simulation 

, 이유 update는 본질적으로 새로운 이벤트 루프 시작하기 때문에 유해한이다 - 또 다른 무한 루프. 해당 이벤트가 진행되는 동안 동일한 코드가 다시 실행되는 이벤트가 발생하면 세 번째 및 네 번째 등을 시작합니다. 일반적으로 중첩 된 무한 루프는 절대로 좋지 않습니다. 기억하십시오 : tcl은 단일 스레드이므로 이벤트 루프는 병렬로 실행되지 않습니다.

다른 해결책은 이벤트 루프를 자연스럽게 입력하고 다른 모든 이벤트가 처리되면 시뮬레이션을 실행하도록 예약하는 것입니다. 이 작업을 수행하려면 after 명령을 사용하여 시뮬레이션을 시작하십시오. after을 사용하면 이벤트 대기열에 이벤트가 배치됩니다. 이벤트 루프가 해당 이벤트에 도달하면 시뮬레이션이 시작됩니다. 이 같은 버튼 또는 키를 누르는 것과 같은 이벤트의 결과로서 호출 된 가정하면 - - 이벤트 루프를 모든 재 입력한다

상기 코드 이탈은
wm withdraw .mywindow 
after idle run_simulation 

는 예를 들어

보류중인 이벤트가 처리되고 run_simulation 명령이 실행됩니다.

그런데 - 시뮬레이션이 실행되는 동안 반응이 필요한 GUI가 있다면, tcler의 위키에서 Keep a GUI alive during a long calculation을 읽어야합니다. 거기에 읽어야 할 문제가 많아서 문제가 더 어려워 보이지만 처음에는 그렇게 복잡하지는 않습니다.

+1

+1 핵심 근거와 자세한 정보를 얻을 수있는 위치를 가리키는 매우 좋은 대답입니다. –

관련 문제