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.
Si eres de los que utilizan como escritorio KDE Plasma, el capítulo del tutorial de hoy sobre creación de diálogos para tus scripts te va a venir perfecto, porque te mostraré como crear diálogos para KDE. Esto no quita, que si utilizas cualquier otro entorno de escritorio, esto no te vaya a venir también a las mil maravillas. Pero, lo que no hay lugar a dudas, es que esta solución se integrará perfectamente con tu entorno de escritorio. En este caso, me centro en como crear diálogos para tus scripts con kdialog.
Creo, que esta solución, está a la altura de la que ofrece dialog, y que comenté en el capítulo sobre dialog para crear diálogos en el terminal. Evidentemente, esta solución con kdialog, tiene la ventaja que es ideal para el interfaz gráfico, con lo que puede ser la solución perfecta para el caso de que quieras proveer a tu script de un sencillo interfaz, para que los usuarios no tengan que lidiar con el terminal.
Diálogos para KDE con kdialog
Si ya conoces dialog, o has seguido ese capítulo del tutorial que te he comentado anteriormente, es que la sintaxis es prácticamente la misma, con lo que acostumbrarte a esta nueva herramienta va a ser algo relativamente sencillo. Pero en este caso, los diálogos se integrarán perfectamente con tu escritorio, porque son diálogos para KDE. De cualquier forma, si no conoces dialog
, tampoco te tienes que preocupar, porque como verás a continuación es una herramienta realmente sencilla de utilizar.
Instalación de kdialog
Al igual que hemos hecho en otros capítulos de este tutorial, lo primero que tienes que hacer es instalar esta herramienta. En el caso de que te encuentres en Debian, Ubuntu, Linux Mint, etc, tan solo tienes que ejecutar la siguiente instrucción en un terminal,
sudo apt install kdialog
En el caso de que quieras instalar en un RedHat o CentOS, tendrás que ejecutar la siguiente instrucción,
yum install kdialog
Indicarte, que al instalarlo en Ubuntu, me he llevado la sorpresa de la cantidad de paquetes que ha tenido que instalar. Entiendo que si tu entorno de escritorio es KDE Plasma, estos ya estarán instalados por defecto. Pero si no lo es, tampoco pasa nada. Eso si, esto es ideal para crear diálogos para KDE.
Un diálogo sencillo
De nuevo, siguiendo la estructura de capítulos anteriores de este tutorial, voy a repetir los diferentes ejemplos para que veas que, tanto la sintaxis como el resultado es tremendamente similar. Así, empiezo con un diálogo sencillo,
kdialog --title "https://atareao.es" \
--msgbox "Este es el mensaje que se muestra"
Indicarte que también puedes mostrarte, el mismo mensaje pero utilizando un icono de advertencia o error, en lugar de un icono de advertencia como has visto en el ejemplo anterior.
kdialog --title "https://atareao.es" \
--sorry "Este es el mensaje que se muestra"
kdialog --title "https://atareao.es" \
--error "Este es el mensaje que se muestra"
Preguntando al usuario
Ahora, si quieres interactuar con el usuario, tendrás que preguntar, y darle algunas opciones de respuesta. En este caso, es de nuevo, tremendamente sencillo. Tan solo tienes que utilizar un script como el que te muestro a continuación,
kdialog --title "https://atareao.es" \
--yesno "¿Quiere continuar?" 0 0
ans=$?
if [ $ans -eq 0 ]
then
echo "Quiere continuar"
else
echo "No quiere continuar"
fi
Indicarte que el si
se corresponde con el 0
, mientras qui el no
se corresponderé con el uno. De nuevo, al igual que viste con los cuadros de diálogos sencillos, también tienes la opción de utilizar iconos. Estos iconos te servirán para dar mayor información al usuario, indicando el tipo de pregunta que estás formulando. Así, para el caso de que quieras advertir, tienes que utilizar la opción --wanringyesno
. Pero, también tienes otras opciones, como por ejemplo,
--warningcontinuecancel
en lugar de mostrar los botones deyes
yno
, te mostrará los de cancelar o continuar.--warninyesnocancel
en este caso tendrías los botones deyes
,no
ycancel
.--yesnocancel
aquí no se muestra el icono dewarning
.
kdialog --title "https://atareao.es" \
--warningyesnocancel "¿Quiere continuar?"
ans=$?
echo $ans
if [ $ans -eq 0 ]
then
echo "Ha pulsado el botón Si"
elif [ $ans -eq 1 ]
then
echo "Ha pulsado el botón No"
else
echo "Ha pulsado el botón cancelar"
fi
Un diálogo para introducir texto
Ahora ya hemos conseguido que el usuario responda a nuestras preguntas. Sin embargo, seguro que llega un punto donde queremos que el usuario nos aporte algún tipo de información. Es decir, queremos obtener un texto del usuario. En este caso podemos utilizar el cuadro de diálogo del tipo --inputbox
, tal y como puedes ver en el siguiente ejemplo,
respuesta=$(kdialog --title "https://atareao.es" \
--inputbox "¿Cual es tu nombre?" Lorenzo)
echo $respuesta
Decirte que si pulsas el botón aceptar
la variable $respuesta
, tomará el valor que has introducido, mientras que si pulsas el botón cancelar
no te devolverá nada.
En el caso de que lo que quieras es que el usuario introduzca una contraseña, tienes que utilizar la opción --password
, tal y como puedes ver en el siguiente ejemplo,
respuesta=$(kdialog --title "https://atareao.es" \
--password "¿Cual es la contraseña?")
echo $respuesta
Seleccionar entre diferentes opciones
Por supuesto, no todo se trata pedir al usuario que introduzca un texto o una contraseña. Es mucho mas fácil obtener una respuesta del usuario si le ofreces que elija entre distintas opciones, mas que si tiene que introducir el texto. En este caso, tienes diferentes opciones. La primera de las opciones te permite elegir una única opción de las diferentes que te muestra. Esto lo puedes hacer con el cuadro de diálogo tipo --radiolist
, como puedes ver en el siguiente ejemplo,
respuesta=$(kdialog --title "https://atareao.es" \
--radiolist "Selecciona una opción" \
opcion1 queso on\
opcion2 aceitunas off\
opcion3 huevo off)
echo $respuesta
En el caso de quieras que el usuario seleccione varias opciones en lugar de una única opción, tienes que utilizar el cuadro de diálogo --checklist
, tal y como puedes ver a continuación,
respuesta=$(kdialog --title "https://atareao.es" \
--radiolist "Selecciona una opción" \
opcion1 queso on\
opcion2 aceitunas off\
opcion3 huevo off)
echo $respuesta
Pero si no tienes bastante con estas dos soluciones, también puedes utilizar un cuadro de diálogo tipo combo
como el que te muestro a continuación,
respuesta=$(kdialog --combobox "https://atareao.es" \
azul amarillo rojo "rosa palo")
ans=$?
if [ $ans -eq 0 ]
then
echo "La opción seleccionada ha sido $respuesta"
else
echo "No ha elegido ninguna opción"
fi
Fíjate que en este caso utilizo el if
para saber si el usuario pulsó el botón de aceptar o el de cancelar. Por otro lado, fíjate como he indicado los colores. Para incluir el rosa palo, lo he puesto entre comillas. De otra manera, habría puesto 5 colores en lugar de cuatro, de los cuales, los dos últimos habrían sido el rosa y el palo.
Seleccionando archivos
Otra de las necesidades con las que te puedes encontrar cuando estás interactuando con un usuario de tu script, es la necesidad de que seleccione un archivo. En este caso, kdialog
te ofrece la posibilidad de utilizar dos tipos de diálogo --getopenfilename
y --getsavefilename
. El primero para abrir un archivo existente, mientras que el segundo es para guardar un archivo. Un ejemplo del primer caso sería el siguiente,
respuesta=$(kdialog --title "https://atareao.es" \
--getopenfilename /home/ *.py "Selecciona un archivo")
echo $respuesta
Este cuadro de diálogo opcionalmente te permite que le indiques el directorio de partida así como si quieres un filtro. En el ejemplo anterior he puesto, el directorio /home/
y para que seleccione únicamente archivos con extensión .py
. Pero podría no haber puesto ninguna de estas opciones, como en el caso del siguiente ejemplo, para guardar un archivo,
respuesta=$(kdialog --title "https://atareao.es" \
--getsavefilename "Selecciona un archivo")
echo $respuesta
En el caso de que lo que quieras es que el usuario seleccione un directorio, puedes utilizar el cuadro de diálogo --getexistingdirectory
.
Como curiosidad, kdialog
también te ofrece la posibilidad de seleccionar los archivos con formato uri
. Es decir, el archivo /home/lorenzo/archivo.txt
, se seleccionaría con el formato file:///home/lorenzo/archivo.txt
. Esto lo puedes hacer con los cuadros de diálogo --getopenurl
y --getsaveurl
.
Por otro lado, en los cuadros de diálogo del tipo --getopenfilename
y --getopenurl
, puedes dar al usuario la opción de que seleccione varios archivos, en lugar de que seleccione uno solo. Para esto, tienes que utilizar la opción --multiple
.
Seleccionando un color
¿Y si lo que quieres es que el usuario seleccione un color?. En este caso tienes un cuadro de diálogo específico para ello, --getcolor
. En este caso, la respuesta te lo da en forma hexadecimal, es decir, del tipo #ff0000
, por ejemplo. Un ejemplo de esto, lo puedes ver a continuación,
respuesta=$(kdialog --title "https://atareao.es" \
--getcolor)
echo $respuesta
Pero, ¿y si quisieras mostrar el cuadro de diálogo con una color ya preseleccionado? Por hacerle mas fácil la vida al usuario o por la razón que tu quieras. En este caso, tienes que elegir la opción --default
. Esta opción no solo la puedes utilizar aquí también la puedes utilizar en el diálogo tipo --menu
. Para que veas un ejemplo de esto,
respuesta=$(kdialog --title "https://atareao.es" \
--getcolor --default "#00ff00")
echo $respuesta
Una barra de progreso con muchas posibilidades
Tal y como te mostré en la primera de las opciones que vimos en este tutorial sobre diálogos, con kdialog
también tienes la posibilidad de mostrar una barra de progreso, pero en este caso es algo mas sofisticada, en tanto en cuanto te devuelve una referencia a dbus
para la comunicación. Con esto ya se puede hacer muchas cosas muy interesante, además de simplemente utilizar un timer
. Por ejemplo,
respuesta=$(kdialog --progressbar "Ejemplo" 5)
echo $respuesta
for i in $(seq 0 5)
do
sleep 1
echo $i
dbus-send --print-reply --dest=$respuesta org.freedesktop.DBus.Properties.Set string:org.kde.kdialog.ProgressDialog string:value variant:int32:$i
done
dbus-send --print-reply --dest=$respuesta org.kde.kdialog.ProgressDialog.close
La última línea es la que se encarga de cerrar el cuadro de diálogo cuando termine la cuenta progresiva.
Seleccionar un entero
Si lo que quieres es que el usuario mediante un cuadro de diálogo seleccione un valor entero, puedes utilizar el cuadro de diálogo tipo --slider
, tal y como el que puedes ver a continuación,
respuesta=$(kdialog --slider "Selecciona un valor entre 1 y 10" \
1 10 2)
ans=$?
if [ $ans -eq 0 ]
then
echo "No ha elegido ningún valor"
else
echo "El valor elegido es $respuesta"
fi
Seleccionando fechas
Si lo que quieres es que el usuario seleccione una fecha, puedes utilizar en ese caso el cuadro de diálogo tipo --calendar
, como el ejemplo que te muestro a continuación,
respuesta=$(kdialog --calendar "Elige una fecha señalada")
ans=$?
if [ $ans -eq 0 ]
then
echo "No ha elegido ninguna fecha"
else
echo "La fecha seleccionada ha sido $respuesta"
fi
Conclusión
Como puedes ver, con kdialog
, el resultado está mucho mas consolidado que con las opciones que has visto anteriormente. Sobre todo quieres mostrar diálogos para KDE, en cuyo caso esta opción se debería integrar perfectamente. En el caso de GNOME, lo cierto es que el resultado no es tan espectacular. Sin embargo, lo que está claro es que te da un gran abanico de posibilidades.
Desde luego, de las opciones que has podido ver, sin lugar a dudas, la que mas me ha llamado la atención, y por supuesto, la que mas me ha gustado es la barra de progreso, por la facilidad que te ofrece a la hora de integrarse con otros procesos. La verdad es que me ha gustado mucho.
Más información,