viernes, 21 de junio de 2013

Eventos: Manejadores de usuario (creación, emisión y destrucción)


Desde PyBta 0.3, el módulo eventos permite la creación y destrucción, de manejadores, por parte del usuario. Estos eventos se catalogan dentro de la jerarquía, manejadores de usuario.
En está entrada voy a explicar como se usa esta idea, para ello, voy a utilizar un pequeño programa que después comentaré:

Ejemplo en funcionamiento (Lo que debería pasar):




# -*- coding: ISO-8859-1 -*-
#! /usr/local/bin/python
#Programada por:Jesús Hernández Paredes

import pyBta
from pyBta import controles

pyBta.iniciar(titulo="Probando manejadores.",dimensiones=(800,600))

class Formulario(controles.BtaFormulario):
         def __init__(self):
                 controles.BtaFormulario.__init__(self)
         def pre_iniciar(self):
                 self.medidas=800,600

                 pyBta.eventos.crear_manejador_de_usuario("DESPLAZADOR_AL_MINIMO")
                 pyBta.eventos.crear_manejador_de_usuario("DESPLAZADOR_AL_MAXIMO")
                self.boton=controles.BtaBotonTextual("MATAR MANEJADORES.")
                self.boton.ancho=800
                self.boton.tama_fuente(30)
                self.poner(self.boton)

                self.texto=controles.BtaEtiquetaTextual("")
                self.texto.colorFondo=pyBta.VAINILLA
                self.texto.estilo=pyBta.ESTILO_BORDE_NEGRO
                self.texto.alinear=pyBta.ALINEAR_CENTRO,pyBta.ALINEAR_CENTRO
                self.texto.tama_fuente(30)
                self.texto.medidas=300,300
                self.texto.posicion=400-150,100
                self.poner(self.texto)
                self.dspH=controles.BtaDesplazadorH()
                self.dspH.ancho=800
                self.dspH.y=550
                self.poner(self.dspH)

                return True




     def post_iniciar(self):
                self.dspH.EventoTrocarValor=self.emitir_eventos
                self.boton.EventoClick=self.matar_manejadores
                pyBta.eventos.registrar_metodo("DESPLAZADOR_AL_MINIMO", self,self.al_minimo)
                pyBta.eventos.registrar_metodo("DESPLAZADOR_AL_MAXIMO", self,self.al_maximo)
               return True

         def emitir_eventos(self,evento):
               evento={"id":self.id_elemento()}
               emitir=False
              if self.dspH.valorActual<=0:
                      emitir=True
                      evento["tipo"]="DESPLAZADOR_AL_MINIMO"
               elif self.dspH.valorActual>=self.dspH.maximo:
                      emitir=True
                      evento["tipo"]="DESPLAZADOR_AL_MAXIMO"
              if emitir:
                      pyBta.eventos.envio_directo(evento)
 
     def matar_manejadores(self,evento):
                      pyBta.eventos.borrar_manejador_de_usuario("DESPLAZADOR_AL_MINIMO")
                      pyBta.eventos.borrar_manejador_de_usuario("DESPLAZADOR_AL_MAXIMO")
                     self.texto.etiqueta="LOS MANEJADORES \n ESTÁN MUERTOS."
 
      def al_minimo(self,evento):
                      self.texto.etiqueta="LLEGO AL MÍNIMO"
 
      def al_maximo(self,evento):
                      self.texto.etiqueta="LLEGO AL MÁXIMO"

formulario=Formulario()
pantalla=pyBta.BtaPantalla()
pantalla.poner(formulario)
pyBta.poner_pantalla(pantalla)
pyBta.ejecutar()

Explicaré lo que me interesa más enfáticamente y dejaré el resto para futuras entradas.

En este ejemplo uso un formulario y en su función, pre_iniciar, genero todos los elementos necesarios. Las dos primeras lineas de esta función expresan la creación de los manejadores de usuario:

         pyBta.eventos.crear_manejador_de_usuario("DESPLAZADOR_AL_MINIMO")
         pyBta.eventos.crear_manejador_de_usuario("DESPLAZADOR_AL_MAXIMO")

para crear un manejador se usa la función, crear_manejador_de_usuario, que ofrece el objeto eventos. Esta función, recibe una cadena de texto, que es el nombre del manejador generado. El manejador pasará a estar disponible dentro de la jerarquía, de usuario.

Lo siguiente que nos hace falta para usar un manejador propio, es decidir en que lugar de nuestro programa, queremos emitir eventos hacia el manejador. Yo uso la función, emitir_eventos, como lugar, idóneo, para emitir señales a mis dos nuevos manejadores. Esta función se ejecutará cada vez que la barra de desplazamiento cambie su valor.

         def emitir_eventos(self,evento):
               evento={"id":self.id_elemento()}
               emitir=False
              if self.dspH.valorActual<=0:
                      emitir=True
                      evento["tipo"]="DESPLAZADOR_AL_MINIMO"
               elif self.dspH.valorActual>=self.dspH.maximo:
                      emitir=True
                      evento["tipo"]="DESPLAZADOR_AL_MAXIMO"
              if emitir:
                      pyBta.eventos.envio_directo(evento)

Para emitir una señal a un manejador, primero debemos generar un diccionario con la información necesaria, para emitir una señal correcta.
Este diccionario debe contener dos claves obligatorias:

id: id del elemento, del cual se envía la señal al manejador.

tipo: Nombre del manejador al que le enviamos la señal.

En esta función, se genera un diccionario llamado, evento, se crea con la clave id. A esta clave se le pasa, mediante la función, id_elemento, del objeto BtaFormulario, el identificador único del elemento, de este modo el manejador sabrá de que lugar proviene la señal. Después se pregunta mediante el atributo, valorActual, del control BtaDesplazador, si el valor es menor o igual a cero. De ser así, se creará dentro del diccionario la clave, tipo y se le pasará la cadena de texto "DESPLAZADOR_AL_MINIMO". Si el valor es igual o mayor que el atributo, máximo, del BtaDesplzador, se creará la clave, tipo, con la cadena de texto "DESPLAZADOR_AL_MAXIMO". Si alguno de los anteriores casos fue correcto se pasará a la emisión de la señal. Esto se hace mediante el objeto, eventos, usando su función envio_directo:

         pyBta.eventos.envio_directo(evento)

A esta función se le debe pasar el diccionario, creado, para que lo haga llegar al el objeto, constructorDeEventos, el cual incluirá el diccionario como una señal, más, dentro de la lista de señales a emitir. Dentro del diccionario también se puede guardar cualquier otra información adicional al evento generado.

Después de cumplir estos pasos, el manejador estará funcionando y a la espera de recibir las señales adecuadas. Lo siguiente, es crear métodos y conectarlos como funciones de respuesta dentro del manejador. En el ejemplo uso las funciones, al_minimo y al_maximo:

      def al_minimo(self,evento):
                      self.texto.etiqueta="LLEGO AL MÍNIMO"
 
      def al_maximo(self,evento):
                      self.texto.etiqueta="LLEGO AL MÁXIMO"

Estas funciones reciben el parámetro, evento, este, no es más que el diccionario generado en el paso anterior. Ya solo nos queda conectar estas funciones al manejador, para que este responda en el momento adecuado. Esto lo hago en la función, post_iniciar, que provee el objeto, BtaFormulario:

         pyBta.eventos.registrar_metodo("DESPLAZADOR_AL_MINIMO", self,self.al_minimo)
         pyBta.eventos.registrar_metodo("DESPLAZADOR_AL_MAXIMO", self,self.al_maximo)

Esta función, no es correcta para conectar eventos de tipo general o global, pero si es correcta para conectar eventos de tipo usuario.
La función recibe tres parámetros: el primero es el nombre del manejador, el segundo es el objeto que registra la señal, en este caso el BtaFormulario y el último es la función que se emitirá como respuesta.

Todo esto, se traduce en que el programa emitirá el evento "DESPLAZADOR_AL_MINIMO" cuando el, BtaDesplazador alcance su valor mínimo y emitirá su evento "DESPLAZADOR_AL_MAXIMO" cuando el, BtaDesplazador, alcance su valor máximo.

En la función, matar_manejadores, se ejecutan las siguientes lineas:

          pyBta.eventos.borrar_manejador_de_usuario("DESPLAZADOR_AL_MINIMO")
          pyBta.eventos.borrar_manejador_de_usuario("DESPLAZADOR_AL_MAXIMO")
La función, borrar_manejador_de_usuario, es la encargada de destruir el manejado creado y de borrar todo lo que se encuentre conectado en su interior.
Aunque en el ejemplo no se explique, si lo que se desea es borrar un grupo de funciones conectadas al manejador se usa la función:
       pyBta.eventos.eliminar_registros_por_id(tipo,idABorrar)

esta función, recibe el nombre del manejador, del que se desea borrar el grupo de conexiones y el id del elemento al cual están conectadas.

No hay comentarios:

Publicar un comentario