[wxPython-users] wxPython and MVC

Mark Erbaugh mark at microenh.com
Sun Dec 2 19:46:43 PST 2007


On Mon, 2007-12-03 at 11:32 +0800, Pan Xingzhi wrote:
> Hi Mark,
> 
>     The controller must know something about the view, so it can
> update the view according to the model.
>     However I'm not sure with the "stub" thing you wrote. What's the
> good out of that? Why can't we just bind some function in the
> controller as event handlers? 
> 
> Cheers,
>     Harry Pan
> 
> 2007/12/3, Mark Erbaugh <mark at microenh.com>:
>         I'm trying to develop applications along the lines of
>         model-view-controller design.
>         
>         I think the frame class is the view portion. However, the
>         event handling
>         routines are part of the controller.  How do people separate
>         them? 
>         
>         What I've been doing is writing "stub" event handlers for each
>         event
>         that basically just pass the event off to a controller object,
>         if one
>         exists.
>         
>         
>         # in view
>         def onClick(self, event): 
>             if self.controller:
>                 self.controller.onClick(self, event)
>         
>         # in controller
>         def onClick(self, view, event):
>             # here view gives the controller access to the view object
>             # (GUI frame instance) 
>         
>         Is there a better way?
>         
>         Also, my concept of the controller is that it is independent
>         of the
>         mechanism used to provide the GUI, so I don't want to import
>         wx into it.
>         That means that sometimes end up writing more code in the GUI.
>         For 
>         example, if the controller needs to display a dialog box, I
>         have a
>         method in the GUI frame to do that. The controller can then
>         access the
>         dialog using this method on the GUI frame. It gets the GUI
>         frame's
>         instance as the first parameter of its event handling code.
>         
>         Thanks,
>         Mark

Harry,

Thanks for the reply.  After reading more about wxPython event handling,
I'm experimenting with that approach now and it looks like it may work.
I agree that the controller will have to know something about the view
so I added a 'view' data member to the controller object.  However, the
controller object only accesses specific methods in the view object, it
doesn't directly access wxPython features.

For example, to populate a wxListBox, the controller would call a method
view.setListBox(data).  The method in the view class would then call the
appropriate wxPython method (or methods) to populate the list box.

This way, if I would ever use a different GUI object, such as a
web-based interface, it would only have to implment a setListBox(data)
method and I could use the same controller.  Ideally, the same program
could run with a desktop interface with wxPython, or even Tkinter) or a
web-based interface.

Mark





More information about the wxpython-users mailing list