을 수행하면 화면 다시 그리기를 처리하는 이벤트 루프이기 때문에 이벤트 루프가 입력 될 때까지 실제로 사라지지 않습니다.
문제를 해결하기위한 몇 가지 선택 사항이 있습니다. 하나는 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을 읽어야합니다. 거기에 읽어야 할 문제가 많아서 문제가 더 어려워 보이지만 처음에는 그렇게 복잡하지는 않습니다.
아마도 시뮬레이션을 수행하기 위해 새 프로세스/포크를 생성 하시겠습니까? 대답은 아니지만 해결책으로 될 수 있습니다 –
또는 스레드를 시작하십시오. 많은 가능성, 각각은 호의와 반대의 것들을 가지고 있습니다. –
'Update'는 많은 C 스택을 소비하는 중첩 된 이벤트 루프로 인해 문제가 생기기 쉽기 때문에 위험하다고합니다. –