Últimamente he estado recibiendo la misma pregunta una y otra vez, como organizar el código cuando tienes aplicaciones de escritorio. Y siempre respondo lo mismo con el patrón MVC o el patrón MVP.
Incluso apunto a ejemplos como estos:
http://wiki.wxpython.org/ModelViewPresenter
http://wiki.wxpython.org/ModelViewController
Pero parece ser que los ejemplos no están del todo completos o no funcionan bien en linux o la explicación parece no estar completa.
Así que con el objetivo de llenar ese hueco que hay en la comunidad he decidido hacer este aporte.
wxPython
Para el que no lo conozca wxpython es un framework para manejar interfaces gráficas (GUI), esta basado en wxwidgets de C++ y ademas de simplificarnos mucho la tarea de creación de interfaces gráficas tiene la ventaja que es multiplaforma.
SQLAlchemy
SQLAlchemy de manera muy general es un ORM que le da al desarrollador la flexibilidad de usar objetos e interactuar con la base de datos de una manera bastante cómoda.
Patrón MVP
Antes de empezar a explicar como funciona el patrón MVP vamos a ver el diagrama de como esta estructurado.
Ahora, como pueden ver en el diagrama es bastante simple de interpretar.
El usuario tiene puntos de interacción llamados views. Un view (una vista) por lo regular es una ventana y se encargan únicamente de la presentación de los datos y de traducir eventos como OnPressButton a eventos mas significativos como Save o Delete.
Los views a su vez tienen presenters. Que se encargan de la lógica de la aplicación. Y los presenters guardan una referencia a un view a través de una interfaz pero como python no existe tal cosa usamos duck typing.
Los presenters también poseer ninguna, una o varias referencias a las instancias de los modelos.
Los modelos, son objetos que representan toda la lógica de negocios y regularmente se les delega tareas como: validación de los datos y mapeo de la base de datos.
Una vez que se hayan hecho cambios en instancias de los modelos, los modelos notifican generalmente por medio del patrón observer a los presenters y los presenter a su vez hacen llamadas para reflejar los cambios en las views. Y se hace de esta manera para que los modelos no sepan de la existencia de los presenters.
Walkthrough
models.py
Al principio del modulo se hacen algunos imports necesarios para trabajar con SQLAlchemy, se crea una session que sera el punto de partida para varias operaciones posteriores y se crea el modelo User, el solamente contiene 3 campos, nombre, apellido y correo electrónico.
presenters.py
En este modulo se definen los 3 presenters que manejaran toda la lógica de la aplicación. MainPresenter, UsersPresenter y UserPresenter. Regularmente maneja pocos eventos comunes como OnSave, OnDelete, OnExit y OnChange. La comunicación entre presenters esta manejada por una implementación del patrón observer que ya provee wxpython.
views.py
Aquí es donde esta definido todas las ventanas y donde los eventos son abstraídos y pasados a un mayor nivel de abstracción como los presenters.
main.py
Este archivo solamente es el punto de entrada de la aplicación.
Screenshots
Requisitos: Python 2.7+ SQLAlchemy wxpython
Archivos en mvp.zip
- add.png
- delete.png
- edit.png
- users.png
- main.py
- models.py
- presenters.py
- views.py