dissabte, 16 de juliol del 2011

Fer servir zenity per a construir scripts bash amb interfície gràfica

La creació d'scripts de shell és una tasca habitual en l'administració i explotació de sistemes Unix. En algunes ocasions pot ser que calgui la interacció amb l'usuari. Per exemple, la presentació de menús d'opcions o l'usuari ha de triar què vol fer.

A Linux Ubuntu hom pot trobar eines com el programa Dialog que permet crear elements de interfície gràfica com caixes de text, llistes, botons de sel·lecció... en mode de text. Dialog es feia servir, per exemple, en els instal·ladors de moltes distribucions.

Una opció alternativa és fer servir Zenity. Zenity és la re-escriptura de GDialog, que al seu torn era la versió GNOME de Dialog. Zenity proporciona una forma senzilla de crear interfícies gràfiques per a scripts.

Zenity es pot instal·lar des del Centre de Programari de l'Ubuntu, si cal.

Anem a fer alguns experiments amb aquesta eina. Primer de tot cal conéixer la versió que tenim instal·lada i les opcions.

La versió s'obté amb zenity --version. En el meu cas és la 2.30.

Les diferents opcions s'obtenen amb: zenity --help-all a la línia d'ordres i el resultat és:

Forma d'ús:
  zenity [OPCIÓ...]

Opcions d'ajuda:
  -h, --help                            Mostra les opcions d'ajuda
  --help-all                            Mostra totes les opcions d'ajuda
  --help-general                        Mostra les opcions generals
  --help-calendar                       Mostra les opcions del calendari
  --help-entry                          Mostra les opcions de l'entrada de text
  --help-error                          Mostra les opcions d'error
  --help-info                           Mostra les opcions d'informació
  --help-file-selection                 Mostra les opcions del selector de fitxers
  --help-list                           Mostra les opcions de llistes
  --help-notification                   Mostra les opcions de la icona de notificació
  --help-progress                       Mostra les opcions del progrés
  --help-question                       Mostra les opcions de preguntes
  --help-warning                        Mostra les opcions d'avisos
  --help-scale                          Mostra les opcions de l'escala
  --help-text-info                      Mostra les opcions de text informatiu
  --help-misc                           Mostra les opcions miscel·lànies
  --help-gtk                            Mostra les opcions del GTK+

General options
  --title=TÍTOL                         Estableix el títol del diàleg
  --window-icon=CAMÍ D'ICONA            Estableix la icona de la finestra
  --width=AMPLADA                       Estableix l'amplada
  --height=ALÇADA                       Estableix l'alçada
  --timeout=TEMPS D'ESPERA              Estableix el temps d'espera del diàleg (en segons)

Calendar options
  --text=TEXT                           Estableix el text del diàleg
  --day=DIA                             Estableix el dia del calendari
  --month=MES                           Estableix el mes del calendari
  --year=ANY                            Estableix l'any del calendari
  --date-format=PATRÓ                   Estableix el format de la data de tornada

Text entry options
  --text=TEXT                           Estableix el text del diàleg
  --entry-text=TEXT                     Estableix el text de l'entrada
  --hide-text                           Amaga el text de l'entrada

Error options
  --text=TEXT                           Estableix el text del diàleg
  --no-wrap                             No habilites l'ajustament del text

Info options
  --text=TEXT                           Estableix el text del diàleg
  --no-wrap                             No habilites l'ajustament del text

File selection options
  --filename=NOM DE FITXER              Estableix el nom del fitxer
  --multiple                            Permet la selecció de múltiples fitxers
  --directory                           Activa la selecció de només directoris
  --save                                Activa el mode d'estalvi
  --separator=SEPARADOR                 Estableix el caràcter de separació de la sortida
  --confirm-overwrite                   Confirmeu la selecció del fitxer si el nom del fitxer ja existeix
  --file-filter=PATRÓ 1 PATRÓ 2 ...     Estableix un filtre per al nom de fitxer

List options
  --text=TEXT                           Estableix el text del diàleg
  --column=COLUMNA                      Estableix la capçalera de la columna
  --checklist                           Utilitza quadres de verificació per a la primera columna
  --radiolist                           Utilitza botons de grup per a la primera columna
  --separator=SEPARADOR                 Estableix el caràcter de separació de la sortida
  --multiple                            Permet la selecció de múltiples files
  --editable                            Permet canvis al text
  --print-column=NOMBRE                 Imprimeix una columna específica (el valor per defecte és 1. Es pot usar 'ALL' per a imprimir totes les columnes)
  --hide-column=NOMBRE                  Amaga una columna específica
  --hide-header                         Oculta les capçaleres de la columna

Notification icon options
  --text=TEXT                           Estableix el text de la notificació
  --listen                              Espera ordres de l'entrada estàndard

Progress options
  --text=TEXT                           Estableix el text del diàleg
  --percentage=PERCENTATGE              Estableix el percentatge inicial
  --pulsate                             Barra de progrés parpellejant
  --auto-close                          Tanca el diàleg quan s'arribi al 100%
  --auto-kill                           Mata el procés para si es prem el botó de cancel·lar

Question options
  --text=TEXT                           Estableix el text del diàleg
  --ok-label=TEXT                       Estableix l'etiqueta del botó D'acord
  --cancel-label=TEXT                   Estableix l'etiqueta del botó Cancel·la
  --no-wrap                             No habilites l'ajustament del text

Warning options
  --text=TEXT                           Estableix el text del diàleg
  --no-wrap                             No habilites l'ajustament del text

Scale options
  --text=TEXT                           Estableix el text del diàleg
  --value=VALOR                         Estableix un valor inicial
  --min-value=VALOR                     Estableix el valor mínim
  --max-value=VALOR                     Estableix el valor màxim
  --step=VALOR                          Estableix el valor dels augments
  --print-partial                       Imprimeix valors parcials
  --hide-value                          Amaga el valor

Text information options
  --filename=NOM DE FITXER              Obre un fitxer
  --editable                            Permet canvis al text

Miscellaneous options
  --about                               Quant a zenity
  --version                             Imprimeix la versió

Opcions del GTK+
  --class=CLASS                         Program class as used by the window manager
  --name=NAME                           Program name as used by the window manager
  --screen=SCREEN                       X screen to use
  --sync                                Make X calls synchronous
  --gtk-module=MODULES                  Load additional GTK+ modules
  --g-fatal-warnings                    Make all warnings fatal

Opcions de l'aplicació:
  --calendar                            Mostra el diàleg de calendari
  --entry                               Mostra el diàleg d'entrada de text
  --error                               Mostra el diàleg d'error
  --info                                Mostra el diàleg d'informació
  --file-selection                      Mostra el diàleg de selecció de fitxers
  --list                                Mostra el diàleg de llista
  --notification                        Mostra una notificació
  --progress                            Mostra el diàleg d'indicació de progrés
  --question                            Mostra el diàleg de pregunta
  --warning                             Mostra el diàleg d'avís
  --scale                               Mostra el diàleg d'escala
  --text-info                           Mostra el diàleg de text informatiu
  --display=DISPLAY                     X display to use


Anem a provar-los un per un:

Mostrar el diàleg de calendari:
zenity --calendar




Mostrar una caixa d'entrada de text
zenity --entry --text="Entra un text de prova"



El següent script mostra com obtenir el text introduït

#!/bin/bash

textPregunta="Text de la pregunta"
textPredet="Text predeterminat a l'entrada"
textTitol="Títol de la finestra"

resp=$(/usr/bin/zenity --entry --text="$textPregunta" --entry-text="$textPredet" --title="$textTitol" --width=400 --height=200)

echo "la meva resposta ha estat: $resp"



Mostrar una finestra de missatge d'error
zenity --error --text="Descripció de l'error"



Mostrar el diàleg de sel·lecció de fitxers
zenity --file-selection


Mostrar una finestra amb un text informatiu
zenity --info --text="Aquest és el text informatiu"


Mostrar una llista de sel·lecció
zenity --list --text="Llista de prova" \
       --column="ID" --column="Nom" --column="Valor" \
       "1" "nom1" "valor1" \
       "2" "nom2" "valor2" \
       "3" "nom3" "valor3" \
       "4" "nom4" "valor4"



Mostrar una icona de notificació al quadre del Gnome
zenity --notification  --text="Text de la notificació"



Mostrar una barra de progrés. El truc per a que funcioni és el tub (pipe) que alimenta la progressió de la barra.

(
for i in {1..100}
do
   echo $i
done
) | zenity --progress --text="Exemple de barra de progrés" --auto-close --percentage=0



Demanar a l'usuari si sí o si no a una pregunta.

if zenity --question --text="Vols continuar?" --ok-label="Sí, està molt interessant" --cancel-label="No, m'avorreixo com una ostra"
then
    zenity --info --text="Ok, doncs seguim."
else
    zenity --error --text="Cap problema, un altre dia serà."
fi

Mostrar un fitxer de text
zenity --text-info --filename="help.txt" --height=400 --width=500



Mostrar un text d'alerta. Adonem-nos que zenity ens proporciona caixes de notificació específiques de info, warning i error, que són els tres nivells que es fan servir més habitualment per a classificar per importància o gravetat els missatges de les aplicacions.
zenity --warning --text="Aquest és un text d'alerta"



Finalment, obtenir un valor numèric dins un rang
zenity --scale --text="Quants anys tens?" --min-value=0 --max-value=150

Cap comentari:

Publica un comentari a l'entrada