2015-02-07 8 views
6

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?

+0

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

+0

@ 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

+0

@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

risposta

7

Come la documentazione indica, attende che la finestra indicata venga distrutta. Viene usato principalmente per i popup modali, anche se non crea una finestra modale. Mette semplicemente in pausa il codice corrente fino a quando la finestra non viene distrutta. Per creare una finestra modale, devi anche fare un tentativo.

L'uso più comune è creare un'istanza di Toplevel, compilare quella finestra con i widget, quindi attendere che la finestra venga chiusa prima di eseguire qualche altra azione.

Ad esempio, è possibile disabilitare (o posticipare la creazione della) GUI principale, far apparire una nota di "termini di servizio" e attendere che l'utente riconosca i termini di servizio, copyright, licenza, ecc. la finestra viene distrutta, quindi è possibile terminare l'inizializzazione o abilitare alcuni widget, ecc.

La finestra di dialogo file standard è un esempio perfetto: si apre la finestra di dialogo, quindi il codice attende che l'utente scelga un file, quindi utilizzi il nome del file che è stato restituito. Internamente, l'implementazione della finestra di dialogo utilizza wait_window in modo che non ritorni finché non viene chiusa la finestra di dialogo.

+1

L'ho capito, ma in quali circostanze reali dovrebbe essere utile? Potresti mostrarmi qualche esempio? – nbro

+0

@rinzler: la finestra di dialogo del file è un esempio: chiedere all'utente di scegliere un file, quindi caricare il file. Le finestre di avviso sono un altro esempio. Su piattaforme prive di finestre di dialogo native, le finestre di dialogo sono implementate come finestre di primo livello e utilizzano 'wait_window' per attendere che l'utente faccia clic su un pulsante, seleziona un file, scegli un font, ecc. –

+0

Ma in alcuni esempi, abbiamo' window. wait_window (window) ', cosa significa esattamente per una finestra aspettare se stessa? Qual è la differenza rispetto a 'root.wait_window (window)'? – nbro