MVC programming with python (newbie) - please help
Frank Niessink
frank at niessink.com
Fri Jan 6 17:36:04 EST 2006
bwaha wrote:
>
> At some level this seems to me like the class ListDataModel above. I just
> need to make a MyTreeControl class. However here GS(et) routines are
> implemented in the ProjectFileDecoder class (data model?) whereas in the
> earlier advice they are in class MyCoolListControl. So I'm not understanding
> how data gets from the DataModel class to the ListControl class. After all
> the words I've said, I think that's the core misunderstanding I have.
>
> Hope someone can help clear that up for me.
You may want to look at the wxPython "virtual" ListCtrl (see the
wxPython demo). Whenever a virtual ListCtrl is refreshed it will call
specific methods on itself to get the appropriate content, e.g.
OnGetItemText(self, rowIndex, columnIndex). You can do whatever you want
in that method as long as you return the text that has to be displayed
in the row with index rowIndex and the column with index columnIndex.
One option would be to subclass wx.ListCtrl and provide something like
your ListDataModel, like this (tested):
import wx
class MyCoolListControl(wx.ListCtrl):
def __init__(self, *args, **kwargs):
# don't pass the model argument to wx.ListCtrl:
self._model = kwargs.pop('model')
# force virtual mode:
kwargs['style'] = wx.LC_VIRTUAL|kwargs['style']
super(MyCoolListControl, self).__init__(*args, **kwargs)
def OnGetItemText(self, rowIndex, columnIndex=0):
return self._model.getItemText(rowIndex, columnIndex)
# and similarly for OnGetItemImage and OnGetItemAttr
class ListDataModel(object):
def getItemText(self, rowIndex, columnIndex):
return 'Text in row %d, column %d'%(rowIndex, columnIndex)
app = wx.App(0)
model = ListDataModel()
window = wx.Frame(None)
cool = MyCoolListControl(window, model=model, style=wx.LC_LIST)
cool.SetItemCount(1000000) # This triggers a refresh of the list ctrl
window.Show()
app.MainLoop()
In a similar vein you could use this scheme for wx.TreeCtrl, though that
requires (much) more work because the TreeCtrl has no build-in virtual
mode. That's what I did for the TreeListCtrl in Task Coach
(http://taskcoach.niessink.com), see
http://cvs.sourceforge.net/viewcvs.py/taskcoach/taskcoach/taskcoachlib/widgets/treectrl.py?view=markup
HTH, Frank
More information about the Python-list
mailing list