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: imposta il titolo della finestra di dialogo.
- --text=TESTO: imposta il testo della finestra di dialogo.
- --width=WIDTH: spefica la larghezza della finestra.
- --height=HEIGHT: specifica l'altezza della finestra.
- --timeout=TIMEOUT: imposta un tempo dopo il quale, se l'utente non fa nulla, la finestra viene chiusa.
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 consente di impostare l'icona della notifica. I valori ammessi sono
info
,error
ewarning
. Se non specificato nulla, il valore di default è warning. - --listen è utilizzato per consentire a zenity di ricevere il messaggio passato via pipe da
echo
. - Il testo della notifica va preceduto da "message:", come nell'esempio.
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: apre una finestra di ricerca (il classico tasto "sfoglia"). È possibile impostare la directory o il file di partenza tramite l'opzione
--filename
; se non specificato nulla, viene utilizzata la working directory. - --scale: consente di selezionare un valore intero in un intervallo, attraverso un cursore. Sono settabili i valori minimo e massimo, e il passo. Per maggiore dettagli, basta dare un'occhiata all'output di
zenity --help-scale
. - --list: utile se si vuole visualizzare una lista. Anche in questo caso, maggiori dettagli sulle opzioni possono essere consultati in
zenity --help-list
. - --progress: consente l'utilizzo di una progress bar riferita all'avanzamento di alcuni comandi (come per esempio la copia o la rimozione di file). Dettagli in
zenity --help-progress
. - --calendar: utile come finestra di selezione di una data. La data selezionata viene ritornata direttamente.
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.