Gui

GUI

Subsecciones

  1. Python
  2. DBus
  3. Glade

Terminología

  • GUI: Graphic User Interface o interfaz gráfica de usuario, es la parte visual y la mayor parte del Frontend.
  • Frontend : proceso visible para el usuario posiblemente iniciado por él. Internamente se envian unas señales al Backend y los resultados devueltos son mostrados al usuario.
  • Backend: Proceso oculto al usuario, pero que suele contener el núcleo del programa que se está desarrollando.
  • Python: es un lenguaje de programación desarrollado en 1991. Esta diseñado siguiendo la filosofía de la legibilidad y prima el esfuerzo del programador sibre el del computador. Es un lenguaje multiparadigmatico (funcional, orientado a objetos e imperativo) y posee un completo sistema dinamico de tipos. Es similar a Perl, Ruby, Scheme y Tcl.
  • Pygtk: es una referencia a la biblioteca gráfica GTK para el lenguaje de programacion Python.
  • Gtk: biblioteca gráfica que se utiliza para desarrollar el entorno gráfico GNOME.
  • GNOME: GNOME es un entorno de escritorio para sistemas operativos de tipo Unix.
  • DBus: Sistema software que proporciona una forma de comunicación entre aplicaciones. Página del proyecto aquí.
  • Objeto: Objeto básico que utiliza DBus en el intercambio de información entre dos procesos.
  • Proceso: Unidad de ejecución independiente en un sistema operativo.
  • XML: sigla en inglés de eXtensible Markup Language («lenguaje de marcas extensible»). Es un metalenguaje extensible de etiquetas. Es un estándar para el intercambio de información estructurada entre diferentes plataformas de una manera segura, fiable y fácil
  • Handler: o 'manejador'. función que captura una determinada señal o evento de ventana que puede ser implementada después como queramos. Por ejemplo, pulsar un botón.

Descripcion del modulo

El módulo GUI se encarga de darle al usuario una interfaz amigable para facilitarle el manejo del programa y hacérselo mucho más intuitivo

Las funcionalidades más representativas de el módulo GUI son:

  • Permitir al usuario interactuar con las funcionalidades de HD Lorean.
  • Visualizar el estado de los archivos monitorizados por HD Lorean.

Abstracción al problema

El objetivo de la GUI es proporcionar al usuario una interfaz usable y facil de entender.

Abstracción a la solución

Una posible solución al problema puede ser:

  1. Diseñar sobre "papel" una ventana para un subproblema, pensando en las funcionalidades requeridas
  2. Crear una ventana para ese subproblema. Volver a 1 si no es posible crear la ventana por un problema de diseño
  3. Definir los eventos asociados a la activacion de cada una de esas funcionalidades.
  4. Tratar esos eventos para producir los resultados pedidos.
  5. Comunicación con el backend para llevar a cabo las funciones requeridas.

El punto 4 nos obliga a programar los handlers para tratar los eventos que queramos realizar.

Tecnologias empleadas:

A continuación se establecen las bases teóricas para comprender la terminología utilizada a lo largo del documentos. Luego se describe brevemente cada tecnología, se otorga un ejemplo de uso y se destacan sus aspectos positivos y negativos.

Python

Python es un lenguaje de programación multiparadigmático, ya que permite varios estilos, de los cuales vamos a utilizar el de la programación orientada a objetos y programación estructurada. Esto nos permite tanto programar clases para modelar objetos independientes con herencia y demás características, como programar del modo tradicional en la programación imperativa.
La programación orientada a objetos simplifica bastante la creación de guis, ya que una ventana puede ser un objeto, cuyos atributos sean los componentes de la ventana (botones, áreas de texto, etc).
Estos estilos que hemos seleccionado para utilizar con python hacen que se asemeje mucho a programar con java (orientado a objetos) y c++ (estructurada, modular y orientada a objetos), pero a la hora de elegirlo tuvimos en cuenta la compatibilidad con el entorno en el que ibamos a movernos (linux, gnome) y vimos que en python existen unas librerias que permiten programar directamente para gnome con gtk con las librerías que veremos a continuación.

Pygtk

PyGTK es un binding(referencias) de la biblioteca gráfica GTK para Python. PyGTK nos permite crear de un modo rápido y sencillo la gui de la aplicación ya que se puede disponer de las librerías GTK para programar directamente para el entorno de escritorio GNOME.
PyGTK dispone de una API que resulta muy útil, ya que describe todas las funciones y los parámetros utilizados para éstas, de modo que nos resulta bastante fácil programar PyGTK partiendo con unos conocimientos bastante limitados de GTK, simplemente programando sobre Python y llamando a las funciones de las que se dispone. API

GTK+

Es un conjunto de bibliotecas o rutinas para desarrollar interfaces gráficas para el entorno gráfico GNOME. Es un software libre y multiplataforma, y este hecho se ajusta a las características de nuestro proyecto, aunque su capacidad multiplataforma no vamos a explotarla ya que HD Lorean es un software que utiliza características del núcleo de Linux y otros programas que no existen en otras plataformas.
No necesitamos demasiados conocimientos sobre GTK+ ya que disponemos de PyGTK que nos ofrece acceso directo a estas librerías desde Python facilitando su uso enormemente.

Glade

Glade es una herramienta de desarrollo visual de interfaces gráficas mediante GTK/GNOME. Glade no genera código fuente, sino unos archivos XML que posteriormente son interpretados mediante la librería libglade por Python en nuestro caso.

Ejemplo:

<glade-interface>
<widget class="GtkAboutDialog" id="About">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="border_width">5</property>
<property name="title" translatable="yes">About HD Lorean</property>
<property name="resizable">False</property>
<property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
<property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
<property name="has_separator">False</property>
<property name="program_name">HD Lorean</property>
<property name="version">0.01</property>
<property name="comments" translatable="yes">

En éste ejemplo podemos observar un fragmento de código XML de un archivo .glade.

Ejemplo:

self.gladefile="dbusgui.glade"
self.wTree = gtk.glade.XML (self.gladefile)
self.wTree = gtk.glade.XML (self.gladefile)
self.texto = self.wTree.get_widget('textview1')

En éste ejemplo podemos observar como se asocia un archivo glade XML a un atributo de un objeto de una clase Python.

Glade es una herramienta bastante intuitiva, y permite la creación de ventanas simplemente arrastrando botones, paneles de texto, y demás elementos sobre la ventana en la que estamos trabajando.

Pantallazo-Asist.glade.png

Es una herramienta muy útil ya que además permite asociar eventos de los diferentes elementos gráficos de la ventana a métodos y funciones del código en Python.

Ejemplo:

dic = { "on_BSalir_clicked" : self.Salir,
"on_BMostrar_clicked" : self.Mostrar
}

Este ejemplo de código Python nos muestra la forma de conectar los eventos creados en Glade asociados a un elemento gráfico con funciones del código generado en Python.

Conclusiones:
Glade es una herramienta muy útil para el desarrollo de nuestro GUI, ya que nos permite observar un resultado final de la apariencia gráfica en un proceso muy temprano de desarrollo.
Hemos podido observar también que Glade sólo permite asociar eventos a elementos de la ventana, no permite utilizar toda la potencia de GTK. Además al utilizar los archivos glade XML no podemos ver directamente código generado de la interfaz gráfica, por lo que tenemos que usar funciones que asocian elementos gráficos con objetos en los que poder trabajar directamente en Python con pyGTK. Esto puede resultar quizás algo engorroso al principio, pero el ahorro de tiempo que nos permite la herramienta Glade compensa con creces este inconveniente.
Por lo tanto decidimos utilizar Glade y para las partes en las que es imposible programar con el archivo glade XML aprovechamos directamente las funciones de pyGTK.

Dbus

Dbus es una aplicación que se utiliza para comunicar varios procesos entre sí. Para utilizarlo basta con importar la librería dbus (import dbus en python por ejemplo).
Se podría pensar en dbus como si fuera una aplicación cliente-servidor bidireccional. Una parte se programa con objetos/rutas que enlazan esa ruta con unos métodos del módulo en el que están presente. La otra parte permite conectar esos objetos/rutas para poder utilizarlos en el módulo destino.
Esto nos permite en nuestro caso comunicar la gui con el backend, que son procesos diferentes pero necesitan información uno del otro. Para ello tenemos que crear objetos dbus y funciones para la conexión con otros objetos en ambos módulos.

Ejemplo:

bus = dbus.SessionBus()
rb = bus.get_object('org.gnome.Rhythmbox','/org/gnome/Rhythmbox/Player')
player = dbus.Interface(rb,'org.gnome.Rhythmbox.Player')
playing = player.getPlaying()

Este ejemplo nos muestra como realizar una conexión desde un proceso cualquiera con Rhythmbox, que contiene varios objetos Dbus que podemos utilizar. Simplemente hay que indicar la interface y el objeto, que viene dado mediante el espacio de nombres /org/gnome/Rhythmbox/Player para poder empezar a utilizar funciones que nos ofrece ese objeto.

Pantallazo-dbusgui.py.png

Aquí podemos ver el resultado final de una aplicación ejemplo creada para obtener información diversa de la música que esta tocando en un momento determinado la aplicación Rhythmbox.

DBus es una tecnología en auge en los últimos tiempos, quiere convertirse en un standard en la comunicación interprocesos.
Hemos investigado también otras tecnologías similares, tales como:

  • CORBA: Aplicación de comunicación interprocesos que en la actualidad apenas se usa. Fue un proyecto muy ambicioso, y fue utilizado antes que Dbus para la comunicación interprocesos en GNOME. Es un software muy complejo y demasiado difícil de usar, tanto es así que GNOME lo sustituyó en su día por Dbus.
  • DCOP: Aplicación de comunicación interprocesos extensamente utilizada en KDE, otro de los principales entornos de escritorio de Linux. Actualmente también está dejando de utilizarse en detrimento de Dbus.

Conclusiones:
DBus se está convirtiendo en un standard dentro de la comunicación interprocesos en Linux. Por lo tanto si queremos que HD Lorean pueda en un futuro comunicarse con otras aplicaciones necesitamos utilizarlo.
Descartamos CORBA y DCOP por tanto, que aunque son tecnologías que podrían suplir perfectamente a DBus, actualmente están dejando de utilizarse y por lo tanto perderíamos compatibilidad con el resto de aplicaciones de escritorio de Linux.

Conclusión

Opinion personal

Creemos que python + pygtk + glade es una buena herramienta para desarrollar el GUI.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License