Está en la página 1de 6

Programacin

Libreras wxWindows

Interfaces grficas con wxPython


Arturo Fernndez Montoro

Conoceremos las posibilidades que ofrece este mdulo de Python para escribir aplicaciones con una GUI multiplataforma.
Introduccin
Actualmente cada vez es ms importante realizar aplicaciones que puedan ejecutarse en varias plataformas. Es por ello que en los ltimos aos hemos asistido a la proliferacin de lenguajes y herramientas de desarrollo que nos faciliten la tarea de construir software multiplataforma. Esta fue una de las caractersticas que impulsaron, por ejemplo, la rpida adopcin del lenguaje Java por parte de muchos desarrolladores. Otro ejemplo son los lenguajes de scripting orientados a objetos como Python o Ruby. Para conseguir que slo desarrollemos un programa una vez y podamos ejecutarlo en distintas plataformas, necesitamos un intrprete especfico (o una mquina virtual) para cada una de ellas. Uno de los principales problemas con los que nos encontramos cuando pensamos en desarrollar software para distintas plataformas es la interfaz grfica. Cada sistema operativo utiliza o puede utilizar un sistema grfico, entendiendo este como un conjunto de componentes de interfaces de usuario, distinto. Los lenguajes de programacin nos ofrecen libreras para trabajar con la interfaz y el sistema grfico de una plataforma concreta. Por ejemplo, podemos escribir un programa en

C++ utilizando las libreras MFC que seguro no correr en Linux. Habitualmente, para sistemas UNIX se utilizaban las libreras de Motif. Lenguajes como Java solventan este problema incluyendo libreras nativas como AWT (Abstract Windowing Toolkit) que implementan un sistema para construir componentes grficos independiente del sistema operativo. Sin embargo, slo podemos utilizar estas libreras cuando programamos en Java. Observando este hecho parece interesante poder utilizar una sola librera grfica en cualquier lenguaje y que sea independiente del sistema operativo. Ms que una sola librera, lo ideal es tener una API comn de programacin, ya que los binarios de esta librera sern diferentes para cada sistema operativo. Pues bien, eso es precisamente wxWindows.

wxWindows
Se trata de un conjunto de libreras que permiten constuir componentes de interfaz grfica de usuario con independencia del sistema operativo y de su sistema grfico (GTK+, Windows, Motif y Mac). Originariamente se desarroll slo para el lenguaje C++, pero actualmente existen tambin versiones para Python y Perl. La gran ventaja es que aunque cambiemos de lenguaje no es necesario aprender una nueva API ya que esta es comn para todos los lenguajes. En otras palabras, no se trata de un traductor de una GUI a otra, por ejemplo, no toma una aplicacin desarrollada para Motif y la traduce a una Windows. Podemos considerar a wxWindows como un framework en el sentido de que nos proporciona un conjunto de componentes y rutinas comunes en la programacin con componentes GUI, liberndonos del esfuerzo de escribir cada uno de ellos en cada programa. Su capacidad para manejar sistemas de ficheros virtuales, generar cuadros de dilogo, ventanas, botones y otros controles, adems del soporte para OpenGL, la convierten en una buena herramienta para construir modernas aplicaciones dnde la interfaz grfica de usuario es de gran importancia.

Figura 1. wxPython listo para usar.

MUNDO

Linux

50

Interfaces grficas con wxPython

Programacin

wxWindows comenz su andadura en 1992 en el Artificial Intelligence Applications Institute de la Universidad de Edinburgo, y surgi de la idea de Julian Smart cuando se plante la necesidad de escribir una aplicacin que deba funcionar tanto en Windows como en terminales con X-Window. Dado que las herramientas comerciales no estaban a su alcance, decidi escribir su propia librera que, con el paso del tiempo y con la ayuda de otras personas, termin convirtindose en un proyecto de Open Source y en lo que hoy es wxWindows (la w viene de Windows y la x de X-Window). Actualme se rige bajo la licencia denominada wxWindows license que bsicamente es la licencia L-GPL con la salvedad de que pueden licenciarse otros productos propietarios que tomen slo los binarios de esta librera. Con ello los autores pretenden por un lado que sea software Open Source y por otro satisfacer las necesidades de aquellos que pretenden costruir software propietario incluyendo wxWindows como librera base para la GUI. La licencia en cuestin ha sido aprobada por la Open Source Initiative, que se encarga de gestionar las distintas licencias que existen en el mundo Open Source.

Listado 1
1 2 3 4 5

La aplicacin Hello World!

from wxPython.wx import * app = wxPySimpleApp() frame = wxFrame(None, -1, Hello World!) frame.Show(1) app.MainLoop()

wxPython
El lenguaje Python gana cada da ms adeptos debido a sus principales caractersticas: rapidez de ejecucin, multiplataforma y las ventajas propias de un lenguaje de scripting orientado a objetos. Cuando deseamos escribir una GUI utilizando este lenguaje disponemos de diversas opciones: pyQT, pyGTK, Tkinter o wxPython. Esta ltima es, bsicamente, la versin de wxWindows para Python. Se trata de un completo toolkit para construir elementos de interfaces grficas de usuario. Utilizar esta librera nos permitir escribir aplicaciones multiplataforma con una completa GUI. Evidentemente, si ya conocemos wxWindows tendremos mucho camino avanzado debido a que la API es prcticamente igual, salvando las distintas sintcticas que existen entre Python y C++ (recordemos que originariamente wxWindows fue desarrollada para este lenguaje). Por otro lado, wxWindows est dotada de una gran estabilidad y se viene utilizando desde hace diez aos. wxPython es un mdulo de Python ms que podemos incorporar en nuestros programas. Este mdulo nos permite crear instancias de las clases de wxWindows e invocar a sus mtodos. Todas la clases son prcticamente iguales en ambas libreras, salvando las distancias entre los lenguajes, por lo que la documentacin sobre wxWindows nos valdr perfectamente para desarrollar con wxPython. A partir de aqu asumiremos que el lector conoce el lenguaje Python o est familiarizado con l. Como punto de partida recomendamos el artculo que sobre este lenguaje aparce en Mundo Linux 53.

Figura 2. Nuestra primera aplicacin.

Instalacin
En primer lugar debemos tener instalado el intrprete de Python, para la realizacin de este artculo nosotros hemos utilizando la versin 2.1.3. Habitualmente podemos encontrarlo en todas las distribuciones de Linux. Posteriormente debemos instalar la versin de wxWindows para Linux, que en este caso utiliza las libreras de GTK+, es lo que se conoce con el nombre de wxGTK. No olvidemos que antes de instalar esta librera, nuestro sistema debe contar con el toolkit de GTK+. Si utilizamos Gnome seguro que ya las tenemos instaladas. GTK+ es utilizado por muchos programas, seguramente nuestro sistema ya cuenta con estas libreras. Por ltimo, slo nos queda instalar wxPython. Todo este software se distribuye en formato tarball y para instalarlo se sigue el proceso habitual para el software empaquetado en este formato, es decir, debemos descromprimir y compilar. Si tenemos la suerte de utilizar Debian el proceso se simplifica: basta con instalar el paquete libwxgtk2.2-python (en caso de Python 2), que adems nos configurar el mdulo y nos dejar todo listo para empezar a trabajar.
MUNDO

51

Linux

Programacin

Listado 2
1 ID_MENU_EXIT = 101 2 ID_MENU_ABOUT = 102 3 self.CreateStatusBar() 4 self.SetStatusText(Welcome!) 5 6 7 8 9

Men, barra de estado y mtodos callback

# MenuBar menuBar = wxMenuBar() menu = wxMenu() menu.Append(ID_MENU_ABOUT, A&bout, About...) menu.Append(ID_MENU_EXIT, E&xit, Close application)

10 EVT_MENU(self, ID_MENU_EXIT, self.OnbtnClose) 11 EVT_MENU(self, ID_MENU_ABOUT, self.OnbtnAbout) 12 menuBar.Append(menu, &File) 13 self.SetMenuBar(menuBar) 14 def OnbtnClose(self, evt): 15 self.Close()

El mdulo wxPython debe quedar localizado en el directorio site-packages de Python. En el caso de Debian se trata del directorio /usr/lib/python2.1/site-packages/wxPython/. Dado que el mdulo se encuentra en este directorio, no tendremos ningn problema a la hora de realizar la importacin del mismo desde nuestros programas. La ltima versin liberada de wxPython es la 2.4.1.2, la cual necesita la versin 2.4 de wxGTK. Sin embargo, para la realizacin de este artculo nosotros hemos utilizado la versin 2.2, dado que se trata de la versin estable incluida en Debian Woody. Para comprobar que tenemos correctamente instalado wxPython, podemos abrir una shell, ejecutar python y teclear from wxPython.wx import *. Si todo va bien, la lnea de comandos del intrprete nos mostrar otra lnea. Ver figura 1.

a empezar a programar de forma rpida. En cualquier caso podemos encontrar en la web (ver referencias) amplia informacin sobre todo el conjunto de widgets que nos ofrece wxWindows y wxPython, que seguro nos servir para ir profundizando y sacar amplio partido para el desarrollo de interfaces grficas de usuario en Python. Como introduccin hemos elegido todo un clsico: Hello World!. Nuestra primera aplicacin ser una ventana que presenta el tradicional mensaje. El cdigo est en el listado 1. Lo primero que debemos tener en cuenta es que wxPython est dirigido a eventos, es decir, cada control utiliza una rutina de callback que responde a cierto evento. La primera lnea de cdigo indica el mdulo que debemos importar y qu clases. En este caso hemos utilizado el asterisco (*) para importar todas las clases, aunque podamos haber importado slo aquellas que vamos a utilizar. Seguidamente indicamos que esta va a ser una aplicacin wxPython (lnea 2), esto implica que est dirigida a eventos y que debe establecerse un ciclo inicial (esto se indica en la lnea 5). El nico control que tiene nuestra aplicacin es un wxFrame. Debemos pensar en frames y no en ventanas, ya que un frame es un contenedor de controles. La lnea 3 presenta la creacin de nuestro wxFrame, los parmetros que recibe este constructor son el padre del wxFrame, su ID y el mensaje de texto que aparece como ttulo. En este caso hemos elegido parmetros por defecto para indicar que este wxFrame no tiene padre. Solo nos resta mostrar el wxFrame en pantalla, para ello utilizamos el mtodo Show. El resultado puede apreciarse en la figura 2.

Hello World!
Figura 3. Nuestra aplicacin.

Caso prctico
Obviamente, una aplicacin con una GUI tiene ms que un simple ventana. En este apartado mostraremos, a travs de un ejemplo ms completo, los principales controles y mtodos que podemos utilizar con wxPython para conseguir una GUI consistente. Como caso prctico vamos a realizar una aplicacin que genere un fichero a partir de unos valores que introduce el usuario. Este fichero resultado nos servir para configurar un acceso JDBC para el servidor de aplicaciones J2EE JBoss. La motivacin del desarrollo de esta aplicacin viene dada por el hecho de que para realizar esta configuracin, JBoss no facilita ninguna herramienta automtica. Asimismo, podremos comprobar la ventaja de realizar esta aplicacin en Python en lugar de utilizar Java, que sera lo normal, dado que estamos hablando de JBoss. Se trata de utilizar dos lenguajes de programacin con un objetivo comn. Normalmente, se tiende a utilizar el mismo lenguaje de programacin cuando intentamos resolver un problema

En lugar de describir o resumir la API que presenta wxPython, pensamos que es ms interesante comenzar viendo un caso prctico que nos ayude

MUNDO

Linux

52

Interfaces grficas con wxPython

Programacin

Listado 3

Etiquetas, cajas de texto y combo

1 lblUser = wxStaticText(self.panel, -1, DB user: ,wxPoint(20,110)) 2 self.txtUser = wxTextCtrl(self.panel, -1, ,wxPoint(140,110)) 3 # criteria combo 4 arrCriteria = [ByContainerAndApplication, ByContainer, ByApplication, ByNothing] 5 self.cbCriteria = wxComboBox(self.panel, ID_CBCRITERIA, arrCriteria[1], wxPoint(140, 230), wxSize(440, -1), arrCriteria, wxCB_DROPDOWN) 6 btnClose = wxButton(self.panel, ID_BTNCLOSE, Close, wxPoint(220, 270), wxSize(80, 25))

Listado 4

Comboboxes

1 ID_CBURL = 30 2 ID_CBDRIVER = 40 3 urlList = [jdbc:oracle:thin:@[servername]:[port]:[database name], jdbc:oracle:thin:@[servername]:[port]:[database name], jdbc:mysql://[servername]:[port]/[database name], jdbc:postgresql://[servername]:[port]/[database name], jdbc:db2:[database name], jdbc:informixsqli://[host].[domain]:[port]/[databasename]:INFORMIXSERVER=[server], jdbc:sybase:Tds:[host].[domain]:[port]/[databasename]?JCONNECT_VERSION=6 ] 4 driverList = [oracle.jdbc.driver.OracleDriver oracle.jdbc.xa.client.OracleXADataSource, org.gjt.mm.mysql.Driver, org.postgresql.Driver, COM.ibm.db2.jdbc.app.DB2Driver, com.informix.jdbc.IfxDriver, com.sybase.jdbc2.jdbc.SybDataSource ] 5 self.cbDriver = wxComboBox(self.panel, ID_CBDRIVER, driverList[0], wxPoint(140, 70), wxSize(440, -1), driverList, wxCB_DROPDOWN) 6 self.cbUrl = wxComboBox(self.panel, ID_CBURL, urlList[0], wxPoint(140, 30), wxSize(440, -1), urlList, wxCB_DROPDOWN) 7 EVT_COMBOBOX(self, ID_CBURL, self.OnChangecbUrl) 8 def OnChangecbUrl(self, evt): self.cbDriver.SetSelection(self.cbUrl.GetSelection()) 9 EVT_COMBOBOX(self, ID_CBDRIVER, self.OnChangecbDriver) 10 def OnChangecbDriver(self, evt): self.cbUrl.SetSelection(self.cbDriver.GetSelection())

dado. Sin embargo, es interesante evaluar qu lenguaje es ms apropiado para qu tarea e intentar que ambos puedan encajar entre s. Es por ello que decidimos realizar la aplicacin mencionada en Python, aunque finalmente nos servir para configurar JBoss y correr aplicaciones escritas en Java. Adems, esta aplicacin nos servir para entrar en contacto con wxPython. Proponemos al lector y programador de Java que escriba la misma aplicacin en este lenguaje y lo compare con el que aqu presentamos. En concreto, la aplicacin pedir al usuario una serie de valores para generar el fichero XML que sirve para configurar un pool de conexiones a base de datos y su DataSource asociado. Si estamos familiarizados con el desarollo J2EE estos valores nos sern populares. Podemos generar un fichero para los siguientes gestores de bases de datos: PostgreSQL, MySQL, Oracle, DB2, Informix y Sybase. Empecemos con el cdigo. Creamos una clase llamada MainFrame que herede de la clase wxFrame. Esta clase ser el contenedor de controles y tendr mtodos callback para responder a la accin del usuario sobre dichos controles. El constructor de esta clase ser el encargado de crear cada control.

El listado 2 nos muestra la creacin de una barra de men, el acceso a la barra de status y la conexin de los mtodos callback. Cuando se produce un evento, wxPython captura el mensaje y realiza una llamada a un mtodo de nuestra aplicacin. Para ello debemos hacer un registro que conecte la sucesin de un evento a un mtodo concreto. Pues bien, estos mtodos comienzan por EVT_. Veamos la lnea 10. A travs de la

Figura 4. Salvando un fichero.

53

MUNDO

Linux

Programacin

Listado 5

Cuadros de dilogo modales.

1 dlg = wxFileDialog(self, Save a text file,, , XML Files(*.xml)|*.xml|All files(*.*)|*.*|, wxSAVE); 2 if dlg.ShowModal() == wxID_OK: 3 filename = dlg.GetFilename() 4 dirname = dlg.GetDirectory() 5 try: 6 self.CreateFileJBoss(path.join(dirname, filename)) 7 dlgMsg = wxMessageDialog(self.panel, File generated sucessfully!, style = wxOK); 8 dlgMsg.ShowModal() 9 except: 10 dlgMsg = wxMessageDialog(self.panel, Error! File not generated, style = wxICON_ERROR); 11 dlgMsg.ShowModal()

Figura 5. Cuadro de dilogo.

llamada a EVT_MENU() estamos indicando que cuando se produzca un evento relacionado con la barra de men y que afecte a la entrada indentificada por ID_MENU_EXIT, se debe llamar al mtodo OnbtnClose de nuestra aplicacin. Este identificador est asociado a la entrada Close application del men (lnea 9). El mtodo onbtnClose() se encarga de cerrar el wxFrame, observemos que necesita el parmetro evt el cual le indica que debe responder a un evento. La creacin del men y de la barra de status se hace en las lneas 6 y 7 respectivamente. Posteriormente, se aaden las entradas al men, que en nuestro caso son slo dos: About y Exit. Los ID de cada control son nmeros que no atienden a un criterio concreto, simplemente deben ser distintos para cada control y nos sirven para identificarlos de forma unvoca en las llamadas a los mtodos. Pasamos a ver los principales controles que utiliza nuestra aplicacin ejemplo: q Botones q Etiquetas de texto q Elementos desplegables (comboboxes) q Cajas de texto q Cuadros de dilogo modales Comezamos observando la lnea 1 del listado 3, en ella se crea una etiqueta de texto. En este caso concreto se trata de la etiqueta que indica el nombre de usuario. El ltimo parmetro indica, a travs de una funcin, la posicin relativa de la etiqueta respecto al frame. La siguiente lnea sirve para crear una caja de texto donde se

podr introducir el nombre del usuario. El tercer argumento de la funcin es la cadena vaca porque inicialmente no queremos que se muestre ningn valor en la caja de texto. Las lneas 5 y 6 crean un combo donde se podr seleccionar el criterio de manejo del pool de conexiones por parte de Jboss. El tercer argumento de la funcin wxComboBox es la lista de los criterios seleccionables por el usuario. En nuestro caso utilizamos la lista arrCriteria. La ltima lnea del listado indica la creacin de un botn que sirve para cerrar la aplicacin. Con el objetivo de facilitar el trabajo al usuario, nuestra aplicacin seleccionar de forma automtica el driver y su URL apropiada. Es decir, una vez seleccionado el valor en uno de los combos, se dispara un evento que marca el valor correspondiente en el otro combo. Con esto evitamos que el usuario pueda seleccionar un driver que no corresponde con su URL y viceversa. El listado 4 nos muestra el cdigo en cuestin. Una vez creados los dos combos, registramos los mtodos que responden al evento de cambio del valor seleccionado en dichos combos. Debemos registrar un mtodo para cada combobox. Las lneas 8 y 9 muestran el mtodo que se va a ejecutar cuando cambie el texto del combo de las URL. En primer lugar se obtiene el ndice del elemento seleccionado de la lista de los valores de dicho combo (mtodo GetSelection()), y posteriormente se selecciona el driver correspondiente en el otro combo (mtodo SetSelection()). Las listas de ambos combos tienen el mismo nmero de elementos, por ello basta con indicar su ndice para seleccionar el valor correspondiente. Por ltimo, veremos los cuadros de dilogo modales que utiliza nuestra aplicacin. El cuadro ms sencillo que podemos crear con wxPython es aquel que tiene un botn, un mensaje y un icono. Recordemos que la aplicacin que estamos analizando se encarga de generar un fichero XML. Pues bien, si este se ha generado correctamente se informa al usuario de ello a travs de uno de estos cuadros modales. Vemoslo en las lneas 7 y 8 del listado 5. El segundo argumento de la funcin wxMessageDialog() es el mensaje mostrado al usuario y el tercer argumento es el icono.

MUNDO

Linux

54

Interfaces grficas con wxPython

Programacin

El mtodo ShowModal() muestra el cuadro en pantalla. Habremos observado que estas lneas se encuentran dentro de un bloque try-except, se trata del manejo de excepciones que nos ofrece Python. En caso de que ocurra una excepcin al generar el fichero, se ejecutar el cdigo del bloque except, que en este caso muestra otro cuadro de dilogo indicndole al usuario que ha ocurrido un error. En las dos primeras lneas del listado 5 podemos ver la creacin de otro cuadro modal distinto. Se trata del tpico cuadro Save as... que permite al usuario guardar un fichero en un directorio del sistema de ficheros. La funcin se llama wxFileDialog y recibe como parmetros el ttulo del cuadro de dilogo, el tipo de ficheros que debe mostrar y una constante que indica el tipo de cuadro, en este caso wxSAVE. Observemos cmo en la lnea 2 preguntamos si el mtodo ShowModal() es igual a wxID_OK, en cuyo caso pasaremos a la creacin del fichero. Esta condicin se dar cuando el usuario seleccione el nombre del fichero a salvar y pulse el botn OK. La aplicacin estar esperando a que se produzca ese evento.

Conclusiones
Esperamos que este artculo le haya servido al lector de aproximacin al mundo de wxPython. A travs de un ejemplo concreto, hemos pretendido realizar un vistazo a las posibilidades que puede ofrecernos este mdulo de Python. Como hemos podido comprobar, se trata de una completa librera para escribir aplicaciones con una GUI moderna y consistente. Una de sus principales ventajas es la multiplataforma. El ahorro de lneas de programacin es muy significativo. Si adems le aadimos las ventajas que de por s nos ofrece Python, encontramos en el binomino Python-wxPython una alternativa muy a tener en cuenta en el futuro de las aplicaciones. GNU/Linux es una plataforma ideal para el desarrollo de aplicaciones con wxPython. En este caso es importante el papel de las libreras de GTK+. Uniendo todos estos elementos conseguimos un completo entorno de desarrollo en software libre. Quiz echamos en falta un completo IDE que nos permita disear de forma grfica la interfaz,

as com editar cdigo, depurarlo, ejecutarlo, etc. Pues bien, por ahora podemos contar con BoaConstructor, que es un IDE que pretender cubrir este hueco. De momento se encuentra en versin alpha, aunque podemos trabajar sin problemas con la ltima versin. Gracias a este IDE, escrito en Python, nuestro trabajo se simplificar y podemos considerarlo como una verdadera herramienta para el RAD (desarrollo rpido de aplicaciones). Muchos desarrolladores piensan que wxPython debe convertirse en el estndar para desarrollar aplicaciones con interfaz grfica de usuario en Python. De hecho, algunos consideran que se trata de la forma ms rpida de migrar las aplicaciones realizadas con MFC para que puedan ejecutarse en entornos UNIX y Mac OS.

Figura 6. El site de wxPython.

igidbc.py
El autor ofrece el programa jgjdbc.py, escrito en Python, bajo licencia GPL, disponible en el rea de descargas de Mundo Linux, www. revistasprofesionales.com. Este programa genera un fichero XML con los datos necesarios para utilizar un pool de conexiones de BD a travs de un Datasource en el servidor de aplicaciones JBoss. Lo crea para el SGBD que le indiquemos. Habitualmente hay que realizar esta tarea manualmente porque no hay una herramienta que automatice el proceso.

Referencias
q Proyecto q Proyecto

wxWindows: http://www.wxwindows.org wxPython: http://www.wxpython.org q Lenguaje Python: http://www.python.org q Descargas de wxPython: http://www.wxpython.org/dowload q Wiki site muy completo sobre wxPython: http://wiki.python.org q Gua de estilo para codificar en Python: http://www.python.org/peps/pep-0008.html q IDE para RAD en Python con wxPython: http://boa-constructor.sourceforge.net q Open Source Initiative: http://www.opensource.org
MUNDO

55

Linux

También podría gustarte