Sembra che l'oggetto che chiama questo metodo attende la finestra passato come parametro per essere distrutto prima di continuare con il suo ciclo ...Cosa fa il metodo "wait_window"?
dalle corde doc della classe Misc
, possiamo osservare:
def wait_window(self, window=None): """Wait until a WIDGET is destroyed. If no parameter is given self is used."""
a prima vista, sembra che questo metodo può fare una scelta obbligatoria Toplevel
, ma questo non è vero. Per creare un modal Toplevel
, dobbiamo usare il metodo grab_set()
.
Ho vedere intorno altre spiegazioni:
wait_window
sembra non tornare fino a quando il widget di dato passato come parametro non viene distrutta.
da un altro luogo:
wait_window(widget)
- Crea un evento locale che attende la data widget di da distruggere. Questo ciclo non influisce sul mainloop dell'applicazione.
Dalla documentazione effbot, abbiamo:
Il
wait_window
entra in un ciclo di eventi locali, e non restituisce finché non viene distrutta la finestra data (sia tramite il metodo distruggere o esplicitamente tramite il window manager):widget.wait_window(window)
Che cosa significa esattamente per un window
attendere window
(stesso)?
Sembra che il codice che viene dopo la chiamata a wait_window
non venga eseguito finché la finestra passata allo stesso metodo non viene distrutta. Nel seguente esempio di lavoro, possiamo vedere una prova su quanto appena detto:
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!"
saranno stampati solo quando il widget locale Toplevel
chiamato dialog
viene distrutto.
Quindi, esattamente in quali circostanze reali dovrei utilizzare questo metodo?
Mi sembra di bloccare l'applicazione nel costruttore finché la finestra di dialogo non viene distrutta. Non vorrai aspettare il genitore, poiché vuoi bloccare solo fino a quando l'utente non interagisce con il dialogo. Non ho dato una risposta adeguata in quanto non ho fatto la programmazione GUI nei secoli e non sono sicuro di come il thread principale riguarda gli eventi della GUI. – Jmac
@ Jmac Perché non dovrei aspettare il genitore? Il genitore aspetta il dialogo, per quanto ho capito. Fondamentalmente ciò che succederebbe è che la finestra per cui il genitore attende, entri nel proprio loop locale. – nbro
@Jmac Per quanto dichiarato su 'effbot',' wait_window' entra in un ciclo di eventi locale, e non ritorna fino a quando la finestra data come parametro non viene distrutta. Quindi, nel caso in cui chiamiamo 'wait_window' sul genitore, entreremmo su un loop locale (suppongo nella finestra di dialogo, o forse no?) E non restituiremmo il controllo al genitore finché la finestra di dialogo non verrà distrutta. – nbro