lunes, 5 de marzo de 2018

Scripting con Zenity… para newbies (III)

Demos un pasito más en el conocimiento de ventanas (o diálogos) Zenity, que, recuerdo, se pueden ver en este manual (que no se si es oficial, u oficioso).
Hoy voy a meterme una, muy interesante, que es el ‘diálogo de lista’. Este diálogo nos presentará una ventana con una lista de opciones, donde podremos elegir la que queramos… y esa elección dará lugar, normalmente a través de un script, a una acción individualizada para cada opción, que deberá definir el script. En cristiano: 'si eliges esto, haz A. Si eliges esto otro, haz B...' (y así por cada opción que contenga la lista).
Y , como ejemplo práctico, montaré algún script usando estas herramientas.
Pero debo recordar, nuevamente, que esto de hacer scripts, a poco que no sean muy simples, requiere ciertos conocimientos de Programación, que no es asunto menor. Y tener en la cabeza una serie de comandos, y cómo se usan, cosa complicada si no eres profesional y los usas a diario. Como dije anteriormente, siempre estará Google, y algunas web, como por ejemplo ésta, que nos pueden ayudar ‘un poquito’. Porque, preguntando a Google por algún concepto, seguro que se encuentra información o ejemplos prácticos.Y no me enrollo más: al tema...

DIALOGO C- la LISTA (para elegir una opción)
Su formulación es muy sencilla (aunque algo compleja de explicar). Hay que ir incorporando... 
a) la instrucción básica de la lista (y el nombre, o título, que demos a la lista)
zenity --list --title=”...”
b) si acaso la personalización del tamaño de la ventana a crear. Por ejemplo...
--width="355" –height="290" \
c) el tipo de lista que queremos crear: si no ponemos nada se creará la lista estandar, donde la selección de una opción es ‘por desplazamiento arriba-abajo’. Pero se puede elegir otros tipos, en las que la selección se hace con el ratón, y que tienen sus peculiaridades. Entonces habría que añadir...
--radiolist (la selección se haría marcando un círculo. Este tipo de lista solo admite marcar una opción).
--checklist (la selección se haría mediante ‘marcas de verificación’ y en este tipo se pueden marcar varias opciones)
d) las columnas que va a contener, y su encabezado. Un --column=”…” por columna prevista.
--column="Opción a elegir" \
(Y una cuestión de interés: si elegimos el tipo de lista ‘checklist’ o ‘radiolist’ hay que poner por lo menos dos, porque en la primera debe aparecer el argumento TRUE o FALSE (para marcar o desmarcar lo elegido)
e) el texto de las correspondientes opciones: una línea para cada opción, cada espacio de separación se considera una columna, así que hay que meter los textos (de más de una palabra) entre comillas.
Pero todo esto queda mucho más claro con un ejemplo:
zenity --list --title="Qué es lo que quieres hacer" --width="340" --height="200" \
--radiolist \
--column=" " --column="Opción a elegir" \
FALSE "CREAR un nuevo script" \
FALSE "EJECUTAR uno ya creado" \
FALSE "Visitar el Foro Espacio Linux" \
FALSE "Salir"
(propongo, como ejercicio, copiar lo anterior y pegarlo en una consola. Luego se puede hacer la prueba cambiando radiolist por checklist, e incluso borrar esa línea, para ver los tres tipos de lista que he mencionado.

Bien, pues ya tenemos la lista, y sus opciones… y ahora solo queda definir qué tiene que pasar cuando seleccionemos cada una de las opciones de la lista... normalmente para incorporarlo a un script.
Y esto es sencillo:  
  • lo primero, asignaremos una variable al resultado de esta selección. Y esto ya lo vimos el otro día, solo es poner ‘variable=...’ 
  • Y pondremos todo el desarrollo del dialogo zenity de lista que hayamos creado, naturalmente entre paréntesis, o entre `comillas invertidas`. 

Así que, por ejemplo...
DATO=`zenity –list –title… ` (etc, un poco más abajo lo vemos, completo)
Y con esto nos bastaría, en un script, introducir la variable creada, con $variable, para indicar que se tome opción elegida de la lista. Y el script deberá indicar qué es lo que hay hacer con esa opción elegida, ya que la idea es que cada opción lleve a ejecutar una cosa en particular.
Y, como dije, voy a acabar poniendo un ejemplo completo.
(Y, de paso, aprovecho para introducir el uso de dos elementos de los cuales hablé en el primer capítulo de esta serie: las ‘funciones’ (que declararé al principio del script, para luego solo tener que invocarlas), y la orden condicional ‘case’, que es muy interesante, y se usa mucho). 
Sería este: (se trata de una ventana que me pregunta qué quiero hacer, y me da a elegir entre una serie de opciones) 
#!/bin/bash
#FUNCIONES A USAR
function crear ()
{
gedit MODELO_SCRIPT
}

function menuscript ()
{
sh script_ejecutaSCRIPT
}

function blog ()
{
`/usr/bin/firefox http://www.espaciolinux.com/foros/`
}

function salir ()
{
zenity --timeout=2 --info –text="BYE"
exit
}

# VARIABLES DEFINIDAS
DATO=$(zenity --list \
--width="300" --height="200" \
--title="Elige lo que deseas hacer" \
--column="Opción a elegir" \
"CREAR un nuevo script" \
"EJECUTAR uno ya creado" \
"Visitar el Foro Espacio Linux" \
"Salir")
#

# Instrucción, propiamente dicha
case $DATO in
"CREAR un nuevo script")
crear
;;

"EJECUTAR uno ya creado")
menuscript
;;

"Visitar el Foro Espacio Linux" )
foroEL
;;

"Salir")
salir
;;
esac

Como se ve, y esta es la sencilla sintaxis de la orden condicional 'case', se indica que tome lo que se ha seleccionado (case $DATO in) y (condicionante repetido una vez por opción) ‘si en la ventana se ha seleccionado la opción X - y se añade ')'- debes ejecutar la función de nombre Z’. Y se añade ;; para pasar a la siguiente opción.

NOTA FINAL: en este script he puesto algunas cosas que debo explicar:
Una, la orden ‘gedit MODELO_SCRIPT’ que solo dice que se ejecute el editor gedit abriendo el archivo MODELO_SCRIPT , que no es más que un archivo de texto que tengo creado, que contiene el shebang (#!/bin/bash), y así evito tenerlo que escribir siempre.
Otra, la orden `/usr/bin/firefox http://www.espaciolinux.com/foros/` que no es más que una forma de indicar, por consola, que se abra (en este caso) el navegador firefox directamente en una determinada dirección web.
Pero he descubierto un comando interesantísimo, este...
xdg-open XXX 
donde XXX puede ser una dirección web, o la ruta de una carpeta, y que te lo abre en tu aplicación seleccionada como 'por defecto'. Por ejemplo, escribiendo en consola
xdg-open http://comoserdebianitaynomorirenelintento.blogspot.com.es/
me abriría, en firefox, este blog y escribiendo
xdg-open ~/Vídeos
me abriría (en mi caso) Nemo en el directorio (carpeta) Vídeos, donde podría elegir y ejecutar cualquier archivo. Así que este comando es una 'adquisición interesante' 
Y una tercera, el script (que he llamado, en un alarde de imaginación script_ejecutaSCRIPT y que es el que ordena ejecutar la función ‘menuscript’. Este script, ya creado, utiliza un nuevo dialogo Zenity (el de selección y ejecución de archivos)… pero dejaré su explicación para otra entrada del Blog, que esta ya se está alargando.

Pero no quiero acabar sin esta advertencia: "las cosas de programación son muy estrictas y, por lo tanto, hay que fijarse mucho en escribir correctamente todos los signos, sobre todo el doble guión '--' ya que muchos correctores lo convierten, automáticamente en 'guión largo', las comillas, por supuesto los comandos… porque el más mínimo error, o inexactitud, hace fallar el script".

No hay comentarios:

Publicar un comentario