jueves, 28 de enero de 2010

wxPython , pilares fundamentales

Los pilares fundamentales en los que se sustenta una aplicación wxPython son dos: el objeto aplicación (application object) y el objeto top level (top level window object), es decir, el objeto principal, que normalmente será un frame ó ventana principal. Si utilizamos estos dos objetos de forma correcta daremos a nuestra aplicación wxPython una base fuerte a partir de la cual trabajar, haciendo más fácil el trabajo de construcción de la aplicación.

Veamos el siguiente código:

# -*- coding: cp1252 -*-

'''Programa de ejemplo'''

import wx

class frame(wx.Frame):
pass

class App(wx.App):
def OnInit(self):
self.frame = frame(parent=None, title='Titulo')
self.frame.Show()
self.SetTopWindow(self.frame)
return True

app = App()
app.MainLoop()

¿Y cómo funciona este programa? En primer lugar podemos observar que instanciamos un objeto a partir de la subclase App(), esto es, app = App(). Así el objeto de aplicación será app. La clase App() es subclase de wx.App, por lo que al instanciar App() ejecutamos el método OnInit(), el cual, como vemos en el código, crea un objeto self.frame que es instanciado a partir de la clase frame (que es a su vez subclase de wx.Frame). Parece consufo, pero en realidad no lo es. Esto es orientación a objetos. A continuación, mediante el método SetTopWindow, indicamos que queremos que el objeto self.frame sea el Top Level Window Object de la aplicación. Finalmente, mediante app.MainLoop() el objeto aplicación queda a la espera de que se produzcan eventos. Es decir, el método MainLoop() lo que hace es recibir eventos disparados por componentes del Top Level Window Object y enviar eventos al manejador de eventos apropiado.

Cada aplicación wxPython necesita un objeto aplicación, y dicho objeto aplicación debe ser una instancia de la clase wx.App, o una instancia de una subclase de wx.App. Por tanto, para crear y usar una subclase de wx.App es necesario seguir estos cuatro pasos:
1) Definir la subclase.
2) Escribir un método OnInit() dentro de la definición de la subclase.
3) Crear una instancia de la clase en la sección principal del programa.
4) Llamar al método MainLoop() de la instancia de la aplicación. Este método transfiere el control del progama a wxPython.

Si miramos en el ejemplo podemos observar que el método OnInit() devuelve True. Esto es debido a que este método devuelve un booleano, y si devolviera False la aplicación
terminaría inmmediatamente. Esto puede ser útil si queremos poner ciertos requisitos antes que la aplicación arranque, devolviendo True si todo está bien ó False si no queremos que se ejecute. Por ejemplo, la existencia de un fichero .ini de configuración, si existe, se devuelve True, y si no existe False.

Si la aplicación que queremos construir trata ó contiene solo un frame, y solo uno, hay una forma más sencilla y fácil de crearla, mediante la clase wx.PySimpleApp, del siguiente modo:

# -*- coding: cp1252 -*-

import wx

class NuevoFrame(wx.Frame): pass

app = wx.PySimpleApp()
frame = NuevoFrame(None, title='Hola')
frame.Show(True)
app.MainLoop()

Como vemos, creamos una instancia de wx.PySimpleApp(). Vemos que ya ho hay método OnInit(), por lo que a continuación definimos el frame, que será por defecto el top level. A continuación lo mostramos y ejecutamos el MainLoop, como siempre. Con esto vemos que usando wx.PySimpleApp podemos ejecutar un programa wxPython sin necesidad de crear una clase de aplicación propia. Recordar que este tipo de construcción solo se usa si la aplicación es sencilla y no necesita de ningún tipo de parámatros o variables globales.

Por úlimo comentar que el ciclo de vida de una aplicación wxPython comienza cuando la instancia aplicación se crea y termina justo cuando la última ventana de la aplicación se cierra, aunque esto no corresponde necesariamente con el principio y final del script en Python. Es decir, podría haber código de script Python antes de que se cree la instancia de aplicación y después del MainLoop. Sin embargo, toda la actividad de wxPython debe estar incluida dentro de la vida del objeto aplicación.

No hay comentarios:

Publicar un comentario