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?
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
@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
@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