Zenity, mejorando la presencia de tus scripts

Milton Mazzarri bio photo By Milton Mazzarri

Zenity, es un programa que le permitirá desplegar cuadros de dialogos GTK+, lo cual le facilitará la interacción con el usuario. Tomando en consideración lo anterior, Zenity debe ser considerado a la hora de desarrollar scripts que necesitan presentar una interfaz “amigable”, lo cual facilitará el manejo del script. Por ejemplo, puede generar un cuadro de dialogo que le indique al usuario el progreso de la operación actual, o un mensaje de alerta al usuario.

¿Qué puedo hacer con Zenity?

Puede hacer los siguientes cuadros de dialogos:

  • Calendarios
  • Selección de ficheros o directorios
  • Listas
  • Mensajes de:
    • Error
    • Información
    • Preguntas
    • Alerta
  • Progreso de operaciones
  • Entradas de texto
  • Textos de información
  • Mensajes en el área de notificación

Esto no pretende ser un tutorial exhaustivo del uso de Zenity, simplemente se mostrarán algunos usos que le he dado al desarrollar audioconverter, si utiliza el entorno de escritorio GNOME, puede encontrar información detallada en: Sistema -> Ayuda -> Escritorio -> Zenity.

Listas

Cuadro de dialogo: Lista En la imagen de la izquierda podemos apreciar uno de los tipos de listas que pueden ser creadas, en este caso he usado la opción –radiolist, esto permite que únicamente se seleccione una opción, si se desea permitir el seleccionar más de una opción, podemos recurrir a –checklist. Al emplear las opciones –radiolist o –checklist es necesario comenzar cada fila con alguna de las constantes TRUE o FALSE, en donde TRUE hará que el botón de radio (o de verificación) se encuentre marcado, en caso contrario el botón quedará desmarcado.

Es importante aclarar que Zenity retornará la entrada que se encuentre en la primera columna de texto de la fila seleccionada al error estándar (stderr), en el ejemplo el valor de retorno sería 2. En el caso que necesite utilizar dicho valor en el script, será necesario hacer una redirección de los descriptores.

zenity --list \
     --title="AudioConverter (v0.3)" \
     --text="Seleccione una operacion a realizar de la lista." \
     --radiolist \
     --width="355" \
     --height="290" \
     --column="" --column="#" --column="Operacion" --column="Descripcion" \
     FALSE 1 "MP3 a WAV" "Convierte ficheros MP3 a WAV" \
     FALSE 2 "MP3 a OGG" "Convierte ficheros MP3 a OGG" \
     FALSE 3 "OGG a WAV" "Convierte ficheros OGG a WAV" \
     FALSE 4 "OGG a MP3" "Convierte ficheros OGG a MP3" \
     FALSE 5 "WAV a OGG" "Convierte ficheros WAV a OGG" \
     FALSE 6 "WAV a MP3" "Convierte ficheros WAV a MP3" \
     FALSE 7 "WMA a MP3" "Convierte ficheros WMA a MP3"

En el codigo de arriba se muestran algunas cosas que aún no he detallado, por ejemplo:

  • --title es una opción general, establece el título del cuadro de dialogo.
  • --width es una opción general, establece la anchura del cuadro de dialogo.
  • --height es una opción general, establece la altura del cuadro de dialogo.
  • --text establece el texto de la lista.
  • --column es una opción específica para la generación de listas, establece el título de la columna.

Existe una opción bastante interesante dentro de las opciones de las listas, dicha opción es –print-column, la cual permite especificar qué columna se imprimirá en la salida estándar (stdout). Por defecto se devuelve el valor de la primera columna, puede utilizar la cadena ALL para imprimir todas las columnas de la fila seleccionada.

Es importante que se asegure de encerrar entre comillas cada uno de los argumentos de los comandos en Zenity, de lo contrario, puede obtener resultados inesperados.

Textos de información

Para crear dialogos de textos de información simplemente debemos utilizar la opción --text-info.

Cuadro de Dialogo: Texto de Información Aparte de las opciones generales, los dialogos de textos de información soportan las siguientes opciones:

  • --filename=fichero especifica qué fichero será cargado en el dialogo de información
  • --editable permite que el texto mostrado pueda ser editado. El texto editado es retornado a standard error (stderr), cuando el cuadro de dialogo se cierra:

    … 2) mp32ogg 2>&1 | zenity –text-info \ –title=”Registro de la Conversion” \ –width=”420” \ –height=”500”;; …

En el código no se indica explicitamente la opción –filename, pero cabe resaltar que la salida estándar (stdout) de la función mp32ogg es trasladada a través de una tubería (pipe, ** **) a Zenity, previamente se ha duplicado el error estándar (stderr) de la fucnión mp32ogg a la salida estándar (stdout) de la misma, de esta manera aprovechamos como entrada al dialogo de información las salidas de la función mp32ogg.

Si lo desea puede ampliar la información acerca de las redirecciones en bash leyendo el Manual de Referencia Bash (inglés), no estoy seguro si existe en la red una versión en español de este manual.

Dialogos de Información

Cuadro de Dialogo: Información Para mostrar cuadros de dialogos de información debemos hacer uso de la opción –info. Dentro de esta categoría existe únicamente un parámetro que se puede utilizar aparte de las opciones generales, dicho parámetro es –text, éste establece un texto en el dialogo.

zenity --info \
     --text="Conversion MP3 a OGG finalizada."

De manera similar se puede mostrar un mensaje de error, debemos recurrir a la opción –error para ello, por ejemplo:

if [ "${1}" -ne "0" ]; then
     zenity --error \
     --text="${2}"
     exit ${1}
fi

Entradas de Texto

Cuadro de Dialogo: Entrada de Texto Se debe utilizar la opción –entry para crear cuadros de dialogos de entrada de texto, es importante hacer notar que Zenity retornará el contenido de la entrada de texto al error estándar. En el caso que necesite utilizar dicho valor en el script, será necesario hacer una redirección de los descriptores.

Dentro de esta categoría tenemos las siguientes opciones:

  • --text especifica el texto que se mostrará en el cuadro de dialogo de entrada de texto.
  • --entry-text establece el texto que será mostrado en el campo de entrada en el cuadro de dialogo, ideal en los casos cuando quiere mostrar al usuario algún valor predeterminado.
  • --hide-text oculta el texto en el campo de entrada del cuadro de dialogo, ideal en aquellos casos cuando el valor ingresado es una contraseña.

Código de muestra

...
if zenity --entry \
     --title="Ingreso de datos" \
     --text="Ingrese el valor del Bitrate:" \
     --entry-text="160" > bitrate.txt
     then bitrate=$(head bitrate.txt); rm -f bitrate.txt
     else bitrate="160"
fi
...

Ya para finalizar, solo espero que se animen a probar esta útil herramienta a la hora de desarrollar sus scripts, en principio Zenity es básico en su manejo e implementación, próximamente espero publicar un breve tutorial acerca del uso de Xdialog, el cual desde mi perspectiva es más profundo que Zenity.