Quando pensiamo ad uno script di shell, la nostra immaginazione ci porta subito ad uno schermo nero, qualche parola in bianco o in verde, ed un cursore lampeggiante: nessuna finestra, nessun pulsante, ma solo testo.
Zenity è un programma open source rivolto a tutti coloro che utilizzano GNOME come desktop environment, che ha lo scopo di creare, utilizzando semplici comandi di shell, finestre di dialogo, liste, notifiche e altro. Certo, non possiamo aspettarci miracolo, ma senza dubbio renderemo gli script molto più user-friendly con pochi semplici accorgimenti.
Nelle ultime distribuzioni di Ubuntu lo trovate già installato; se però non lo avete a disposizione, possiamo sempre utilizzare il classico apt:
# apt-get install zenity
Una volta installato, iniziamo ad occuparci delle nostre interfacce grafiche.
Finestre di dialogo: messaggi
Ci sono tre tipi di finestre di dialogo base che Zenity ci mette a disposizione: info
, error
e warning
. Vediamo la sintassi per utilizzarle:
$ zenity --info --title="html.it" --text="Questa è un messaggio di informazione"
Questa semplice riga di comando include un titolo, definito dall'opzione --title
, ed un testo, definito da --text
. L'opzione --info
specifica, invece, che si tratta di un messaggio di informazione. Il risultato ottenuto dalla riga precedente è mostrato in figura 1:

Analogamente all'info message appena visto, utilizzando le opzioni --error
e --warning
al posto di --info, si ottengono rispettivamente messaggi di errore e di attenzione (figure 2 e 3):


Per tutte le finestre appena viste, e per tutte quelle che vedremo, è possibile settare alcuni importanti parametri, specificando le seguenti opzioni:
- --title=TITLE:
- --text=TESTO
- --width=WIDTH
- --height=HEIGHT:
- --timeout=TIMEOUT
Vediamo un esempio che crea un messaggio di warning in una finestra di 400x400 pixel, che viene chiusa dopo 20 secondi di inattività:
zenity --warning --title="html.it" --text="Questa è un messaggio di attenzione" --width=400 --height=400 --timeout=20
Notifiche: un'alternativa ai messaggi
Oltre alle finestre, Zenity consente l'utilizzo di notifiche, che appaiono direttamente accanto al pannello (in alto a destra, per intenderci). Per utilizzare questa utility, è necessario utilizzare qualche piccolo stratagemma, poiché questa volta il campo --text
non ci viene in aiuto (e l'opzione --help
di Zenity fornisce più dubbi che chiarimenti.).
Consideriamo il seguente comando:
$ echo 'message:Errore!' | zenity --notification --listen --window-icon="error"
- --window-icon
info
error
warning
- --listen
echo
- Il testo della notifica va preceduto da "message:

Finestre di dialogo: domande e... risposte
Oltre ai messaggi appena visti, Zenity offre molte altre utili possibilità di interazione con l'utente. Capita spesso che, in un'applicazione, è necessario richiedere all'utente se si vuole fare o meno una determinata azione. Proprio per questa esigenza esistono le "questions", ovvero le finestre di domanda, grazie alle quali possiamo chiedere all'utente una conferma. In sostanza, otterremo una finestra di dialogo simile a questa:

Per ottenere questo risultato, è sufficiente ancora una volta un semplice comando:
$ zenity --question --title="html.it" --text="Vuoi proseguire?" --ok-label="Certo che si" --cancel-label="Assolutamente no"
Con le opzioni --ok-label
e --cancel-lable
è possibile modificare il contenuto dei pulsanti di conferma a nostro piacimento. Per noi italiani, GNOME imposta di default OK e Annulla.
Mentre negli esempi precedenti, il valore di ritorno del messaggio è pressoché irrilevante, qui abbiamo la necessità di ottenere la risposta dell'utente per poi utilizzarla. Il codice seguente mostra, con un esempio, come fare.
zenity --question --title="html.it" --text="Vuoi proseguire?" --ok-label="Certo che si" --cancel-label="Assolutamente no"
Il risultato verrà salvato in una variabile chiamata $?
if [ "$?" -ne 0 ]
then
echo "Alla prossima"
else
echo "Proseguo il programma"
fi
In generale, Zenity imposta sempre la variabile $?
a 0
se l'utente scegli l'opzione Ok, e a 1
se viene scelta l'opzione Annulla.
Questa utility può essere interessante anche quando si vogliono ottenere delle stringhe digitate dall'utente. L'esempio classico è la richiesta di username e password. Per fare ciò, utilizziamo l'opzione --entry
.
$ zenity --entry --title="Richiesta username" --text="Inserisci il nome utente:" --entry-text="Testo di default"
Il comando visto crea una casella di testo contenente la stringa "Testo di default", che l'utente può modificare. È possibile anche nascondere il testo all'utente, come si fa per le password, aggiungendo l'opzione (senza parametri) --hide-text
Il risultato di questo comando è esattamente la stringa inserita dall'utente nel caso in cui egli preme Ok (e la variabile $?
viene impostata a 0
); altrimenti, verrà semplicemente impostata ad 1
la variabile $?

Altri comandi
Le funzionalità che ci offre Zenity non sono ancora finite. Oltre alla possibilità di utilizzare messaggi di avviso ed errore, finestre di dialogo e notifiche, vi sono ancora altre funzionalità utilissime, che elenchiamo qui per brevità (anche perché, compresi gli esempi precedenti, non sarà difficile imparare ad usare queste altre funzioni):
- --file-selection:
--filename
- --scale:
zenity --help-scale
- --list
zenity --help-list
- --progress
zenity --help-progress
. - --calendar
Adesso che avete visto come utilizzare Zenity, siete pronti a sperimentare qualche semplice interfaccia grafica, per rendere un po' più amichevole agli utenti meno esperti l'utilizzo dei vostri script di shell.