[Python-es] cómo usar MVC

Chema Cortes pych3m4 en gmail.com
Jue Abr 28 20:27:06 CEST 2011


El día 28 de abril de 2011 02:21, lopz <lowlifebob en gmail.com> escribió:

> Podrías ponerme un ejemplo de como debería hacerlo?

Me pones en un compromiso, ya que no uso ni gtk ni web2py. Para
implementar bien el patrón MVC se requieren otros patrones como
facade, observer, mediator,... que hace complicado cualquier ejemplo.
Es mejor que te mires algunos de los frameworks MVC que tienes
accesibles para gtk:

pygtkMVC, un MVC básico para GTK:
http://sourceforge.net/apps/trac/pygtkmvc

AVC (Aplication-View-Controller), una implementación MVC que conecta
automáticamente variables y señales para diversos GUIs:
http://avc.inrim.it

PureMVC: un completo patrón MVC para python (y otros lenguajes)
http://trac.puremvc.org/PureMVC_Python


> Dice que la vista no puede dar órdenes, pero al momento de iniciar el
> modem por ej
> cómo sería la cosa?
> Como debo hacer para que al presionar un botón se inicie los 2 servicios?
> Ya con esto de idea podré hacer el resto

Intentaré darte una visión global:

La clase ControlService es en realidad una vista, que instanciaría en
el controlador. Así mismo, también la clase ControlData sería una
vista, aunque movería la parte de actualización de datos al
controlador para mejorar el desacople.

Para establecer una comunicación entre vista y controlador, puede que
lo más fácil de ver sea a través de una cola de eventos. Para ello el
módulo 'queue' de python suele ayudar. Creas una queue donde las
vistas escriban y sólo el controlador lea y borre. En esta queue
(FIFO) van entrando los eventos, simples objetos con dos atributos,
uno de tipo de evento y otro con el mensaje.

En el caso de pulsar el botón de inicio del módem: la vista mete en la
queue un evento de tipo "INIT_MODEM" (por ejemplo). El controlador,
que va revisando la pila, lee el evento y decide actuar: puede
arrancar los dos servicios del modem,...o lanzar un error, o no hacer
nada (que para eso es el que manda). El controlador, después de
procesar el evento y eliminarlo de la pila, manda mensajes de
actualización a las vistas, y sigue con el siguente evento. Los
mensajes enviados pueden ser simples llamadas a los métodos de las
vistas o, para hacerlo más genérico, se podría implementar algún
patrón "observer" que posibilite la actualización conjunta de varios
elementos gráficos a la vez (algo que en gtk se hace normalmente con
"señales").


Ya perdonarás que no ponga código, pero no tengo nada con qué
ilustrarte. Aún así, espero que te haya aclarado algo.


Más información sobre la lista de distribución Python-es