Interfaces visuales

Abeille

El programa Abeille lo usaremos para la creación de las interfaces visuales. En este programa podremos establecer el aspecto de las ventanas, nombres, etc. Haciendo uso de la librería FormPanel podremos cargarlo fácilmente en un script, y sacarle el máximo partido.

Abriremos el Abeille desde el botón abeille situado en la barra de Herramientas del Scripting Composer.

Aparece en la imagen el programa Abeille con el ejemplo de coordenadas.xml abierto:

../_images/abeille.png

Ejemplo de uso

Descargar el ejemplo explicado a continuación: CentrarCoordenadas

../_images/abeille_1.png

Para crear una interfaz visual crearemos un nuevo formulario en Abeille.

../_images/abeille_2.png

Crearemos una nueva etiqueta label.

../_images/abeille_3.png

Presionamos el lugar en el que queremos situarlo en la cuadrícula.

../_images/abeille_4.png

Ahora podemos dotarle de nombre a la etiqueta. Este nombre es con el que accederemos al componente desde nuestro script. En este caso, le daremos de nombre lblName.

../_images/abeille_5.png

Cambiamos el texto que contendrá esta etiqueta a: Coordenadas

../_images/abeille_6.png

Se puede ampliar el rango de ocupación de esta casilla en el formulario para ajustarlo mejor al interfaz que queramos.

../_images/abeille_7.png

Repetimos el proceso para crear dos etiquetas más lblX y lblY.

../_images/abeille_8.png

Ahora crearemos un text field o campo de texto. Este campo permitirá tanto mostrar valores, como permitir al usuario introducir unos valores.

../_images/abeille_9.png

Repetimos el mismo proceso anterior para la creación de dos text fields denominados txtX y txtY. Además también hemos utilizando la herramienta explicada anterior Increase column span, ampliamos el rango de ocupación de estas cajas de texto.

../_images/abeille_10.png

También añadiremos un botón que nos permitirá cerrar la aplicación.

../_images/abeille_11.png

Le otorgaremos de nombre de componente btnClose y de texto en el componente Cerrar.

../_images/abeille_12.png

Una de las ventajas de dotarle a este componente el nombre de btnClose, es que la clase FormPanel que explicamos después, ya dotará automáticamente a este botón la capacidad de cerrar la aplicación.

Una vez acabada la interfaz podemos eliminar las columnas restantes de la cuadrícula.

../_images/abeille_13.png

Y filas restantes.

../_images/abeille_14.png

Una vez tenemos la interfaz preparada, la guardamos.

../_images/abeille_15.png

Guardamos el formulario en formato .xml donde esté o vayamos a crear nuestro script.

../_images/abeille_guardado.png

Ya estaría listo la creación de nuestra interfaz para ser usada desde scripting.

En cualquier momento podremos realizar cambios en este interfaz. Por ejemplo, hemos decidido ampliar la funcionalidad de nuestro script, y en este caso necesitamos añadir un botón nuevo de Centrar, de nombre btnCenter. Solo tendremos que abrir la interfaz con Abeille, modificarla, y guardarla.

../_images/abeille_17.png

Uso de FormPanel

Para la creación de script visuales nos apoyaremos en la clase FormPanel contenida en gvsig.libs.formpanel. Crearemos una clase nueva que contendrá la funcionalidad de nuestro script y extenderemos desde FormPanel.

Primero vamos a crear una carpeta nueva en la que meter nuestro ejemplo.

../_images/abeille_script_1.png

Después, un script en esta carpeta denominado centrar_coordenadas.py.

../_images/abeille_script_2.png

Guardaremos el formulario explicado en el apartado anterior en esta carpeta.

Ejemplo básico de la carga de una interfaz en un script:

from gvsig import *
from gvsig.libs.formpanel import FormPanel

class Panel(FormPanel):
        def __init__(self):
                FormPanel.__init__(self, os.path.join(os.path.dirname(__file__), "ui_basic.xml"))

def main(*args):
        l = Panel()
        l.showTool("Visual")
        pass

Nos vamos a basar en esta plantilla para la creación de nuestro script de centrar_coordenadas.py.

Por defecto, en FormPanel viene establecido un método btnClose_click, que servirá para cerrar este script. De esta forma solo tenemos que establecer en Abeille un botón denominado btnClose y ya tendremos un botón programado para el cierre de la aplicación.

Tenemos nuestro módulo listo para ser programado. Tenemos una carpeta que contiene el script y la interfaz que utilizará.

../_images/abeille_script_3.png

Seguimos desarrollando las funcionalidades de FormPanel. Una de ellas es el auto enlace con eventos que se podrucen en los elementos de la interfaz visual. Por ejemplo, si tenemos (en nuestro ejemplo) un botón denominado btnCenter y queremos que ciera acción cuando lo presionemos, tan solo deberemos de crear un método en nuestra clase que contenga el nombre del elemento “btnCenter” terminado con la acción que queremos coger “_click”.

De esta forma no tenemos que preocuparnos de eventos, ya que la propia librería FormPanel nos lo gestionará:

# encoding: utf-8

from gvsig import *
from gvsig.libs.formpanel import FormPanel
import os

class CenterCoordinates(FormPanel):
    def __init__(self):
        FormPanel.__init__(self,
                            os.path.join(os.path.dirname(__file__),
                                        "centrar_coordenadas.xml")
                            )

    def btnCenter_click(self, *args):
        print "Clicked!"

    def btnClose_click(self,*args):
        self.hide()

def main(*args):
    l = CenterCoordinates()
    l.showTool("Centrar Coordenadas")
    pass

Al ejecutar el script nos aparecerá una interfaz similar a esta:

../_images/abeille_script_4.png

Y lo que ocurre al presionar el botón Centrar, tal y como hemos programado en el método btnCenter_click, mostará por consola la palabra Clicked!.

../_images/abeille_script_5.png

Si presionamos el botón de Cerrar se cerrará la aplicación, haciendo uso de un método ya implementado en la clase FormPanel, sin necesidad de programarlo nosotros mismos. En el caso de que quisieramos encargarnos nosotros de esta función, solo tendríamos que sobreescribir el método en nuestra clase, o darle otro nombre al componente de cerrar la aplicación.

Por ejemplo, también podríamos modificar el texto de etiquetas u otros valores de una forma similar a:

self.txtX.setText("Clicked!")
self.txtY.setText("Clicked!")
../_images/abeille_script_7.png

Como hemos visto, para acceder a nuestros componentes en el interfaz, lo haremos mediante self. + nombre del componente. Por ejemplo, vamos a implementar en el botón Centrar, que muestre por consola las coordenadas que el usuario escriba en las cajas de texto.

Para ello haremos referencia a los componentes de cajas de texto txtX y txtY que hemos programado en la interfaz:

def btnCenter_click(self, *args):
    x = self.txtX.getText()
    y = self.txtY.getText()
    print "X: ", x, " Y: ", y

Aquí vemos como quedaría:

../_images/abeille_script_6.png

Ahora, para cumplir el propósito del script, centrar la vista en unas coordenadas que le establezcamos, solo tenemos que modificar el método btnCenter_click por algo similar a lo siguiente:

# encoding: utf-8

from gvsig import *
from gvsig import geom
from gvsig.libs.formpanel import FormPanel
import os

class CenterCoordinates(FormPanel):
    def __init__(self):
        FormPanel.__init__(self,
                            os.path.join(os.path.dirname(__file__),
                                        "centrar_coordenadas.xml")
                            )

    def btnCenter_click(self, *args):
        x = float(self.txtX.getText())
        y = float(self.txtY.getText())
        point = geom.createPoint2D(x, y)
        currentView().centerView(point.getEnvelope())

    def btnClose_click(self,*args):
        self.hide()

def main(*args):
    l = CenterCoordinates()
    l.showTool("Centrar Coordenadas")
    pass

Dando como resultado algo así:

../_images/abeille_script_8.png

Vemos como ha centrado la Vista en las coordenadas que hemos indicado en las cajas de texto.

Eventos autoregistrados

Hemos comentado que FormPanel se encarga de enlazar los eventos de los componentes con nuestro script, pero no todos los eventos posibles de cada elemento del interfaz están implementados dentro de FormPanel (pero si necesitas alguno de ellos se podrían añadir o implementar en tu propia clase). Aquí mostramos algunos de estos eventos haciendo referencia a spinners, combobox, etc:

def btnCalcular_click(self, *args):
        self.txtField.setText("Clicked!")
        print "Clicked!"

def chb1_change(self, *args):
        print "Check box!"

def rb1_change(self, *args):
        print "Radio button!"

def cmb1_change(self, *args):
        print "Combobox!"

def sld1_focusGained(self, *args):
        print "Slider!", sld1.getValue()

def spn1_change(self, *args):
        print "Spinner!"

def btnClose_click(self,*args):
        self.hide()