2015-02-07 19 views
6

Wydaje się, że przedmiot, który wywołuje tę metodę czeka na oknie przekazanego jako parametr zostać zniszczone przed kontynuowaniem z własnej pętli ...Co robi metoda "wait_window"?

Od strun DOC klasy Misc możemy zaobserwować:

def wait_window(self, window=None): 
    """Wait until a WIDGET is destroyed. 
    If no parameter is given self is used.""" 

na pierwszy rzut oka wydaje się, że tą metodą można wykonać Toplevel modal, ale nie jest to prawdą. Aby utworzyć modalny model Toplevel, musimy użyć metody grab_set().

jakie widzimy wokół innych wyjaśnień:

wait_window zdaje się nie wraca, dopóki przekazany jako parametr nie ulega zniszczeniu danego widgetu.

z innego miejsca:

wait_window(widget) - Tworzy lokalną imprezę, która czeka na dany widget zostać zniszczone. Ta pętla nie wpływa na główny dysk aplikacji aplikacji.

Z dokumentacji effbot, mamy:

wait_window wchodzi do lokalnej pętli zdarzeń, a nie wraca, dopóki dana okno jest zniszczona (albo metodą zniszczenia lub sposób jawny przez menedżera okien):

widget.wait_window(window) 

Co dokładnie oznacza dla window czekać na window (się)?

Wydaje się, że kod, który przychodzi po wywołaniu wait_window, nie jest wykonywany, dopóki okno przekazane do tej samej metody nie zostanie zniszczone. W poniższym przykładzie roboczym, możemy zobaczyć dowód na to, co właśnie powiedział:

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!" zostanie wydrukowany tylko wtedy, gdy lokalny Toplevel widget nazywa dialog jest zniszczona.

Więc, w jakich dokładnie okolicznościach powinienem używać tej metody?

+0

Wydaje się, że blokuję aplikację w konstruktorze, dopóki okno dialogowe nie zostanie zniszczone. Nie chcesz czekać na rodzica, ponieważ chcesz blokować tylko do czasu, gdy użytkownik wejdzie w interakcję z dialogiem. Nie podałem właściwej odpowiedzi, ponieważ nie robiłem programowania GUI od wieków i nie jestem pewien jak główny wątek zajmuje się zdarzeniami GUI. – Jmac

+0

@Jmac Dlaczego nie chciałbym czekać na rodzica? Rodzic czeka na dialog, o ile zrozumiałem. Zasadniczo, to, co się stanie, to okno, na które rodzic czeka, wchodzi we własną pętlę lokalną. – nbro

+0

@Jmac Jeśli chodzi o 'effbot',' wait_window' wchodzi w lokalną pętlę zdarzeń i nie powraca, dopóki dane okno nie zostanie zniszczone. Tak więc w przypadku, gdy nazywamy 'wait_window' na rodzica, wchodzimy w pętlę lokalną (przypuszczam, że w oknie dialogowym, a może nie?) I nie zwrócimy kontroli do rodzica, dopóki okno dialogowe nie zostanie zniszczone. – nbro

Odpowiedz

7

Podobnie jak w dokumentacji stwierdza, czeka aż do zniszczenia danego okna. Jest używany głównie do modalnych wyskakujących okienek, ale sam nie tworzy modalnego okna. Po prostu zatrzymuje bieżący kod, dopóki okno nie zostanie zniszczone. Aby utworzyć okno modalne, musisz również wykonać chwyt.

Najpopularniejszym zastosowaniem jest utworzenie wystąpienia Toplevel, wypełnienie tego okna widżetami, a następnie oczekiwanie na zamknięcie okna przed wykonaniem innej czynności.

Na przykład można wyłączyć (lub odroczyć tworzenie) głównego interfejsu GUI, wyświetlić powiadomienie o warunkach korzystania z usługi i poczekać, aż użytkownik potwierdzi warunki korzystania z usługi, prawa autorskie, licencję itp. okno jest niszczone, możesz następnie zakończyć inicjalizację lub włączyć niektóre widżety itp.

Standardowe okno dialogowe pliku jest doskonałym przykładem: pojawia się okno dialogowe, następnie kod czeka na użytkownika, aby wybrać plik, a następnie używa nazwa pliku, który został zwrócony. Wewnętrznie implementacja okna dialogowego używa wait_window, więc nie powraca, dopóki okno dialogowe nie zostanie odrzucone.

+1

Zrozumiałem to, ale w jakich prawdziwych okolicznościach powinno być użyteczne? Czy mógłbyś pokazać mi kilka przykładów? – nbro

+0

@rinzler: okno dialogowe pliku jest przykładem: poproś użytkownika o wybranie pliku, a następnie załaduj plik. Alarmowe okna są kolejnym przykładem. Na platformach, w których brakuje rodzimych okien dialogowych, okna dialogowe są zaimplementowane jako okna główne i używają 'wait_window' do czekania, aż użytkownik kliknie przycisk, wybierze plik, wybierze czcionkę itp. –

+0

Ale w niektórych przykładach mamy' okno. wait_window (window) ', co dokładnie oznacza to, że okno czeka na siebie? Jaka jest różnica względem 'root.wait_window (window)'? – nbro