Este es uno de los capítulos del tutorial Diálogos para scripts. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.
Dentro de las herramientas que tienes disponibles para mostrar cuadros de diálogo, probablemente YAD sea la mas completa de todas, o la que mas posibilidades te ofrece. Pero esto es algo que tendrás que juzgar por ti mismo, y comprobar si definitivamente se adapta a tus necesidades.
YAD, que no es mas que el acrónimo de Yet Another Dialog es un proyecto desarrollado y mantenido por Victor Ananjevjsy. Una herramienta con una gran cantidad de opciones que te va a permitir crear diálogos para tus scripts de forma similar a la que viste con otras opciones, pero con una integración total en los entornos de escritorio tipo GNOME, MATE, Cinnamon, etc, dado que utiliza las librerías GTK+.
Esto no quita a que lo puedas utilizar en otros entornos de escritorio. Sin embargo, el uso en entornos de escritorio de los mencionados anteriormente, es óptimo.
Diálogos con YAD, Yet Another Dialog
Tal y como lo describe el propio autor de esta herramienta, YAD, o Yet Another Dialog, es una aplicación que te permite mostrar cuadros de diálogo GTK+ desde la línea de comandos o desde tus propios scripts. Indicar que YAD depende únicamente de GTK+, y que la versión mínima necesaria es la 3.22.0.
YAD devuelve la selección del usuario, ya sea mediante un código de retorno o utilizando la salida estándar.
Indicar que esta aplicación utiliza la sintaxis habitual, utilizando los nombres de las opciones largas comenzando con dos guiones.
Instalación de YAD
Como te puedes imaginar, YAD, se encuentra disponible en la mayoría de las distribuciones, con lo que su instalación, es tan sencilla, como ejecutar la siguiente instrucción en un termina para el caso de Ubuntu, Debian, o derivados,
sudo apt install yad
O en el caso de Red Hat o CentOS,
sudo yum install yad
Opciones generales de YAD
Una de las características que mas me ha llamado la atención de esta herramienta, es la cantidad de opciones generales que son comunes a todos los cuadros de diálogo que puedes mostrar.
En este caso, te recomiendo encarecidamente que le des un vistazo a todas esas opciones generales. En los ejemplos utilizaré algunas de ellas, pero no todas. De ahí mi recomendación de que le des un vistazo al manual de uso.
Un diálogo sencillo
Como he venido haciendo en con las otras herramientas que has podido ver en este tutorial, lo primero es mostrar un cuadro de diálogo sencillo, en el que simplemente se muestra un texto, y que pulsando la tecla de escapar, se sale del mismo.
Sin embargo, he añadido mas opciones para comentarlas y que veas la versatilidad de esta herramienta, y te puedas hacer una idea de todo lo que puedes hacer con ella.
yad --title="https://atareao.es" \
--image="stop" \
--window-icon="stop" \
--center \
--width=350 \
--timeout=5 \
--no-buttons \
--timeout-indicator=bottom \
--text="Este es el <b>mensaje</b> que se muestra" \
--text-align=center
Te comento las opciones,
--image
te permite poner una imagen en el cuadro de diálogo. Dado que no existen diferentes tipos de diálogo tipo información, aviso, error, esta es una buena solución para implementarlo--window-icon
sirve para definir un icono para el cuadro de diálogo.--center
es la opción para centrar el cuadro de diálogo en la pantalla en la que se encuentra el foco.--timeout
define un tiempo máximo, una vez superado cierra el cuadro de diálogo.--timeout-indicator
muestra una barra de progreso con el tiempo restante.--no-buttons
quita los botones que aparecen por defecto.
Como decía anteriormente, estas son algunas de las opciones que tienes para personalizar los cuadros de diálogo, pero hay muchas mas. En los siguientes ejemplos te iré mostrando algunas mas, pero de cualquier forma, te insisto en que le des una revisión a la documentación de YAD.
Preguntando al usuario
Si te fijas en el ejemplo anterior, lo que he hecho ha sido impedir que se muestren los botones, con la opción --no-buttons
, con lo que para este nuevo ejemplo, tienes que quitar esta opción, de forma que tendrá un aspecto como el que te muestro a continuación,
yad --title="https://atareao.es" \
--center \
--width=250 \
--height=80 \
--text-align=center \
--text="¿Quieres continuar?"
ans=$?
if [ $ans -eq 0 ]
then
echo "Si que quiere continuar"
else
echo "No quiere continuar"
fi
Claro que así, tal y como se muestra, queda un poco extraño, en tanto en cuanto, preguntas si quiere continuar y los botones muestra Aceptar o Cancelar. En este sentido, sería mucho mas interesante que mostrara Si y No. Pues no te tienes que preocupar, porque esta opción, también te la ofrece YAD. Para hacer esto tienes que utilizar la opción --button=BUTTON:ID
, donde BUTTON
puede ser un elemento predefinido como gtk-close
o gtk-ok
o un texto con la siguiente definición LABEL[!ICON[!TOOLTIP]]
, done el !
se utiliza de separador. Así, es posible modificar el ejemplo anterior, en el sentido indicado, de forma que tendrá el siguiente aspecto,
yad --title="https://atareao.es" \
--center \
--width=250 \
--height=80 \
--text-align=center \
--text="¿Quieres continuar?" \
--button=Si:0 \
--button=No:1
ans=$?
if [ $ans -eq 0 ]
then
echo "Si que quiere continuar"
else
echo "No quiere continuar"
fi
Estilo en tus diálogos
De nuevo, al igual que sucedía con Zenity, tal y como viste en el capítulo anterior del tutorial, YAD también te ofrece la posibilidad de que le des estilo al texto que aparece en los cuadros de diálogo. Para ello tienes que utilizar el lenguaje de marcado Pango. Siguiendo con el ejemplo anterior, en este ejemplo, que puedes ver a continuación, he añadido un texto con estilo, y además he añadido una imagen, para que tenga un aspecto mas profesional,
texto="¿<span weight=\"bold\" foreground=\"green\">Seguro</span> que quieres?"
yad --title="https://atareao.es" \
--image=gtk-info \
--width=250 \
--height=80 \
--button=Continuar:0 \
--button=Abandonar:1 \
--center \
--text-align=center \
--text="${texto}"
ans=$?
if [ $ans -eq 0 ]
then
echo "Si que quiere continuar"
else
echo "No quiere continuar"
fi
Solicitar información
Por supuesto no todo se resume en preguntas del tipo Si/No, también es posible, que quieras o necesites que el usuario te facilite algún tipo de información, como puede ser su nombre o cualquier cosa por el estilo. En este caso, tienes que utilizar un diálogo del tipo --entry
, tal y como puedes ver en el siguiente ejemplo,
nombre=$(yad --entry \
--title="https://atareao.es" \
--image=gtk-info \
--width=250 \
--height=80 \
--width=250 \
--button=Aceptar:0 \
--button="No te lo quiero decir":1 \
--center \
--text-align=center \
--text="¿Cual es tu nombre?")
ans=$?
if [ $ans -eq 0 ]
then
echo "Su nombre es: ${nombre}"
else
echo "No me quiere decir su nombre"
fi
En este caso, puedes hacer que este cuadro de diálogo también te sirva para que el usuario introduzca una contraseña. Para esto, simplemente tienes que ocultar el texto utilizando la opción --hide-text
, tal y como puedes ver en el siguiente ejemplo,
passwd=$(yad --entry \
--title="https://atareao.es" \
--image=gtk-info \
--width=250 \
--height=80 \
--width=250 \
--button=Aceptar:0 \
--button="No te lo quiero decir":1 \
--center \
--hide-text \
--text-align=center \
--text="¿Cual es la contraseña?")
ans=$?
if [ $ans -eq 0 ]
then
echo "Tu contraseña es: ${passwd}"
else
echo "No me quiere decir su contraseña"
fi
Otra opción interesante que te ofrece YAD, también en el caso de diálogos del tipo --entry
, es la posibilidad de introducir números. En este caso, tienes que utilizar la opción --numeric
. Por ejemplo,
edad=$(yad --entry \
--title="https://atareao.es" \
--image=gtk-info \
--width=250 \
--height=80 \
--width=250 \
--button=Aceptar:0 \
--button="No te lo quiero decir":1 \
--center \
--numeric \
--text-align=center \
--text="Dime tu edad")
ans=$?
if [ $ans -eq 0 ]
then
echo "Tu edad es: ${edad}"
else
echo "No me quiere decir su edad"
fi
Un diálogo para elegir entre diferentes opciones
En el caso de quieras dar al usuario la opción de elegir entre diferentes opciones, tienes el cuadro de diálogo tipo --list
. En este caso, este tipo de cuadro de diálogo también tiene innumerables opciones, con lo que vale la pena que le des un vistazo a la ayuda para exprimir al máximo este tipo de cuadro de diálogo. Por ejemplo,
componente=$(yad --list \
--title="https://atareao.es" \
--height=200 \
--width=100 \
--button=Aceptar:0 \
--button=Cancelar:1 \
--center \
--text="Selecciona un componente para tu pizza:" \
--radiolist \
--column="" \
--column="Componente" \
1 "Jamón" 2 "Queso" 3 "Huevo")
ans=$?
if [ $ans -eq 0 ]
then
echo "Has elegido: ${componente}"
else
echo "No has elegido ningún componente"
fi
En este ejemplo que acabas de ver, solo te permite elegir una opción, pero ¿como podrías hacer para elegir varias opciones?. En ese caso en lugar de utilizar la opción --radiolist
tienes que utilizar la opción --checklist
, como puedes ver en el siguiente ejemplo,
componente=$(yad --list \
--title="https://atareao.es" \
--height=200 \
--width=250 \
--center \
--button=Acepter:0 \
--button=Cancelar:1 \
--text="Selecciona un componente para tu pizza:" \
--checklist \
--column="" \
--column="Componente" \
--column="Calorías" \
1 "Jamón" 100 2 "Queso" 150 3 "Huevo" 125)
ans=$?
if [ $ans -eq 0 ]
then
echo "Has elegido: ${componente}"
else
echo "No has elegido ningún componente"
fi
¿Como seleccionar archivos?
En el caso de que quieras seleccionar archivos tienes que utilizar el cuadro de diálogo tipo --file
. En este caso, tienes las mismas opciones que Zenity, para poder seleccionar varios archivos de forma simultánea, definir patrones de filtrado o confirmar en el caso de que el archivo exista. Por ejemplo,
archivo=$(yad --file \
--title="https://atareao.es" \
--height=200 \
--width=100 \
--center \
--text="Selecciona un archivo:" \
--file-filter="scripts | *.sh")
ans=$?
if [ $ans -eq 0 ]
then
echo "Has elegido este archivo: ${archivo}"
else
echo "No has elegido ningún archivo"
fi
Y de nuevo, de la misma forma que con Zenity, en el caso de que lo que quieras es que el usuario seleccione un directorio, tendrás que utilizar la opción --directory
, tal y como puedes ver en el siguiente ejemplo,
directorio=$(yad --file \
--title="https://atareao.es" \
--center \
--height=200 \
--width=100 \
--text="Selecciona un directorio:" \
--directory)
ans=$?
if [ $ans -eq 0 ]
then
echo "Has elegido este directorio: ${directorio}"
else
echo "No has elegido ningún directorio"
fi
Seleccionando tipografías
Un cuadro de diálogo, que si no recuerdo mal, hasta el momento no habías visto, es uno para seleccionar una tipografía. En este caso YAD, te permite seleccionar tipografías utilizando el cuadro de diálogo del tipo --font
. Dentro de las opciones que te permite este cuadro de diálogo, tienes la de previsualización --preview
, donde tu puedes elegir el texto que quieres que se muestre al seleccionar una fuente. Por ejemplo,
font=$(yad --font \
--title="https://atareao.es" \
--center \
--height=200 \
--width=100 \
--preview="Tres tristes tigres comían trigo en un trigal" \
--text="Selecciona una fuente:")
ans=$?
if [ $ans -eq 0 ]
then
echo "Has elegido esta tipografía: ${font}"
else
echo "No has elegido ninguna tipografía"
fi
Selección de colores
Otro tipo de cuadros de diálogo que te ofrece YAD es el de selección de colores. Se trata de un sencillo cuadro de diálogo que tiene algunas opciones adicionales a las que has podido ver en otras variantes.
--init-color
te permite definir un color inicial--gtk-palette
mostrará la paleta del sistema dentro del cuadro de diálogo--alpha
añade opacidad a la salida--palette
muestra una paleta de un archivo.
Así por ejemplo,
color=$(yad --color \
--title="https://atareao.es" \
--center \
--height=200 \
--width=100 \
--alpha \
--gtk-palette \
--expand-palette \
--palete=/etc/X11/rgb.txt \
--text="Selecciona un color:")
ans=$?
if [ $ans -eq 0 ]
then
echo "Has elegido este color: ${color}"
else
echo "No has elegido ningún color"
fi
Barra de progreso
En este caso YAD tiene dos cuadros de diálogo para las barras de progreso. El típico que has podido ver hasta el momento, y una adicional que permite mostrar varias barras de progreso en un mismo diálogo.
De entre las diferentes opciones, tengo que destacar algunas un tanto diferentes, como son,
--auto-close
que cierra el diálogo cuando se alcanza el 100%--rtl
cambia la dirección de la barra d progreso--pulsate
utiliza una barra de progreso del tipo pulsante.--auto-kill
mata el proceso padre en el caso de que pulses el botón cancelar.
Por ejemplo,
(
sleep 1
echo "10"
echo "# Paso 1"; sleep 1
echo "20"
echo "# Paso 2"; sleep 1
echo "30"
echo "# Paso 3"; sleep 1
echo "50"
echo "# Paso 4"; sleep 1
echo "70"
echo "# Paso 5"; sleep 1
echo "90"
echo "# Terminado"
echo "100"
) |
yad --progress \
--title="https://atareao.es" \
--progress-text="Iniciando el proceso" \
--center \
--width=200 \
--height=100 \
--percentage=0 \
--auto-kill \
--auto-close
Preguntando por una fecha
En el caso de que necesites preguntar al usuario por una fecha tendrás que utilizar el diálogo --calendar
. Por ejemplo,
fecha=$(yad --calendar \
--center \
--width=200 \
--height=150 \
--show-weeks \
--title="https://atareao.es" \
--text="Elige una fecha")
ans=$?
if [ $ans -eq 0 ]
then
echo "Has elegido este fecha: ${fecha}"
else
echo "No has elegido ninguna fecha"
fi
Formularios
Probablemente donde mas posibilidades tenga YAD frente a las otras herramientas que has visto hasta el momento, son los formularios. Aquí tienes todo un mar de posibilidades, pudiendo añadir tantos campos como necesites, para así ser mas conciso a la hora de preguntar al usuario.
Tienes campos ocultos, de solo lectura, numéricos,del tipo checkbox, combos, selección de archivo y directorio, selección de fuente, fecha, color, etiquetas, multilínea… En fin, vendría a ser como todos los cuadros de diálogo que has visto hasta el momento, pero resumidos en uno solo.
Para añadir campos al formulario se utiliza con la opción --field
, seguida por la etiqueta del campo correspondiente, y el tipo de campo que es. Por ejemplo, en el caso de que sea un campo del tipo oculto, para una contraseña, tendría un aspecto como --filed="Contraseña":H
.
Un ejemplo práctico de un formulario,
datos=$(yad --form \
--title="https://atareao.es" \
--text="Introduce los siguientes datos" \
--center \
--field="Nombre" \
--field="Apellido" \
--field="Contraseña":H \
--field="Edad":NUM \
--field="Fecha de nacimiento":DT)
ans=$?
if [ $ans -eq 0 ]
then
echo "Has introducido los siguientes datos:"
IFS="|" read -r -a array <<< "$datos"
echo Nombre: "${array[0]}"
echo Apellido: "${array[1]}"
echo Contraseña: "${array[2]}"
echo Edad: "${array[3]}"
echo Fecha de nacimiento: "${array[4]}"
else
echo "Has cancelando"
fi