« Tcl:Appunti di Tcl/TkTk: comando pack »

Tk

"Hello World" e introduzione

# "Hello World" in Tcl/Tk
button .b -text "Hello World" -command exit
pack .b
Hello World in Tcl/Tk

Sostiture button con label per utilizzare una etichetta, anziché un bottone. Omettere l'opzione -command in questo caso perché label non ce l'ha:

# "Hello World" in Tcl/Tk
label .l -text "Hello World"
pack .l

Potete provare questo semplice programma con la shell grafica wish(1). Quando viene invoca la shell wish(1), viene aperta anche la finestra grafica principale, posizionata all'interno dell'xterm(1) da cui si invoca wish(1).

Tk è una libreria di widget (abbreviazione di window object) per sistemi grafici a finestre (window system), come X Window. Tk è multipiattaforma ed è disponibile per Unix, Windows e per il Mac. I widget di Tk sono simili a quelli di motif, ma mentre motif, come pure il toolkit standard Xt, è basato sul linguaggio C, Tk è un toolkit basato su Tcl, precisamente i comandi di Tk sono implementati come estensione del Tcl; tuttavia la estensione Tk è accessibile anche da altri linguaggi di scripting quali Perl e Python. È molto più facile sviluppare prototipi di interfacce grafiche in Tcl con Tk rispetto a scrivere codice C, che è molto più prolisso; inoltre i comandi Tcl/Tk sono accessibili anche dal C.

Tcl permette di programmare sia l'aspetto dei widget che le azioni ad essi associati. Un widget, nella terminologia del sistema grafico X, è un componente dell'interfaccia utente di una applicazione. Esso visualizza alcune informazioni sullo schermo e reagisce alle pressioni dei tasti o alle azioni fatte tramite mouse. Un bottone, una etichetta, una caselle di testo, una barra di scorrimento, una lista di selezione, un menu oppure una intera e complicata finestra di dialogo come quella per la scelta del file da caricare, sono tutti esempi di widget. Infatti widget più complessi possono essere composti utilizzando widget più semplici. Ogni widget ha alcuni attributi di configurazione riguardanti la sua rappresentazione a schermo, quali la dimensione e la posizione, i colori, il testo contenuto, e altri attributi come l'azione associata (un comando Tcl) che verrà invocata quando il widget è attivato (ad es. per un pulsante quando viene premuto). Tcl/Tk permette leggere o modificare i parametri dei widget a runtime.

Tk può essere facilmente estesa creando nuovi widget scritti o in C, oppure interamente in Tcl, utilizzando nella creazione di nuovi widget alcune funzioni di supporto messe a disposizione da Tk, ma i widget più comuni sono già inclusi e molto semplici da utilizzare.

Tk mette a disposizione anche dei comandi Tcl per gestire gli eventi del sistema grafico X, come la pressione dei tasti della tastiera o del mouse o il movimento del mouse stesso: ogni evento può essere associato ad un comando Tcl qualsiasi, tipicamente una procedura che lo gestisce in un modo qualsiasi.

Le limitazioni di Tk sono principalmente due: poiché Tk è una estensione di un linguaggio interpretativo, le applicazioni scritte con Tk sono più lente delle applicazioni X compilate. Tuttavia la differenza è trascurabile nella maggior parte dei casi: ne soffrono solo le applicazioni che hanno bisogno di fare grafica intensiva, per cui chiaramente Tk non è adatto. Il campo di applicazione di Tk rimane comunque molto ampio.

In Tk ogni widget ha un nome unico mediante il quale è possibile distinguerlo tra tutti i widget che sono allo stesso livello (vale a dire tra tutti i widget figli dello stesso widget genitore). Ogni widget ha una classe, come Button o Label, che indica il tipo di widget. Ogni widget ha inoltre un percorso (pathName) che lo identifica univocamente tra tutti i widget di una applicazione, proprio come un file di un file system. Il percorso consiste di zero o più nomi di widget separati dal carattere . (che è l'analogo dello / usato come separatore nei percorsi dei file in Unix).

Ad esempio il percorso .b indica un widget di nome b che si trova all'interno del widget principale (la finestra principale dell'applicazione, individuata dal percorso .). I widget che create sono organizzati quindi in una gerarchia proprio come i file e le directory che create nel file system.

Esistono comandi Tcl per istanziare e manipolare ciascun tipo di widget. Il nome del comando coincide con il nome del tipo di widget; ad esempio il comando button(n) crea un widget di tipo button (vale a dire di classe Button). Il primo argomento di un comando che crea il widget corrispondente è sempre pathName e indica il percorso del nuovo widget da creare. Ulteriori argomenti sono opzionali e vengono utilizzati per settare le opzioni dei widget o, nel caso di widget attivi, ossia che svolgono qualche azione quando vengono manipolati con il mouse o la tastiera, per impostare i comandi Tcl che effettuano l'azione. Le opzioni che non vengono specificate assumono il valore che hanno nel database delle opzioni o in mancanza di questo assumono un valore di default che dipende dal tipo di widget.

Ad esempio:

button .b -text "Hello World" -command {puts "Hello World"}

Qui il comando button(n) crea un widget di tipo Button di nome b (potreste scegliere un qualsiasi altro nome) e con percorso .b. Sono specificate due opzioni: la stringa da visualizzare nel widget e il comando Tcl da eseguire quando il widget viene invocato, ossia nel caso di un pulsante quando viene premuto il tasto del mouse mentre il puntatore si trova su di esso. Anche il comando Tcl può essere qualsiasi.

Ogni volta che viene creato un nuovo widget, viene creato anche un nuovo comando Tcl avente per nome proprio il percorso del widget. Questo comando (detto anche comando widget) permette di manipolare quello specifico widget, ad esempio per leggere o cambiarne le opzioni memorizzate nel database, come descritto nella sezione WIDGET COMMAND della manpage di ciascun widget. Se il widget è visualizzato, le modifiche alla sua configurazione si riflettono subito.

Ad esempio, dopo aver creato il widget precedente:

% .b cget -bg ;# qual'è il colore di sfondo del tasto?
#d9d9d9
% .b configure -bg SkyBlue -activebackground LightSkyBlue ;# I like blue sky :)

Il sottocomando configure è supportato da tutti i comandi sui widget e permette di variare a runtime le opzioni di configurazione di ciascun widget utilizzando gli stessi argomenti che possono essere specificati quando si crea il widget.

Nei comandi Tk i nomi delle opzioni possono essere abbreviati se non v'è rischio di ambiguità. Ad esempio -command può essere abbreviata fino a ridursi a -comm. La scelta se abbreviare o non dipende dai gusti del programmatore.

Nella directory /usr/local/lib/tk8.4/demos in FreeBSD o comunque insieme alla vostra distribuzione di Tk potete trovare molti demo che illustrano le capacità di Tk. Questo testo vuole essere solo una introduzione. Per rendere il discorso più interessante ed applicare subito i vari concetti, vi guiderò nella scrittura di un'applicazione grafica completa. Ho scelto di creare un semplice editor di testi, un clone di Notepad che chiameremo tpad (la t ovviamente ricorda che è stato scritto in Tcl). I vari elementi necessari per realizzare tpad saranno introdotti gradualmente nei paragrafi seguenti, cercando però di non perdere in generalità.

« Tcl:Appunti di Tcl/TkTk: comando pack »