Ni Tcl/Tk, ni PyQt, ni Ruby/GNOME, ni wxWidgets, ni siquiera Python/GTK. Lo que se lleva, lo que parte la pana, lo que hace babear a las nenas, es Bash/GTK.

Sé qué eso de Bash/GTK puede sonar a hacer despegar un transbordador espacial dando pedales. Es eso exactamente. Sólo que despega.

La maravilla se llama Zenity, forma parte del proyecto GNOME y está disponible supongo que para cualquier distribución. Vamos a hacer una pequeña demostración.

Pongamos que nos llamamos Adal, y que queremos juntar unos pdf's. Nada más fácil, instalamos pdftk, et voilà:

 $ pdftk uno.pdf dos.pdf cat output unoydos.pdf
 

Hecho. Pero resulta que tenemos un sentido de la estética absolutamente exacerbado, y queremos que nuestra aplicación sea gráfica. Entonces es cuando tenemos que escribir un pequeño script, que llame a zenity cuando sea necesario. Zenity mostrará el diálogo que necesitemos (para una lista completa, man zenity), y nos pasará la respuesta del usuario por la salida estándar. Por ejemplo:

 #!/bin/bash
 FILES=`zenity --title "Seleccione los pdf's
             que desa unir" --file-selection
             --multiple --separator " "`
 pdftk $FILES cat output pdftk.pdf

Las opciones de zenity en este caso no tienen mucho que explicar: --title se explica sola, --file-selection especifica el diálogo que queremos mostrar, --multiple permite que se seleccionen varios archivos (de eso va la cosa, ¿no?), y con --separator decimos con qué carácter queremos que separe los archivos. Luego ejecutamos pdftk y a correr.

Podéis comprobar que funciona.

Nuestro minimalista script, sin embargo, contiene un par de errorcitos, que no tienen nada que ver con zenity sino con el buen gusto, a saber: ¿qué pasa si el usuario pulsa el botón de cancelar o cierra la ventana? Lo esperable: zenity pasa una cadena vacía a la salida estándar, y el comando siguiente, sin $FILES, resulta un disparate. Pdftk peta y no hace nada, que es lo que queremos que pase, pero al fin y al cabo es una chapuza. Eso lo podemos arreglar con los exit status, como casi siempre en bash.

El otro problema es muy parecido, y tiene similar solución: ¿qué pasa si pdftk falla al unir los pdf's? El programa no hará nada, y bien está, pero molaría avisar al usuario, ¿no? Pues más de lo mismo: exit status.

La cosa quedaría, por ejemplo, así:

 #!/bin/bash
 FILES=`zenity --title "Seleccione los pdf's
             que desa unir" --file-selection
             --multiple --separator " "` || exit
 pdftk $FILES cat output pdftk.pdf
 if [ "$?" = "0" ]; then
         echo "Se unieron correctamente los pdf's"
 else
         echo "Se produjo un error al unir los pdf's"
 fi

Supongo que en bash hay mil maneras de hacer esto, y que dado mi conocimiento, 990 son mejores, pero bueno, esto funciona.

Bueno, pues nos seguimos llamando del mismo modo, y ya tenemos un script donde cómodamente seleccionamos cómodamente los archivos en un diálogo GNOME precioso. Pero claro, a nuestro ya citado sentido estético le sigue chirriando que sea necesario ejecutar el programa en consola para poder recibir la información.

Ya el avispado lector se habrá percatado de que simplemente cambiando esos horribles echo (los 70 ya acabaron, carajo) por sendos zenity --info --text y zenity --error --text solventamos la papeleta. Pero eso sería muy fácil, y muy poco divertido. Por eso sacaremos a escena la joyita de zenity: la barra de progreso.

Cuando le llamamos con --progress, zenity, en vez de sacar la información por la salida estándar, la recibe por la entrada estándar. Las lineas que empiecen con una cifra, son una indicación de porcentaje. Las que empiecen con #, un mensaje de estado. Las demás, las ignora.

En este caso, no tenemos manera de saber los porcentajes (nosotros llamamos a pdftk y él se apaña), pero el que no se lo crea que ejecute:

 $ (for i in `seq 1 100`;do echo $i;
              sleep 0.1;done)|zenity --progress

Bonito, ¿eh?

Para los casos como este, donde no podemos determinar ese porcentaje, podemos usar --pulsate, que muestra una barra moviéndose sin mojarse.

Así, pues, recapitulando:

 #!/bin/bash
 FILES=`zenity --title "Seleccione los pdf's
            que desea unir" --file-selection
            --multiple --separator " "` || exit
 (
         echo "#Uniendo los pdf's..."
         pdftk $FILES cat output pdftk.pdf
         if [ "$?" = "0" ]; then
                 echo "#Se unieron correctamente
                                       los pdf's"
         else
                 echo "#Se produjo un error al
                                  unir los pdf's"
         fi
 )|zenity --progress --pulsate

...dejando para el lector como ejercicio añadir un diálogo para elegir el nombre del archivo de destino. Que ustedes lo disfruten.