Creare semplici interfacce grafiche per GNOME

Stampa
( 0 Votes ) 
Valutazione attuale:  / 0
ScarsoOttimo 
Categoria: Informatica
Data pubblicazione
Scritto da MGuruDC Visite: 2835

Creare semplici interfacce grafiche per GNOME

con Zenity, un utile strumento a disposizione degli utenti Linux

Premessa

Chi ha usato o usa Linux avrà sicuramente  notato il grande uso degli script bash, che permettono di creare procedure più o meno complesse per configurare o usare il proprio sistema operativo. Ad esempio attraverso questi script possono essere avviati correttamente i programmi che richiedono il supporto Java, si può tenere sotto controllo l'esecuzione di un programma, oppure può essere automatizzato l'aggiornamento del sistema, o il backUp di un disco... TUTTO insomma! Generalmente il terminale di Linux mette a disposizione migliaia e migliaia di comandi(2942 nel mio caso), conoscendone un po' si fanno cose molto interessanti, conoscendone molti si fanno cose incredibili con semplicità ed efficienza.

Un comando(=programma) molto utile a chi vuole creare degli script, o ai "programmatori artigianali" come me(che non hanno ancora idea di come si fa un'interfaccia grafica) è Zenity, un generatore di finestre-interfacce standard molto utile.

Qualora zenity non fosse già nel vostro sistema potrete scaricare qui il pacchetto tar.gz, su Ubuntu e derivate il pacchetto è già nelle repository.

Beh... le guide a Zenity abbondano, senza dimenticare che digitando dal terminale

man zenity

avremo una guida molto esauriente, ma penso che a tutti noi interessino le applicazione pratiche più che le dimostrazioni, per questo vi parlerò dello script che ho creato per dare una semplice interfaccia grafica al programma per terminale che ho presentato qualche giorno fa. 

Lo shell script per Linux non è facilissimo per chi è alle prime armi come me, il lavoro che vado a presentare sicuramente non è impeccabile(...forse totalmente sbagliato), ma è stato messo a punto passo dopo passo, un pezzettino alla volta, fino ad avere il risultato desiderato.

Vediamo un po' come funziona...

 

Una GUI per "Ordina"

Lo script essenzialmente raccoglie e dispone correttamente i parametri in ingresso per il programma in C, che ripeto sono:

-i [file_ingresso];

-o [file_uscita];

-[opzioni].

Visto che useremo una GUI non avremo la possibilità di leggere cosa viene stampato sul terminale, quindi ho rielaborato il programma togliendo tutti i messaggi che prima venivano stampati a video e facendogli restituire dei semplici numeri in caso di errore, ovvero:

1 errore di sitassi(quasi impossibile con la GUI;

2 file in ingresso non trovato;

3 file in uscita non accessibile.

Il sorgente dell'eseguibile modificato è disponibile nell'archivio zip .

Le prime righe:

#!/bin/bash

zenity --question --title="Ordina da MGuruDC" --text="Eseguire il programma di ordinamento delle stringhe?"

La prima riga in realtà è un commento(in bash script cominciano con "#") ma non è strettamente necessario... terminali molto vecchi senza questo commento potrebbero non capire che si tratta di uno script.

La prima chiamata a Zenity ha l'obbiettivo di creare una finestra di dialogo con i pulsanti "Ok" e "Annulla" dove chiederemo se si vuole procedere con l'esecuzione del programma. Per fare ciò abbiamo a disposizione l'opzione "--question", con "--title="[testo]"" andremo a definire il titolo della finestra, con "--text="[testo]"" definiamo il testo della finestra. Senza queste ultime due opzioni visualizzeremo un testo standard.

Il risultato a video del comando  è questo:

Se col mouse premiamo "Ok" zenity restituirà il valore 0, altrimenti ci darà 1. Dobbiamo dunque eseguire il resto dello script solo se riceviamo il valore 0, quindi andiamo a racchiudere tutto lo script in un costrutto "if"

if [ $? = 0 ];

        then

        ...

        resto dello script

        ...

        fi

Quel "$?" è semplicemente un richiamo all'ultimo valore restituito, un modo più semplice per vedere se abbiamo scelto "Ok" o "Annulla".

Adesso entriamo nel corpo del programma:

         FILE_ORIGINE=`zenity --file-selection --title="Ordina - Selezione il file da leggere"`

Qui creiamo una variabile di nome "FILE_ORIGINE" che useremo per memorizzare il percorso del file che il programma dovrà leggere. Con l'opzione "--file-selection" apriremo una finestra che ci permetterà di scegliere il file in ingresso, zenity restituisce il percorso del file scelto che viene memorizzato. Ricordiamo che senza gli "`" nella variabile non verrà memorizzato il valore restituito dal comando, ma semplicemente il testo dopo il simbolo dell'uguale. Il risultato grafico è questo

L'immagine è stata ridimensionata. Clicca qui per vedere l'immagine ingrandita. Le dimensioni originali sono 812x747

Subito dopo andiamo a cercare il file su cui scrivere col comando

        FILE_DEST=`zenity --file-selection --title="Ordina - Selezione il file su cui scrivere" --save --confirm-overwrite`

Con l'opzione "--save" diremo al programma che la finestra può creare un nuovo file, mentre l'opzione "--confirm-overwrite" ci avverte se stiamo aprendo un file già esistente e quindi ci chiede se vogliamo sovrascriverlo

L'immagine è stata ridimensionata. Clicca qui per vedere l'immagine ingrandita. Le dimensioni originali sono 828x753

Adesso viene la parte più complicata:

        OPZIONI=`zenity --list --checklist --column="" --column="Opzioni" false "Elimina doppioni " false " Usa lo spazio come delimitatore" --title="Ordina - Opzioni" --text="Selezionare le opzioni" --width=300 --height=205`

Con le opzioni "--list --checklist" apriamo una finestra con delle caselle da spuntare per decidere le opzioni dell'ordinamento. Le opzioni "--column="[testo]"" creano e nominano le colonne della tabella(va dato anche se non c'è un titolo).Il comando "false "[testo]"" nomina le righe della tabella. In questo caso i nomi delle stringhe sono troppo lunghi qiuindi le tabella viene tagliata e vengono messe delle barre di scorrimento. Per evitare questo possiamo dare una dimensione precisa alla finestra con le opzioni "--width=[pixel]" e "--height=[pixel]" che specificano la larghezza e altezza della finestra in pixel. Ecco il risultato:

I nomi delle opzioni scelte vengono memorizzati nella variabile "OPZIONI" e intervallate da caratteri "|", quindi se selezioniamo ad esempio "opzione 1" e opzione 3", ma non "opzione 2", la variabile "OPZIONI" conterrà la stringa

opzione 1|opzione 3

 A questo punto possiamo eseguire subito il programma se non è stata selezionata alcuna opzione

            if [ -z "$OPZIONI" ]

                    then

                    RET=`./ordina -i $FILE_ORIGINE -o $FILE_DEST`

            else ...

Se non abbiamo scelto nessuna opzione la stringa "OPZIONI" sarà vuota, quindi la condizione "-z" sarà vera. in questo caso il programma viene eseguito dando come parametri solamente i percorsi dei file su cui lavorare. Il valore restituito dal programma viene memorizzato nella variabile "RET" che useremo dopo.

        else

                ARG=-

                for((i=1; i<10; i++))

                        do

                        if [ "$(echo $OPZIONI | awk '{print $'$i'}')" = "doppioni" ]

                                ARG=$ARG"d"

                        elif [ "$(echo $OPZIONI | awk '{print $'$i'}')" = "spazio" ]

                                ARG=$ARG"s"

                        fi

                        done

                RET=`./ordina -i $FILE_ORIGINE -o $FILE_DEST $ARG`

                fi

Se la stringa "OPZIONI" non è vuota parte la scansione della stringa stessa alla ricerca delle parole chiave delle opzioni e... la condizione dell'"if" è molto complicata, ad esempio:

"$(echo $OPZIONI | awk '{print $'$i'}')" = "doppioni"

stampa la stringa con il comando "echo", poi ne seleziona la sottostringa "i"(indice del ciclo "for") grazie al comando "awk" e la confronta con la parola chiave "doppioni". Se la sottostringa viene trovata, viene subito memorizzato il carattere giusto nella stringa "ARG".

Alla fine di questo ciclo viene eseguito il programma, ma stavolta anche con le opzioni.

        if((RET==1))

                then

                zenity --warning --title="Ordina - Errore! " --text="Errore di sintassi" --width=200

        elif((RET==2))

                then

                zenity --warning --title="Ordina - Errore! " --text="File in ingresso non trovato" --width=250

        elif((RET==3))

                then

                zenity --warning --title="Ordina - Errore! " --text="File in uscita non accessibile" --width=250

        else

                zenity --info --title="Ordina - finito! " --text="Ordinamento completato"

                fi

        fi

Dopo aver eseguito il programma bisogna analizzare il valore restituito, se non è nullo viene visualizzato il messaggio di errore adeguato grazie all'opzione "--warning".

Se non c'è nessun errore viene visualizzato  un messaggio informativo che ci comunica la buona riuscita delle operazioni con l'opzione"--info". Ecco il risultato:

I comandi "fi" chiudono i due "if" e tutto lo script.

Finito!

Qui potete scaricare un archivio contenente:

- lo script;

- il sorgente della versione modificata del programma "ordina";

- un file binario(eseguibile) compilato su Ubuntu 9.10.

Piccole note per l'uso

Il file binario e lo script per funzionare devono trovarsi nella stessa cartella

Se copiate l'eseguibile "ordina" nella cartella "/usr/bin"(ci vogliono i permessi di root) il programma diventa a sua volta un comando del terminale, quindi dalle chiamate al programma nello script vanno eliminati i "./". In questo caso lo script dell'interfaccia grafica può stare dove ci fa più comodo.

 Saluti, Guru

Joomla 1.7 Templates designed by College Jacke