Hola Mundo “Extended”

Haremos un “Hola Mundo” con wxPython, pero con algo más que un simple “Hola Mundo”.
Nuestro programa script, será similar a un editor de textos (como el Notepad de Güindous), con la diferencia de que por defecto, nos mostrará una plantilla de carta comercial y la guardará automáticamente en una carpeta destinada a almacenar todas nuestras cartas.

Lo que haremos se verá así:

Para hacer este ejemplo, me inspiré en la Guía oficial de Primeros Pasos con wxPython. De esta forma, será más simple entender la documentación oficial.

Instalación de wxPython

El primer paso, será instalar wxPython.

En Linux será necesario el paquete: python-wxgtk2.8. En aquellos basados en Debian, basta con hacer:
sudo apt-get install python-wxgtk2.8

En Gentoo:
emerge wxpython

Para RedHat, Fedora, Mandriva y compañía, pueden buscar los rpm de la versión 2.8.12.0 en este enlace www.rpmfind.net/…search.php?query=wxPython o instalarlo con yum (como root):
yum install wxPython

Para Windows y Mac OS
Descargar instalador en www.wxpython.org/download.php

Dudas/problemas sobre instalación: Visitar http://wiki.wxpython.org/How%20to%20install%20wxPython

Introducción

wxPython es una suite de librerías de interfaces gráficas para Python (programadas en C++), destinadas a crear GUIs de forma simple. Funciona como un módulo más de Python, debiendo ser importado al igual que cualquier otro.

Cómo principales características de wxPython pueden citarse:

  1. Portabilidad: Windows, Linux y Mac OS X
  2. Apariencia: Nativa en todos los S.O.
  3. Licencia: LGPL
Archivos del Ejemplo

Para nuestro creador de cartas comerciales necesitaremos 2 archivos:

Descargar ambos archivos, guardarlos en una carpeta y, dentro de esta, crear un sub-directorio llamado cartas. En este sub-directorio, se guardarán automáticamente las cartas que vayamos creando.

Para correrlo, simplemente haremos python editor.py y se ejecutará el script en modo gráfico.

Utilizando wxpython en 6 pasos

  1. Importar wxPython:
    import wx
  2. Crear una clase extendida de wx.Frame:
    class MiClase(wx.Frame)
  3. Crear los métodos necesarios de la clase. Aquí, además de definir algoritmos propios, es donde se harán las llamadas a los métodos de wxPython y wxWidgets (ver más adelante)
  4. Finalmente, crear una instancia de wx.App:
    app = wx.App(False)
  5. Otra instancia de nuestra clase:
    ventana = MiClase(None, “Título de la ventana”)
  6. Llamar a MainLoop del objeto app para mantener activo el programa:
    app.MainLoop()

Creando métodos de la clase

Los métodos de la clase, lógicamente dependerán de lo que queramos que nuestro programa realice. Estos métodos variarán de acuerdo a cada programa. La “fórmula” a seguir, será recomendable que se desarrolle de la siguiente manera:

Definir el método __init__

Definir el __init__ de la clase, cuyo parámetro sea (además de self), parent. Esto garantizará hacer siempre una referencia al elemento “parent” (padre) del objeto que se esté instanciando.

En nuestro caso, cuando instanciamos al editor, como ventana “padre” le estamos indicando “None” (ninguna), ya que es la primera ventana que estamos instanciando:
frame = Editor(None, APP_TITLE)

En este ejemplo, además, hay un segundo parámetro que corresponde al título de la ventana. Pero éste, podríamos haberlo evitado, si lo definíamos directamente en el __init__. No lo hicimos, para poder extender el día de mañana, este ejemplo, instanciando otras ventanas con un nombre diferente.

En el __init__, además, se debe inicializar al propio wx.Frame:
wx.Frame.__init__(self, parent, title=title, size=(800, 600))

Como se puede ver, a wx.Frame se le pueden pasar diversos parámetros. En nuestro caso, un título de ventana y las medidas de la misma (ancho, alto).

Es importante además, siempre llamar al método Show(), ya que de lo contrario, la ventana nunca se visualizará:
self.Show(True)

Por otro lado, en el método __init__ deben establecerse todas las propiedades de clase y llamar a aquellos métodos que se encarguen de generar toda la GUI.

Incrustando widgets

wxPython, utiliza wxWidgets. Estos “Widgets” serán todos aquellos elementos que se irán incrustando en el contenedor (frame). Una lista completa de los Widgets implementados por wxPython, puede econtrarse en http://docs.wxwidgets.org/2.8/wx_wxpython.html#wxpclasses.

Para utilizar cualquiera de estos Widgets, deben ser considerados como métodos de wx, simplemente utilizando la sintaxis wx.Widget(parametros).

Widgets utilizados en nuestro creador de cartas comerciales

En nuestro script, los widgets utilizados son:

wx.TextCtrl()
Control de entrada de texto que permite mostrar y editar su contenido. Puede ser de una sola línea o multilínea.
Con el parámetro value se define el contenido por defecto, mientras que style debe ser definido con las constantes de estilo del control.

wx.Menu()
Un menú ya sea como lista desplegable o ventana emergente (pop-up) que permite seleccionar un elemento capturando el evento y actuando en consecuencia.

wx.MenuBar()
Una barra conteniendo una serie de menús accesibles desde la parte superior de la ventana.

wx.MessageDialog()
Un cuadro de diálogo que muestra un mensaje de una o varias líneas, con botones de opción como Aceptar, Sí, No y Cancelar. Este Widget recibe como parámetros: parent la ventana “padre”, mensaje, titulo y estilo.

Ver lista completa de wxWidgets implementados por wxPython.

Llamando a los métodos heredados de wx.Frame

wx.Frame es una clase del módulo wx, que hereda de otras y por lo tanto, pone a nuestra disposición, una larga lista de métodos, a los cuáles accederemos simplemente mediante self.Metodo().

Los métodos que utilizamos en nuestro código son:

wx.Frame.CreateStatusBar()
Genera la barra de estado de la ventana.

wx.Frame.SetMenuBar()
Se encarga de crear la barra de menú con todos los wxWidgets configurados.

wx.EvtHandler.Bind()
Captura un evento y lo enlaza a un controlador de eventos.

wx.SizerFlags.Centre()
Centra la ventana en el medio de la pantalla.

wx.Window.Show()
Muestra (u oculta) la ventana.

wx.Window.Close()
Cierra la ventana.

Conclusión

Para utilizar cualquier interfaz gráfica en Python, solo es necesario:

  1. Saber Python (para programar algo y no solo mostrar ventanas con menús, textos y botones que no hagan nada)
  2. Entender la sintaxis y semántica de la programación orientada a objetos (para entender como funcionan las librerías gráficas)
  3. Tener a mano la guía de referencias de la interface gráfica a utilizar (simplemente, para saber “el nombre” de los métodos y objetos a los cuales recurrir, para “mostrar gráficamente” aquello que tuvimos que programar en Python)