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 window che, 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_classIdentifica la classe dell’oggetto.
winfo_childrenRiporta la lista dei figli dell’oggetto.
winfo_parentRiporta il genitore dell’oggetto.
winfo_toplevelRiporta il top level window contenente l’oggetto.
winfo_width
winfo_height
Riporta la larghezza e l’altezza dell’oggetto.
winfo_reqwidth
winfo_reqheight
Riporta la larghezza e l’altezza necessaria per l’oggetto.
winfo_x
winfo_y
Riporta la coordinata x ed y dell’angolo in alto a sinistra dell’oggetto in relazione al genitore.
winfo_rootx
winfo_rooty
Riporta la coordinata x ed y dell’angolo in alto a sinistra dell’oggetto in relazione all’intero schermo.
winfo_vieweableRiporta 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.