wxPython es un binding de la biblioteca gráfica wxWidgets para el lenguaje de programación Python. La biblioteca wxWidgets se caracteriza por ser multiplataforma, por lo que su uso junto a Python permite el desarrollo rápido de aplicaciones gráficas multiplataforma.

Para desarrollar una aplicación en wxPython, normalmente primero debe crearse una clase heredada de wx.Frame:

import wx

class MiAplicacion(wx.Frame):
def __init__(self,parent,title):
wx.Frame.__init__(self,parent,title=title,size=(600,400))

En el código anterior primero se importa el módulo wx, enseguida se define una clase llamada MiAplicacion, la cual hereda de wx.Frame. El método __init__ de la clase creada debe contener al menos dos argumentos de entrada, self y parent, donde self es una cadena utilizada por convención para referenciar a un objeto de la propia clase y parent es el objeto gráfico padre del Frame que se creará cuando instanciemos un objeto de esta clase. El otro argumento definido, title, será una cadena que se mostrará en la parte superior de la ventana. El método __init__ podría considerarse como el "constructor" de la clase, cuando instanciemos un objeto de esa clase, se pasarán como argumentos de entrada los parámetros definidos en __init__, exceptuando self.

Una vez definida la clase, ahora vamos a instanciar un objeto de esa clase como sigue:

if __name__=='__main__':
app = wx.App()
frame = MiAplicacion(None, u"Mi aplicación")
frame.Show()
app.MainLoop()

Primero se crea un objeto de la clase wx.App, el cuál se encargará de "lanzar" la aplicación y ejecutar las órdenes necesarias para poder interactuar con la interfaz gráfica. Luego, se define un objeto frame de la clase MiAplicación, teniendo como primer argumento None, indicando que no tendrá un objeto gráfico padre, como segundo argumento se pasa una cadena de texto con el título que queremos colocar en la parte superior de la ventana. Finalmente, el método MainLoop de la clase wx.App inicia la aplicación wxPython. En la siguiente figura se muestra la ventana resultante.



Es recomendable que el método Show sea implementado dentro del método __init__ de la clase derivada de wx.Frame, además podemos centrar la interfaz gráfica en la pantalla para obtener una mejor visualización, quedando nuestro código como sigue:

# -*- coding: utf8 -*-
import wx

class MiAplicacion(wx.Frame):
def __init__(self,parent,title):
wx.Frame.__init__(self,parent,title=title,size=(600,400))
self.Centre(True)
self.Show()

if __name__=='__main__':
app = wx.App()
frame = MiAplicacion(None, u"Mi aplicación")
app.MainLoop()

¿Y... cómo añadir controles?

Hasta ahora tenemos simplemente la ventana de la aplicación, sin ningún tipo de control gráfico que nos permita interactuar con el programa. Para añadir controles, en principio, la cuestión no es muy complicada, sólo habrá que especificar el tipo de control y algunos parámetros requeridos, véase el ejemplo a continuación que muestra como agregar un campo de texto editable (wx.TextCtrl) que permite emular un editor de texto plano:

# -*- coding: utf8 -*-
import wx

class MiAplicacion(wx.Frame):
def __init__(self,parent,title):
wx.Frame.__init__(self,parent,title=title,size=(400,300))
boton = wx.TextCtrl(self, style=wx.TE_MULTILINE)
self.Centre(True)
self.Show()

if __name__=='__main__':
app = wx.App()
frame = MiAplicacion(None, u"Mi aplicación")
app.MainLoop()



Como puede observarse, en el código sólo se añade una línea, en la cual se instancia un objeto de la clase wx.TextCtrl, pasándole como parent el Frame principal, y el argumento style especificando que se permita el uso de líneas múltiples dentro de ese control.

¿Y si quiero añadir más controles?, bueno aquí la cuestión se complica un poco, pero vamos, nada que no se pueda resolver. Aunque para ello ha de introducirse otro concepto básico en el desarrollo de aplicaciones en wxPython: los Sizers, que son clases que permiten alinear y organizar los objetos dentro de una ventana o contenedores, mediante algoritmos de posicionamiento. Evidentemente esto lo estaremos tratando en otro post, para no alargarnos demasiado.

Para tener una referencia más sólida respecto al desarrollo de aplicaciones en wxPython es recomendable que revisen el siguiente libro:

wxPython in Action [Noel Rappin and Robin Dunn]