2015-04-15 10 views
9

In Python 3, si esegue il seguente dalla shell interattiva:Qual è la differenza tra le classi Tkinter e Toplevel di tkinter?

>>> import tkinter 
>>> type(tkinter.Tk()) 
<class 'tkinter.Tk'> 
>>> type(tkinter.Toplevel()) 
<class 'tkinter.Toplevel'> 

Entrambi questi creano singole finestre. Suppongo che tkinter.Tk() restituisca la finestra "principale" dell'app tkinter, mentre tutte le finestre aggiuntive dovrebbero essere create con tkinter.Toplevel().

Ho notato che se chiudi la finestra di tkinter.Tk(), entrambe le finestre si chiudono. Inoltre, se si chiama senza una chiamata a tkinter.Tk(), vengono create due finestre (una delle quali è la finestra "principale" che, una volta chiusa, chiuderà anche la finestra di livello superiore).

È accurato? Ci sono altre differenze con le quali dovrei preoccuparmi?

+0

A livello di base: 'Tk' è l'intera app e' Toplevel' è solo una finestra. –

risposta

10

Il tuo riepilogo è corretto. Una delle principali funzionalità architetturali di tkinter è che i widget esistono in una gerarchia con esattamente una finestra radice. Quella finestra principale è ciò che ottieni quando instanziari Tk.

L'istanziazione di Tk fa più che creare una finestra, inizializza l'intero framework di tkinter. In realtà avvia un interprete tcl nascosto che fa il vero lavoro di gestione dei widget. Tkinter è solo un wrapper python attorno a questo interprete.

Se si tenta di creare un altro widget senza creare esplicitamente una finestra radice, verrà creato automaticamente poiché ogni applicazione tkinter deve avere esattamente una finestra radice.

+0

Si può aggiungere che si può effettivamente usare quell'interprete Tcl nascosto tramite il metodo 'tkinter.Tcl()' senza creare finestre, ma quello sarebbe un raro spettacolo in terra Python. (è un modo stupido per aggirare il Python GIL in quanto l'interprete Tcl non ha GIL e potrebbe supportare il threading). – schlenk

Problemi correlati