XalalinuX Grupo de Usuarios de Linux de Xalapa

1Mar/091

Tutorial Básico (muy básico) de PyGTK

Últimamente he estado programando un poco con Python y pyGTK y me gustó la facilidad que tiene este lenguaje para crear intefaces de usuario. A continuación explicaré un pequeño tutorial sobre el desarrollo de un programa sencillo. Existe un muy buen tutorial en esta página http://www.pygtk.org/pygtk2tutorial-es/index.html . Muchas cosas que muestro aquí salieron de ese tutorial. La idea es generar una ventana que muestre una imagen, una etiqueta, un caja de texto y un botón. Al presionar el boton cambiará el contenido de la etiqueta, donde tendremos el siguiente resultado.

y el código para generar este programa es el siguiente:

try:
    import gtk
except:
    print 'Se necesita pyGTK para correr este programa'

class VentanaXalalinux(gtk.Window):
    ''' Ventana principal, es una clase que contiene
    otras clases '''

    def delete_event(self, widget, event):
        print 'Se genero el evento delete'
        return False
        # Si devuelve True no se cierra el programa

    def destroy(self, widget):
        gtk.main_quit()

    def __init__(self):
        # Constructor de la clase
        gtk.Window.__init__(self)
        self.connect('delete_event', self.delete_event)
        self.connect('destroy', self.destroy)
        self.set_border_width(0)
        self.set_title('-:: XalalinuX ::-')
        self.set_role('main')
        self.set_position(gtk.WIN_POS_CENTER)
        # Se agrega el contenedor principal
        self.contenedor = gtk.VBox()
        # Cargamos una imagen
        self.imagen = gtk.Image()
        self.imagen.set_from_file('logo-xalalinux.png')
        self.contenedor.pack_start(self.imagen, True, True)
        # Creamos una etiqueta y le damos formato
        self.LMensaje = gtk.Label()
        self.LMensaje.set_markup('Etiqueta modificada ')
        self.contenedor.pack_start(self.LMensaje, True, True)
        # Creamos un contenedor horizontal para poner
        # una caja de texto y un boton
        self.hbox = gtk.HBox()
        self.Entrada = gtk.Entry()
        self.Boton = gtk.Button(stock=gtk.STOCK_APPLY)
        self.Boton.connect('clicked', self.modificar_etiqueta)

        self.hbox.pack_start(self.Entrada, True, True)
        self.hbox.pack_start(self.Boton, False, False)
        self.contenedor.pack_start(self.hbox, False, False)

        self.add(self.contenedor)
        self.show_all()

    def modificar_etiqueta(self, widget):
        texto = self.Entrada.get_text()
        self.LMensaje.set_markup(''+ texto + '')

    def main(self):
        gtk.main()

if __name__ == '__main__':
    ventana = VentanaXalalinux()
    ventana.main()

Este programa se puede descargar de aqui y el logo de aqui. Para correr el programa deben darle desde la terminal

python xalalinux.py

Aqui viene la explicación de cada parte. Al inicio del programa importamos el modulo gtk que es el que nos permite generar todos los objetos para la interfaz gráfica. En Python TODOS los elementos son objetos y siempre se debe pensar en ellos como objetos. Aqui sólo creamos una clase llamada VentanaXalalinux que se hereda de la clase gtk.Window, es decir VentanaXalalinux es una clase gtk.Window (más lo que nosotros le agreguemos), osea una ventana.

class VentanaXalalinux(gtk.Window):

Cuando creamos un objeto de la clase VentanaXalalinux primero se llama al constructor que se encarga de inicializar al objeto. En este caso en el constructor dibujamos toda la ventana. Primero llamamos al constructor de la clase gtk.Window. Esto es para tener acceso a todos los atributos de la clase.

gtk.Window.__init__(self)

Luego definimos algunas propiedades en particular. Primero se conectan eventos generados con las funciones definidas en la clase.El evento delete_event se genera el cerrar la ventana. Cuando se cierra la ventana se ingresa a la funcion self.delete_event que devuelve un valor False, si esta función devuelve un valor True el programa no terminará, esto sirve para poner dialogos de "Seguro que desea salir" dentro de esa funcion. Si devuelve False se genera el evento destroy y se termina la aplicacion.

self.connect('delete_event', self.delete_event)
self.connect('destroy', self.destroy)

Posteriormente cambiamos algunos atributos de la ventana como el titulo, si se trata de la ventana principal el borde y la posición en la pantalla.

self.set_border_width(0)
self.set_title('-:: XalalinuX ::-')
self.set_role('main')
self.set_position(gtk.WIN_POS_CENTER)

Ya con la ventana definida ahora se agregan los controles que tendrá la ventana. Cuando vamos a utilizar varios controles, en GTK es necesario empaquetarlos para distribuirlos en la ventana. Primero agregamos una caja vertical que será el contenedor principal del programa.

self.contenedor = gtk.VBox()

y comenzamos a agregar controles dentro de ese contenedor. En este ejemplo quise cargar una imagen. Se debe tener una imagen con ese nombre en el mismo directorio donde se ejecuta el programa.

self.imagen = gtk.Image()
self.imagen.set_from_file('logo-xalalinux.png')
self.contenedor.pack_start(self.imagen, True, True)

La última línea agrega la imagen al contenedor. Ahora creamos una etiqueta con el texto formateado y la agregamos al contenedor.

self.LMensaje = gtk.Label()
self.LMensaje.set_markup('Etiqueta modificada ')
self.contenedor.pack_start(self.LMensaje, True, True)

Para poner la caja de texto junto con el boton necesitamos otro contenedor pero ahora horizontal. Y ahora agregar la caja de texto y el boton a ese contenedor horizontal. Tambien asociamos el evento clicked a la funcion self.modificar etiqueta para que siempre que se de click al boton se ejecute esta funcion

self.hbox = gtk.HBox()
self.Entrada = gtk.Entry()
self.Boton = gtk.Button(stock=gtk.STOCK_APPLY)
self.Boton.connect('clicked', self.modificar_etiqueta)

self.hbox.pack_start(self.Entrada, True, True)
self.hbox.pack_start(self.Boton, False, False)
self.contenedor.pack_start(self.hbox, False, False)

Por ultimo agregamos el contenedor a la ventana y mostramos todos los widgets.

self.add(self.contenedor)
self.show_all()

La funcion modificar_etiqueta sólo toma el valor de la caja de texto y la concatena con el codigo de formato para la etiqueta. Por ultimo aqui es donde creamos y ejecutamos nuestro objeto. La funcion main() se encarga de comenzar con el programa.

if __name__ == '__main__':
    ventana = VentanaXalalinux()
    ventana.main()
21Sep/086

Proyecto de transmisión de información hidrometeorológica

Esta es la descripción del proyecto que comentamos en la reunión pasada.

Después de las intensas lluvias que se presentaron en septiembre-octubre de 1999 provocando grandes afectaciones y pérdidas humanas en el norte del estado de Veracruz, el Instituto de Ingeniería de la UNAM y el Centro Nacional de Prevención de Desastres Naturales diseñaron un Sistema de Alerta Hidrometeorológica para las cinco cuencas principales del norte del estado.

Los sistemas consisten en estaciones de lluvia ubicadas en las zonas altas de la cuenca que registran la lluvia acumulada y transmiten la información a un puesto central de registro que se encuentra en los palacios municipales de Misantla, Martínez de la Torre, Gutierrez Zamora, Poza Rica y Álamo.

En los principales afluentes de cada cuenca se encuetran estaciones de nivel de los ríos que igualmente envían la información a los puestos centrales.

Los sistemas de alerta funcionan mediante un modelo matemático donde procesa la lluvia acumulada de cada estación y alerta algunas horas antes una posible inundación en la parte baja de la cuenca, lo que permite a los grupos de rescate evacuar a la población de las zonas de riesgo.

En los últimos años los sistemas de alerta no recibieron mantenimiento por lo que su funcionamiento fue decayendo. Desde hace un año la Secretaría de Protección Civil y el Centro de Ciencias de la Tierra de la Universidad Veracruzana se hicieron cargo de estos sistemas. Se ha realizado un recorrido por cada una de las 42 estaciones y actualmente se procede con la reparación de los instrumentos.

Dentro de los objetivos de este proyecto está:

  • La actualización del modelo matemático.
  • Actualizar el software de análisis de la información
  • Actualizar el software de telemetría encargado de recibir y almacenar la información de la estaciones
  • Crear un software para la transmisión de la información a un servidor ubicado en la Universidad Veracruzana.
  • Del lado del servidor crear un software para recibir y almacenar la información en una base de datos.
  • Crear un software de consulta de la información almacenada en la base de datos.
  • Publicar por internet, a través de la página del Centro de Ciencias de la Tierra la información de cada estación en tiempo real.
Esquema del proyecto
Esquema del proyecto

Algunos puntos interesantes:

  • El servidor tendrá IP pública en el rango de la UV
  • Aún no tengo el detalle sobre qué tipo de conexión tienen en cada municipio, pero es de esperar que estarán a través de un proxy y que si IP quizá sea dinámica.
  • El flujo de datos es pequeño, ya que cada 10 minutos será enviada la información de las estaciones al servidor y se trata de un paquete de datos pequeño.

El servidor contará con las siguientes características:

  • Procesador Intel® Xeon® doble núcleo 5130, 4MB Cache, 2.00GHz, 1333MHz FSB
  • Memoria: 4GB 667MHz (4X1GB), Dual Ranked Fully Buffered DIMMs
  • Segundo Procesador: Intel® Xeon® doble núcleo 5130, 4MB Cache, 2.00GHz, 1333MHz FSB
  • Configuración de Discos Duros: SATA integrado - No RAID
  • Tarjeta Controladora: Controlador SATA incorporado
  • Disco Duro: de 500 GB, SATA, de 3.5", con velocidad de 7,200 RPM
  • Segundo Disco duro: de 500 GB, SATA, de 3.5", con velocidad de 7,200 RPM
  • Tarjeta de Red:Tarjeta de interfaz de red Ethernet simple incorporada Broadcom® NetXtreme II 5708 Gigabit

Correrá algún Linux, aún está por definirse cual.