Diálogos con YAD

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

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.
Un diálogo sencillo con YAD

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
Preguntando al usuario

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
Preguntando al usuario

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
Estilo en tus diálogos con YAD

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
Solicitar información con YAD

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
Solicitar información oculta

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
Solicitar información numérica

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
Un diálogo para elegir entre diferentes opciones

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
Un diálogo para elegir entre diferentes opciones con varias columnas

¿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
Seleccionar archivos

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
Seleccionar directorios con YAD

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
Seleccionar fuentes con YAD

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
Selección de colores

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
Barra de progreso con YAD

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
Preguntando por una fecha

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
Formularios

Deja una respuesta

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