MVC es un arquitectura y hay muchas maneras de implementarla.

Me voy a referir a la única implementación que conozco y esta es la
orientada a objetos.. mediante unas clases que representan cada uno de
los elementos de este patrón. También tengo que aclarar que no soy un
experto en la materia y hablo solamente de la experiencia que he
tenido con Django y PyQt.

En la clase modelo básicamente se especifican los atributos e
implementan las operaciones CRUD (Create Read Update Delete), el
controlador realiza el trabajo de mediar entre el modelo y la vista, y
la vista se encarga de la representacion de los datos.

Para dar un ejemplo especifico hablemos de una aplicación hipotética
que almacene datos sobre libros.

-El modelo se encargaría de almacenar los datos sobre los libros
(digamos titulo y autor) y tendría un método para filtrar los libros
por autor, supongamos.
-El controlador tendría un metodo para realizar una búsqueda por autor
y enviar los datos a una vista para que estos fueran visualizados
-Y la vista mostraría los datos, por ejemplo utilizando html

La ventaja de MVC es que como los elementos están desacoplados, si
inicialmente la aplicacion utiliza archivos planos para almacenar los
datos y después se decide utilizar una base de datos, solo hay que
modificar el modelo. Si se quiere restringir que los libros de cierto
autor aparezan en el resultado de la búsqueda, se modifica el
controlador.Y, si se decide que ya no se van a visualizar los datos en
html, sino en un archivo en formato pdf, se modifica la vista.

Django es un framework para desarrollo de aplicaciones web, como
web2py asi que me imagino qeu deben ser similares. MUY a manera de
ilustración, el código de nuestra a aplicacion hipotética se podría
ver mas o menos así:

El modelo:

Class Libro(Model):
    titulo = CharField(max_length=50)
    autor = CharField(max_length=50)

El controlador (que en django se llama view)

def busqueda_por_autor(request, autor):
   libros = Libro.objects.filter(autor=autor)
   render_to_response('template.html', {'listado':libros})

Y la vista (que en django es el template)

<html>
...
<ul>
{% for libro in listado %}
   <li>{{libro.titulo}}</li>
{% endfor %}
</ul>
...
</html>

No se si la sintaxis del anterior código este bien o mal, el propósito
es mostrar la idea general.

Qt ,que es similar a GTK, maneja Modelo, Delegado, y Vista. Averigua
por PyQt que propociona bindings para python.


Espero haber ayudado y entendido bien la pregunta


Daniel Sarmiento

2011/4/28 Chema Cortes <pych...@gmail.com>:
> El día 28 de abril de 2011 02:21, lopz <lowlife...@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.
> _______________________________________________
> Python-es mailing list
> Python-es@python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/

Responder a