2015-02-07 8 views
6

은 자신의 루프를 계속하기 전에 파괴하는 매개 변수로 전달 된 창을 기다립니다 이 메소드를 호출 객체 ... Misc 클래스의 문서화 문자열에서"wait_window"메소드는 어떤 기능을합니까?

, 우리가 관찰 할 수있는 것 같습니다 :

언뜻

def wait_window(self, window=None): 
    """Wait until a WIDGET is destroyed. 
    If no parameter is given self is used.""" 
, 그것은 Toplevel 모달을 할 수있는이 방법처럼 보인다, 그러나 이것은 사실이 아니다. Toplevel 모달로 만들려면 grab_set() 메서드를 사용해야합니다.

나는 다른 설명 주위에 볼 수있다 :

wait_window 매개 변수 가 파괴되지 않기 때문에 전달 된 주어진 위젯까지 반환하지 보인다. 다른 곳에서

:

wait_window(widget)은 - 지정된 위젯이 파괴 될 때까지 기다립니다 로컬 이벤트를 작성합니다. 이 루프는 응용 프로그램의 메인 루프에 영향을주지 않습니다. effbot 문서에서

, 우리는이 :

wait_window 로컬 이벤트 루프를 입력 해, 지정된 윈도우가 파괴 될 때까지 (반환하지 않습니다 중 하나를 파괴하는 방법으로 또는 명시 적으로 를 통해) 윈도우 매니저를 통해 :

widget.wait_window(window) 

무엇 정확히 수단 window (자체) window을 기다리는 중입니까?

wait_window에 대한 호출 이후에 오는 코드는 동일한 메서드에 전달 된 창이 소멸되지 않는 한 실행되지 않습니다.

from tkinter import * 

def on_win_request(parent): 
    dialog = Toplevel() 
    parent.wait_window(dialog) 
    # executed only when "dialog" is destroyed 
    print("Mini-event loop finished!") 

r = Tk() 
b = Button(r, text='New Window', command=lambda: on_win_request(r)) 
b.pack() 
b2 = Button(r, text='Hello!', command=lambda: print("hello")) 
b2.pack() 
r.mainloop() 

"Mini-event loop finished!"dialog라는 지역 Toplevel 위젯이 파괴 된 경우에만 인쇄 할 다음 작업의 예에서 , 우리는 단지 말의 증거를 볼 수 있습니다.

그럼 실제 상황에서 정확히이 방법을 사용해야합니까?

+0

나는 대화 창을 지울 때까지 생성자에서 응용 프로그램을 차단하는 것 같습니다. 사용자가 대화와 상호 작용할 때까지 차단하기 만하면되므로 부모를 기다리고 싶지 않을 것입니다. 내가 GUI 프로그래밍을 해본 적이 없어서 GUI 스레드를 다루는 주 스레드가 어떻게되어 있는지 확실하지 않기 때문에 적절한 답변을 제공하지 못했습니다. – Jmac

+0

@Jmac 왜 부모님을 기다리고 싶지 않습니까? 부모님은 제가 이해하는 한 대화를 기다립니다. 근본적으로 일어날 일은 부모가 대기하는 창은 자체 로컬 루프에 들어간다는 것입니다. – nbro

+0

@Jmac'effbot'에 명시되어있는 한,'wait_window'는 로컬 이벤트 루프에 들어가고, 파라미터로서 주어진 윈도우가 파괴 될 때까지 리턴하지 않습니다. 그래서 우리가 부모에서'wait_window'를 호출 할 경우, 우리는 로컬 루프 (대화 상자에서 가정 한 것인가, 아니겠습니까?)에 들어갈 것입니다. 대화 상자가 소멸 될 때까지 부모에게 제어권을 반환하지 않을 것입니다. – nbro

답변

7

문서 상태와 마찬가지로 지정된 창을 삭제할 때까지 대기합니다. 대부분 모달 팝업에 사용되지만, 윈도우 모달을 만들지는 않습니다. 창이 사라질 때까지 현재 코드를 일시 중지합니다. 모달 창을 만들려면 잡기도해야합니다.

가장 일반적으로 사용되는 것은 Toplevel의 인스턴스를 만들고 위젯으로 해당 창을 채운 다음 다른 작업을 수행하기 전에 창을 닫을 때까지 기다리는 것입니다.

예를 들어 기본 GUI를 비활성화 (또는 생성 연기)하고 "서비스 약관"알림을 팝업하고 사용자가 서비스 약관, 저작권, 라이센스 등을 인정할 때까지 기다릴 수 있습니다. 윈도우가 파괴되면 초기화를 끝내거나 위젯을 활성화 할 수 있습니다.

표준 파일 대화 상자가 가장 좋은 예입니다. 대화 상자를 팝업 한 다음 사용자가 파일을 선택하기를 기다리고 코드가 사용하는 것을 기다립니다. 반환 된 파일 이름. 내부적으로 다이얼로그의 구현은 wait_window을 사용하기 때문에 다이얼로그가 사라질 때까지 리턴되지 않는다.

+1

나는 그것을 이해하지만 실제 상황에서는 유용할까요? 몇 가지 예를 보여 주시겠습니까? – nbro

+0

@rinzler : 파일 대화 상자의 한 예입니다 : 파일을 선택하고 파일을로드하도록 사용자에게 요청하십시오. 경고 창은 또 다른 예입니다. 네이티브 대화 상자가없는 플랫폼에서는 대화 상자가 최상위 창으로 구현되고 'wait_window'를 사용하여 사용자가 버튼을 클릭하거나 파일을 선택하거나 글꼴을 선택하기를 기다립니다. –

+0

그러나 일부 예에서는'window. wait_window (window)', 이것은 창 자체가 정확히 기다리는 것을 의미합니까? 'root.wait_window (window)'의 차이점은 무엇입니까? – nbro

관련 문제