[wxPython-users] Learning the MVP Pattern

Christopher Barker Chris.Barker at noaa.gov
Wed Nov 22 13:46:01 PST 2006


Rich Shepard wrote:

>   I understand the concept of namespaces, and I think that I now have a 
> good handle on scope. It's finding non-trivial applications from which I can see
> how to do what I'm trying to do that has been difficult.

non-trivial examples are needed to help figure out how you want to 
structure you code, but many of the errors you have posted here are 
namespace issues. I think they result due to re-factoring, so the seem 
name doesn't mean the same thing in a different context.

>   The two things I've not yet mastered, and they're simple but critical
> concepts are 1) how to call the function in a different module (.py)

umm:

import modulename
modulename.functionName(...)

There's got to be more to your confusion.

 > and
> whether that module needs a class to contain all the functions,

ahh -- I think this may be it.

No a module doesn't need a class to contain all functions (example above 
-- no class). However, the only time I'd put a function in a module 
outside of a class is when it is a simple "takes input, gives output" 
function:

def square(x):
     return x*x

If the function needs to manipulate a dataset, then you need to keep 
track of that data somewhere. We're using an OO language, so that 
somewhere is a class. In theory, you can manipulate data in the module 
namespace directly, but then you need to use global all over the place, 
and you can't have more than one version (instance) of your data.

So most of the time, I have classes in my modules. If it looks like a 
application is going to have only a single instance of a class, and I 
want to be able to access that instance from a number of places in my 
code ( I use this for configuration data, for instance), I'll create and 
instantiate a class in a module on import:

#ConfigData.py
class SomeDataClass:
      ...
      ...

AppData = SomeData()


Now, in any other module, I can do:

import ConfigData

AppData = ConfigData.AppData

AppData.GetSomething()

AppData.AddSomething()

etc, etc.

2) how to implement the called function.

Well, there's no general advise for that! except maybe standard OO 
design -- a class holds a set of data, and the methods for manipulating 
that data.

> it's  tripping
> me up everytime I try to move a method (such as creating a new database or
> opening an existing one) out of the module/class that displays the button
> (or menu item) to invoke that method

Well, creating and Opening a database sounds like something that should 
be done in some kind of Model class:

class MyDataBase():
     ....
     def OpenDataBase(self, DataBaseToOpen):
         ....
         ....

Somewhere you create an instance of the MyDataBase class -- maybe in the 
App OnInit -- or maybe when there is a GUI event that triggers the creation.

Now in your GUI class:

...
class GUI_Element(wx.Something)
     def __init__(self, Database, ...)
         self.DataBase = Database
         # database is an instance of class MyDataBase
         ...

         OpenButton.Bind(wx.EVT_BUTTON, self,OnOpenButton)
     ...
     def OnOpenButton(self, event)
         ...
         <get name of database to open somehow...>
         self.DataBase.OpenDataBase()


So all the GUI_Element class knows is that it has a MyDataBase instance 
as a member, and what methods that class has that it can call. all the 
details of how the data is implemented are inside the MyDataBase class.

Does this help any?

> Happy Thanksgiving,

you too, I hope you can put this down for a few days!

-Chris


-- 
Christopher Barker, Ph.D.
Oceanographer

Emergency Response Division
NOAA/NOS/OR&R            (206) 526-6959   voice
7600 Sand Point Way NE   (206) 526-6329   fax
Seattle, WA  98115       (206) 526-6317   main reception

Chris.Barker at noaa.gov




More information about the wxpython-users mailing list