wxpython grid GRIDTABLE_NOTIFY_ROWS_DELETED

Piet pit.grinja at gmx.de
Sun Nov 21 06:43:21 EST 2004


Hello,
I have written a small program which dynamically displays data from a
data structure in a wx.grid. The grid reacts as expected when the data
structure is enlarged: a new row is added and filled with data. When
data is removed, the data is deleted as expected, but instead of being
removed, a row is being added to the grid. Can anyone explain why?
Here is sample code to illustrate what I mean.
Thanks in advance
Piet
import  wx
import  wx.grid
#---------------------------------------------------------------------------

class XmlTableModel(wx.grid.PyGridTableBase):
    def __init__(self,headers,data):
        wx.grid.PyGridTableBase.__init__(self)
        self.headers = headers
        self.data = data

    def GetNumberRows(self):
        return len(self.data)

    def GetNumberCols(self):
        return len(self.headers)

    def RemoveData(self,rowNum):
        self.data.pop()
        self.GetView().ProcessTableMessage(wx.grid.GridTableMessage(self,wx.grid.GRIDTABLE_NOTIFY_ROWS_DELETED,1))

    def AddData(self,data):
        self.data.append(data)
        self.GetView().ProcessTableMessage(wx.grid.GridTableMessage(self,wx.grid.GRIDTABLE_NOTIFY_ROWS_APPENDED,1))

    def IsEmptyCell(self, row, col):
        try:
            if self.data[row][col] != "":
                return True
            else:
                return False
        except:
            return False

    def GetValue(self, row, col):
        return self.data[row][col]

    def SetValue(self, row, col, value):
        self.data[row][col] = value

    def GetColLabelValue(self, col):
        return self.headers[col]

    def GetDefaultColLabelSize(self):
        return 100

    def GetRowLabelValue(self, row):
        return self.data[row][0]
#---------------------------------------------------------------------------

class TestFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, "Simple Table Model Demo",
size=(640,480))
        self.panel = wx.Panel(self, -1, style=0)
        self.grid = wx.grid.Grid(self.panel)
        self.headers = ["Eins","Zwei","Drei","Vier"]
        self.data = [["A1","A2","A3","A4"],
                     ["B1","B2","B3","B4"],
                     ["C1","C2","C3","C4"],
                     ["D1","D2","D3","D4"]]
        self.grid.SetTable(XmlTableModel(self.headers,self.data),
True)
        self.AddBtn = wx.Button(self.panel, -1, "Add Entry")
        self.AddBtn.SetDefault()
        self.Bind(wx.EVT_BUTTON, self.OnAddEntry, self.AddBtn)
        self.RemoveBtn = wx.Button(self.panel, -1, "Remove Entry")
        self.Bind(wx.EVT_BUTTON, self.OnRemoveEntry, self.RemoveBtn)
        self.bs = wx.BoxSizer(wx.VERTICAL)
        self.bs.Add(self.grid, 1, wx.GROW|wx.ALL, 5)
        self.bs.Add(self.AddBtn)
        self.bs.Add(self.RemoveBtn)
        self.panel.SetSizer(self.bs)

    def OnAddEntry(self, evt):
        self.grid.GetTable().AddData(["NA1","NA2","NA3","NA4"])

    def OnRemoveEntry(self, evt):
        self.grid.GetTable().RemoveData(0)

#---------------------------------------------------------------------------

if __name__ == '__main__':
    import sys
    app = wx.PySimpleApp()
    frame = TestFrame(None)
    frame.Show(True)
    app.MainLoop()
#---------------------------------------------------------------------------



More information about the Python-list mailing list