Model View Presenter GUI pattern?

george young gry at ll.mit.edu
Thu Dec 13 23:28:33 CET 2001


Is anyone using the Model View Presenter GUI framework/pattern in python?
I've been reading bits about it, and it sounds quite attractive.  

I've started trying to write a simple MVP module as a basis for an application.
The hardest part is dealing with the overall structure:  my app deals with a
big structured data object and it's hard to picture how the parallel trees of 
models, views, and presenters all get instantiated and linked.   

Below I include my baby mvp.py file (using pygtk) for comment/discussion.  Any comments of 
design/implementation/style etc. are very welcome.

   A few mvp references for the curious:
http://www.object-arts.com/Lib/EducationCentre4/htm/modelviewpresenter.htm
http://www.object-arts.com/EducationCentre/Overviews/ModelViewPresenter.htm
http://www-106.ibm.com/developerworks/library/mvp.html


import gtk
class Topw(gtk.GtkWindow):
    def __init__(self):
        gtk.GtkWindow.__init__(self, gtk.WINDOW_TOPLEVEL)
        self.connect("destroy", gtk.mainquit)
        self.connect("delete_event", gtk.mainquit)


class Observable:
    def __init__(self):
        self.observers = []
    def register(self, o):
        self.observers.append(o)
    def un_register(self, o):
        self.observers.remove(o)
    def notify(self):
        for o in self.observers:
            o.update(self)

class Observer:
    '''Just for clarity, not really needed.'''
    def update(self): pass


class Model(Observable):
    def __init__(self, value=None):
        Observable.__init__(self)
        self.set(value)
    def get(self):
        return self._value
    def set(self, v):
        self._value = v
    def str(self):
        return `self.get()`


class IntegerModel(Model):
    def __init__(self, i):
        Model.__init__(self, i)
    def set(self, i):
        self._value = int(i)
            

class IntegerView(gtk.GtkEntry, Observer):
    def __init__(self):
        gtk.GtkEntry.__init__(self)
        
    def set(self, x):
        self.set_text(`x`)
        
    def clear(self):
        self.delete_text(0, -1)

    def update(self, mod):
        self.set(mod.get())
        

class IntegerPresenter:
    def __init__(self, i=None):
        self.view = IntegerView()
        self.model = IntegerModel(i)
        self.model.register(self.view)
        self.view.connect('changed', self.changed)

    def changed(self, v):
        try:
            self.model.set(int(v.get_text()))
        except ValueError:
            gtk.gdk_beep()


if __name__ == '__main__':
    pres = IntegerPresenter(33)
    topw = Topw()
    topw.add(pres.view)
    topw.show_all()
    gtk.mainloop()



-- 
 I cannot think why the whole bed of the ocean is
 not one solid mass of oysters, so prolific they seem. Ah,
 I am wandering! Strange how the brain controls the brain!
	-- Sherlock Holmes in "The Dying Detective"



More information about the Python-list mailing list