3
import wx.grid as gridlib
4
import wx.lib.gridmovers as gridmovers
6
#---------------------------------------------------------------------------
8
class CustomDataTable(gridlib.PyGridTableBase):
9
def __init__(self, log):
10
gridlib.PyGridTableBase.__init__(self)
13
self.identifiers = ['id','ds','sv','pr','pl','op','fx','ts']
15
self.rowLabels = ['Row1','Row2','Row3']
17
self.colLabels = {'id':'ID','ds':'Description','sv':'Severity',
18
'pr':'Priority','pl':'Platform','op':'Opened?',
19
'fx':'Fixed?','ts':'Tested?'}
21
self.data = [{'id':1010,
22
'ds':"The foo doesn't bar",
31
'ds':"I've got a wicket in my wocket",
40
'ds':"Rectangle() returns a triangle",
50
#--------------------------------------------------
51
# required methods for the wxPyGridTableBase interface
53
def GetNumberRows(self):
56
def GetNumberCols(self):
57
return len(self.identifiers)
59
def IsEmptyCell(self, row, col):
60
id = self.identifiers[col]
61
return not self.data[row][id]
63
def GetValue(self, row, col):
64
id = self.identifiers[col]
65
return self.data[row][id]
67
def SetValue(self, row, col, value):
68
id = self.identifiers[col]
69
self.data[row][id] = value
71
#--------------------------------------------------
72
# Some optional methods
74
# Called when the grid needs to display column labels
75
def GetColLabelValue(self, col):
76
id = self.identifiers[col]
77
return self.colLabels[id]
79
# Called when the grid needs to display row labels
80
def GetRowLabelValue(self,row):
81
return self.rowLabels[row]
83
#--------------------------------------------------
84
# Methods added for demo purposes.
86
# The physical moving of the cols/rows is left to the implementer.
87
# Because of the dynamic nature of a wxGrid the physical moving of
88
# columns differs from implementation to implementation
91
def MoveColumn(self,frm,to):
95
# Move the identifiers
96
old = self.identifiers[frm]
97
del self.identifiers[frm]
100
self.identifiers.insert(to-1,old)
102
self.identifiers.insert(to,old)
106
msg = gridlib.GridTableMessage(
107
self, gridlib.GRIDTABLE_NOTIFY_COLS_DELETED, frm, 1
110
grid.ProcessTableMessage(msg)
112
msg = gridlib.GridTableMessage(
113
self, gridlib.GRIDTABLE_NOTIFY_COLS_INSERTED, to, 1
116
grid.ProcessTableMessage(msg)
120
def MoveRow(self,frm,to):
121
grid = self.GetView()
124
# Move the rowLabels and data rows
125
oldLabel = self.rowLabels[frm]
126
oldData = self.data[frm]
127
del self.rowLabels[frm]
131
self.rowLabels.insert(to-1,oldLabel)
132
self.data.insert(to-1,oldData)
134
self.rowLabels.insert(to,oldLabel)
135
self.data.insert(to,oldData)
140
msg = gridlib.GridTableMessage(
141
self, gridlib.GRIDTABLE_NOTIFY_ROWS_DELETED, frm, 1
144
grid.ProcessTableMessage(msg)
146
msg = gridlib.GridTableMessage(
147
self, gridlib.GRIDTABLE_NOTIFY_ROWS_INSERTED, to, 1
150
grid.ProcessTableMessage(msg)
154
#---------------------------------------------------------------------------
157
class DragableGrid(gridlib.Grid):
158
def __init__(self, parent, log):
159
gridlib.Grid.__init__(self, parent, -1)
161
table = CustomDataTable(log)
163
# The second parameter means that the grid is to take ownership of the
164
# table and will destroy it when done. Otherwise you would need to keep
165
# a reference to it and call it's Destroy method later.
166
self.SetTable(table, True)
168
# Enable Column moving
169
gridmovers.GridColMover(self)
170
self.Bind(gridmovers.EVT_GRID_COL_MOVE, self.OnColMove, self)
173
gridmovers.GridRowMover(self)
174
self.Bind(gridmovers.EVT_GRID_ROW_MOVE, self.OnRowMove, self)
176
# Event method called when a column move needs to take place
177
def OnColMove(self,evt):
178
frm = evt.GetMoveColumn() # Column being moved
179
to = evt.GetBeforeColumn() # Before which column to insert
180
self.GetTable().MoveColumn(frm,to)
182
# Event method called when a row move needs to take place
183
def OnRowMove(self,evt):
184
frm = evt.GetMoveRow() # Row being moved
185
to = evt.GetBeforeRow() # Before which row to insert
186
self.GetTable().MoveRow(frm,to)
188
#---------------------------------------------------------------------------
190
class TestFrame(wx.Frame):
191
def __init__(self, parent, log):
192
wx.Frame.__init__(self, parent, -1, "Custom Table, data driven Grid Demo", size=(640,480))
193
grid = DragableGrid(self, log)
196
#---------------------------------------------------------------------------
198
if __name__ == '__main__':
200
app = wx.PySimpleApp()
201
frame = TestFrame(None, sys.stdout)
205
#---------------------------------------------------------------------------