Tutto ciò che appare in una applicazione grafica è un widget: ovvero un oggetto grafico che permette all’utente di visualizzare dei dati, oppure di compiere delle azioni o delle scelte, in questo caso l’oggetto grafico viene alle volte denominato “controllo”.
Tra i widgets più utilizzati troviamo:
- button
- checkbox
- entry
- frame
- label
- scrollbar
- text area
- tree view
Ma cosa sono i widgets?
Con riferimento al paradigma della programmazione orientata agli oggetti, possiamo dire che un widget è un oggetto: ovvero una istanza di una specifica classe.
Relazioni di parentela (gerarchia)
La maggior parte dei widgets è contenuta all’interno di un altro widget: per esempio un button può essere contenuto all’interno di un frame e questo a sua volta all’interno di una window. Tra questi widgets si stabilisce quindi una relazione di parentela.
Queste relazioni di parentela definiscono anche la gerarchia tra tutti i widgets della nostra applicazione: ovvero l’ordine di dipendenza: widget precedente/successivo.
Al punto più alto della gerarchia troviamo un singolo oggetto
root windowche, come indica il nome, è la radice di tutti i widgets che seguiranno.
Una gerarchia di widgets può avere una profondità arbitraria: per esempio potremmo avere un button contenuto in una frame che a sua volta è contenuta in un’altra frame e così via.
Inoltre è possibile inserire lungo una catena gerarchica uno speciale widget (denominato top level widget) che darà inizio ad un nuovo sotto-albero di sviluppo.
Come creare un widget
Nel pacchetto Tk ogni widgets ha un proprio nome identificativo (pathname) e nel momento della creazione dobbiamo esplicitamente dichiarare sia la sua posizione gerarchica rispetto agli altri widgets della nostra applicazione che il suo nome.
A tal proposito è bene sottolineare l’importanza di assegnare dei nomi autoesplicativi per i nostri widgets.
Tk si occupa di creare automaticamente il widget che si trova all’inizio della gerarchia (top level widget) e gli assegna come nome identificativo il punto (
.).
Mano a mano che si va in profondità nella gerarchia dei differenti widgets, quando ci si vuole riferire ad uno di essi, ogni step gerarchico viene separato da un punto (.). Per esempio:
ttk::frame .frm
ttk::button .frm.btn1 # btn1 è figlio di frm che a sua volta è figlio del top level widget
Opzioni di configurazione
Tutti i widgets hanno diverse opzioni utili per configurarne sia l’aspetto che il comportamento.
La tipologia di opzioni dipende dalla classe di appartenenza di un widget.
Vi sono opzioni specifiche per determinati widgets, ma vi sono anche delle opzioni comuni a differenti widgets.
Ciascuna nuova istanza di una classe di widget parte con dei valori di default.
Per la maggior parte delle applicazioni non è necessario conoscere tutte le opzioni di una classe di widget, ma è sufficiente conoscerne le principali.
Stili e Temi
Il nuovo pacchetto Tk, a differenza del precedente, permette l’uso dei temi e degli stili che facilitano la gestione delle caratteristiche grafiche dei widgets appartenenti alla stessa classe: un po’ come avviene con i fogli di stile nell’ambito della programmazione Web.
Questo aspetto lo vedremo in dettaglio in uno dei prossimi articoli.
Introspezione
Grazie ai metodi del comando winfo è possibile conoscere tutta una serie di informazioni circa un determinato widget.
Nella tabella seguente riportiamo i principali metodi:
winfo_class | Identifica la classe dell’oggetto. |
winfo_children | Riporta la lista dei figli dell’oggetto. |
winfo_parent | Riporta il genitore dell’oggetto. |
winfo_toplevel | Riporta il top level window contenente l’oggetto. |
winfo_widthwinfo_height | Riporta la larghezza e l’altezza dell’oggetto. |
winfo_reqwidthwinfo_reqheight | Riporta la larghezza e l’altezza necessaria per l’oggetto. |
winfo_xwinfo_y | Riporta la coordinata x ed y dell’angolo in alto a sinistra dell’oggetto in relazione al genitore. |
winfo_rootxwinfo_rooty | Riporta la coordinata x ed y dell’angolo in alto a sinistra dell’oggetto in relazione all’intero schermo. |
winfo_vieweable | Riporta se l’oggetto è visibile o meno. Ovviamente l’oggetto può essere visibile soltanto se sono vivibili tutti gli oggetti antecedenti lungo la sua linea gerarchica. |
Gestione della geometria (geometry management) con il comando grid
La gestione della geometria è quella parte del codice interno al pacchetto Tk che si interessa del posizionamento, delle caratteristiche e delle variazioni dei vari widgets che compongono una determinata applicazione.
Come programmatori abbiamo a disposizione diversi comandi per interagire con la gestione della geometria, ma il comando grid è a nostro parere il più semplice e duttile e quindi non possiamo che sponsorizzarlo.
Il comando grid dispone i vari widgets su una griglia, per questo motivo è necessario indicare per ciascun widget su quale colonna e riga deve essere inserito. Inoltre si può specificare l’allineamento del singolo widget e molte altre caratteristiche.
Il codice interno al pacchetto Tk che si occupa della gestione della geometria ci viene in aiuto, in particolar modo, quando un utente ridimensiona la finestra principale: in questo caso, sulla base delle informazioni che avremo dato per ciascun widget attraverso il comando grid, il gestore della geometria si occuperà in automatico di modificare le dimensioni e il posizionamento dei nostri widgets in modo tale da garantire sia una buona estetica che la fruibilità della nostra applicazione.
Nel prossimo articolo studieremo la gestione degli eventi.
