[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