[Python-es] cómo usar MVC

lopz lowlifebob en gmail.com
Vie Abr 29 02:45:49 CEST 2011


El día 28 de abril de 2011 14:27, Chema Cortes <pych3m4 en gmail.com> escribió:
> 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

Lo he descargado para ver como hace las cosas, pero si la idea es
usarlo no creo que
valga la pena para lo pequeño que es mi proyecto :(
Además la idea es aprender a implementarlo :)

> 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
>
Estos dos los he visto superficialmente y me quedo con el primero por
ser más pequeño

>> 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.

Entonces la idea es pasar todo el objeto de la vista al controlador y que este
se encarge de osar los métodos del modelo y actualizar la vista?

En mi caso, pasar todo el objeto Menu() y el objeto ControlService
(que lo renombraré) al controlador y que este
inicie y pare el modem, osea ahí en el controlador realizar el
.connect (las señales) de los widgets?


> 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.

Pero la queue dónde la crearía? dónde la instanciaría?
para esto me imagino que tengo que crear una clase que meneje la queue
:S

> 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).

Cómo revisa el controlador la cola? en algún thread aparte un while?

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,

Entiendo todo lo anterior como funciona, desde la vista al pulsar un
botón por ej
se llena la cola, añado un objeto que lo procesará el controlador y
actuará dependiendo
del evento, pero no sé como implementarlo, ahí mi problema :s

 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").

Estaba viendo esto y parece ser lo mejor, pero lo más complicado para
implementar
al menos para mí

>
> Ya perdonarás que no ponga código, pero no tengo nada con qué
> ilustrarte. Aún así, espero que te haya aclarado algo.
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>



-- 
lopz es libre, usa --> GNU/linux gentoo

+--[RSA 2048]--+
|  ..o.o=+       |
|   o =o*.+      |
|  . . *oO .      |
|     .EBoo      |
|      o.S         |
+--[lopz.org]--+


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