Interfaces gráficas al vuelo

Sin lugar a dudas, la tarea mas tediosa de crear un programa, es crear la interfaz gráfica, sobretodo cuando el programa es un script hecho en un rato, que pretende resolver alguna necesidad puntual, de forma sencilla y concisa.

Normalmente, nos encontramos que para crear un par de ventanas preguntando algo al user y eliminar algún archivo y crear una carpeta, tenemos que programar 4 lineas para lo que de verdad hace el programa, y 40 para la interfaz gráfica.

Para evitar esto, nació dialog, una pequeña aplicación que al ser ejecutada, permite pasarle ciertos parámetros que le indican como debe pintar una ventana, la dibuja, y según lo que haga el usuario, el comando devuelve una cosa u otra.

Para entrar mas en detalle, probamos el siguiente comando:

dialog –stdout –title “Selecciona un archivo” –fselect $HOME/ 14 48

Esto nos dibuja una ventana mediante ncurses, que nos permite seleccionar un fichero.

Utilizando esto, se pueden crear pequeños scripts en bash, por ejemplo, que realicen tareas y permitan interactuar al usuario.

Como la idea tubo bastante éxito, se creó Xdialog, que hace lo mismo pero pintando ventanas con GTK, y kdialog que hace lo mismo pero pintando ventanas mediante Qt.

Como para entender las cosas, lo mejor es un buen ejemplo, he creado un pequeño script en bash, que primero comprueba si estamos en las X, si no lo estamos, utiliza dialog, si lo estamos, comprueba si tenemos kdialog para utilizarlo, y si no lo tenemos, usa Xdialog.

#!/bin/bash

if [ -z $DISPLAY ]
then
DIALOG=dialog
else
if command -v kdialog &>/dev/null
then
DIALOG=kdialog
else
DIALOG=Xdialog
fi
fi

$DIALOG –title “Mi primer dialogo” \
–yesno “Si o no?” 10 30

case $? in
0)
echo “Has escogido si!!”;;
1)
echo “Has escodigo no!!”;;
255)
echo “Has cerrado el dialogo, sin decir si o no!!”;;
esac

Este script hace una pregunta, y luego printea por consola la respuesta que hemos escodigo.

Y este es el resultado que vemos usando kdialog.

Otro script que pregunta al usuario por su nombre, y muestra una caja de entrada:

#!/bin/bash

if [ -z $DISPLAY ]
then
DIALOG=dialog
else
if command -v kdialog &>/dev/null
then
DIALOG=kdialog
else
DIALOG=Xdialog
fi
fi

tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/test$$
trap “rm -f $tempfile” 0 1 2 5 15

$DIALOG –title “Un ejemplo con una caja de entrada” \
–inputbox “Caja de entrada de ejemplo:” 16 51 2> $tempfile

retval=$?

case $retval in
0)
echo “Input string is `cat $tempfile`”;;
1)
echo “Cancel pressed.”;;
255)
if test -s $tempfile ; then
cat $tempfile
else
echo “ESC pressed.”
fi
;;
esac

Cabe decir que kdialog no es completamente compatible con dialog y Xdialog, por lo que puede que os encontréis con problemas al intentar utilizar uno u otro de forma transparente.

Como curiosidad, conozco un par de scripts interesantes hechos con dialog, uno de ellos es un script hecho por un conocido mio, que sirve para crackear redes wireless que utilicen seguridad WEP, sin tener que teclear ningún comando:

Airfoncrack

Y aquí tenemos otro ejemplo de como utilizar kdialog y curl para crear una aplicación visual que permite agregar notas a twitter.

10 thoughts on “Interfaces gráficas al vuelo

  1. @Nitz tiene gracia que lo digas tu, siendo el autor :p

    Bueno, es normal, en ese tipo de scripts no se suelen hacer muchas virguerías, mas bien al contrario

    Gracias por el comentario, y a mi me gusta el airfoncrack eh :p

  2. Buenas

    Tambien existe zenity, con una interfaz un poco mas bonita pero no tan liviano como xdialog, tiene varias tipos de ventanas sencillas de implementar como cajas de textos, informacion, preguntas, errores, advertencias, seleccion, listas, etc.

    Application Options:
    –calendar Display calendar dialog
    –entry Display text entry dialog
    –error Display error dialog
    –info Display info dialog
    –file-selection Display file selection dialog
    –list Display list dialog
    –notification Display notification
    –progress Display progress indication dialog
    –question Display question dialog
    –warning Display warning dialog
    –scale Display scale dialog
    –text-info Display text information dialog
    –display=DISPLAY X display to use

    Una alternativa mas.

    saludos

  3. Hola Zerial, gracias por los comentarios, no conocía zenity, he estado probándolo y la verdad es que tiene muy buena pinta.

    Gracias por el comentario!

  4. ¡Buenas!

    En entornos Windows, existe una poderosa herramienta de scripting que, además de permitirnos crear interfaces gráficas de una forma igual de sencilla, es capaz de interactuar con el resto del entorno. Se trata de AutoIt: http://www.autoitscript.com/autoit3/

    Respecto a que crear la interfaz gráfica sea el aspecto más tedioso, disiento: ¡¡¡es crear el acceso a datos!!! :D (O, por lo menos, se dan la mano en cuanto a latazo… menos mal que también tenemos los ORM que nos quitan algo de trabajo).

    ¡Saludos!

  5. Llego un poco tarde, tras unos meses, pero Xdialog es muy muy feo, porque usa Gtk v1 para mostrarte los dialogos.

    GTKDialog es otra alternativa que, aunque sea bastante más complicada de usar, permite diseñar los dialogos con Glade, por lo que se guardan en ficheros .glade que luego puedes llamar desde consola.

    Con lo que puedes hacer dialogos y ventanas bastante complejos, que al final acaben llamando a scripts en apenas minutos.

  6. Muchas graicas Lobosoft por le de AutoIt, voy a probarlo pues necesitaba ya algo parecido para automatizar actualizaciones via ftp, muchas gracias, esta buenisimo el blog.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *