3 import wx
.grid
as gridlib
4 #import wx.lib.mixins.grid as mixins
6 #---------------------------------------------------------------------------
8 class SimpleGrid(gridlib
.Grid
): ##, mixins.GridAutoEditMixin):
9 def __init__(self
, parent
, log
):
10 gridlib
.Grid
.__init
__(self
, parent
, -1)
11 ##mixins.GridAutoEditMixin.__init__(self)
15 self
.Bind(wx
.EVT_IDLE
, self
.OnIdle
)
17 self
.CreateGrid(25, 25) #, wxGrid.wxGridSelectRows)
18 ##self.EnableEditing(False)
20 # simple cell formatting
21 self
.SetColSize(3, 200)
22 self
.SetRowSize(4, 45)
23 self
.SetCellValue(0, 0, "First cell")
24 self
.SetCellValue(1, 1, "Another cell")
25 self
.SetCellValue(2, 2, "Yet another cell")
26 self
.SetCellValue(3, 3, "This cell is read-only")
27 self
.SetCellFont(0, 0, wx
.Font(12, wx
.ROMAN
, wx
.ITALIC
, wx
.NORMAL
))
28 self
.SetCellTextColour(1, 1, wx
.RED
)
29 self
.SetCellBackgroundColour(2, 2, wx
.CYAN
)
30 self
.SetReadOnly(3, 3, True)
32 self
.SetCellEditor(5, 0, gridlib
.GridCellNumberEditor(1,1000))
33 self
.SetCellValue(5, 0, "123")
34 self
.SetCellEditor(6, 0, gridlib
.GridCellFloatEditor())
35 self
.SetCellValue(6, 0, "123.34")
36 self
.SetCellEditor(7, 0, gridlib
.GridCellNumberEditor())
38 self
.SetCellValue(6, 3, "You can veto editing this cell")
40 #self.SetRowLabelSize(0)
41 #self.SetColLabelSize(0)
43 # attribute objects let you keep a set of formatting values
44 # in one spot, and reuse them if needed
45 attr
= gridlib
.GridCellAttr()
46 attr
.SetTextColour(wx
.BLACK
)
47 attr
.SetBackgroundColour(wx
.RED
)
48 attr
.SetFont(wx
.Font(10, wx
.SWISS
, wx
.NORMAL
, wx
.BOLD
))
50 # you can set cell attributes for the whole row (or column)
51 self
.SetRowAttr(5, attr
)
53 self
.SetColLabelValue(0, "Custom")
54 self
.SetColLabelValue(1, "column")
55 self
.SetColLabelValue(2, "labels")
57 self
.SetColLabelAlignment(wx
.ALIGN_LEFT
, wx
.ALIGN_BOTTOM
)
59 #self.SetDefaultCellOverflow(False)
60 #r = wxGridCellAutoWrapStringRenderer()
61 #self.SetCellRenderer(9, 1, r)
64 self
.SetCellValue( 9, 1, "This default cell will overflow into neighboring cells, but not if you turn overflow off.");
65 self
.SetCellSize(11, 1, 3, 3);
66 self
.SetCellAlignment(11, 1, wx
.ALIGN_CENTRE
, wx
.ALIGN_CENTRE
);
67 self
.SetCellValue(11, 1, "This cell is set to span 3 rows and 3 columns");
70 editor
= gridlib
.GridCellTextEditor()
71 editor
.SetParameters('10')
72 self
.SetCellEditor(0, 4, editor
)
73 self
.SetCellValue(0, 4, "Limited text")
77 self
.Bind(gridlib
.EVT_GRID_CELL_LEFT_CLICK
, self
.OnCellLeftClick
)
78 self
.Bind(gridlib
.EVT_GRID_CELL_RIGHT_CLICK
, self
.OnCellRightClick
)
79 self
.Bind(gridlib
.EVT_GRID_CELL_LEFT_DCLICK
, self
.OnCellLeftDClick
)
80 self
.Bind(gridlib
.EVT_GRID_CELL_RIGHT_DCLICK
, self
.OnCellRightDClick
)
82 self
.Bind(gridlib
.EVT_GRID_LABEL_LEFT_CLICK
, self
.OnLabelLeftClick
)
83 self
.Bind(gridlib
.EVT_GRID_LABEL_RIGHT_CLICK
, self
.OnLabelRightClick
)
84 self
.Bind(gridlib
.EVT_GRID_LABEL_LEFT_DCLICK
, self
.OnLabelLeftDClick
)
85 self
.Bind(gridlib
.EVT_GRID_LABEL_RIGHT_DCLICK
, self
.OnLabelRightDClick
)
87 self
.Bind(gridlib
.EVT_GRID_ROW_SIZE
, self
.OnRowSize
)
88 self
.Bind(gridlib
.EVT_GRID_COL_SIZE
, self
.OnColSize
)
90 self
.Bind(gridlib
.EVT_GRID_RANGE_SELECT
, self
.OnRangeSelect
)
91 self
.Bind(gridlib
.EVT_GRID_CELL_CHANGE
, self
.OnCellChange
)
92 self
.Bind(gridlib
.EVT_GRID_SELECT_CELL
, self
.OnSelectCell
)
94 self
.Bind(gridlib
.EVT_GRID_EDITOR_SHOWN
, self
.OnEditorShown
)
95 self
.Bind(gridlib
.EVT_GRID_EDITOR_HIDDEN
, self
.OnEditorHidden
)
96 self
.Bind(gridlib
.EVT_GRID_EDITOR_CREATED
, self
.OnEditorCreated
)
99 def OnCellLeftClick(self
, evt
):
100 self
.log
.write("OnCellLeftClick: (%d,%d) %s\n" %
101 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
104 def OnCellRightClick(self
, evt
):
105 self
.log
.write("OnCellRightClick: (%d,%d) %s\n" %
106 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
109 def OnCellLeftDClick(self
, evt
):
110 self
.log
.write("OnCellLeftDClick: (%d,%d) %s\n" %
111 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
114 def OnCellRightDClick(self
, evt
):
115 self
.log
.write("OnCellRightDClick: (%d,%d) %s\n" %
116 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
119 def OnLabelLeftClick(self
, evt
):
120 self
.log
.write("OnLabelLeftClick: (%d,%d) %s\n" %
121 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
124 def OnLabelRightClick(self
, evt
):
125 self
.log
.write("OnLabelRightClick: (%d,%d) %s\n" %
126 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
129 def OnLabelLeftDClick(self
, evt
):
130 self
.log
.write("OnLabelLeftDClick: (%d,%d) %s\n" %
131 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
134 def OnLabelRightDClick(self
, evt
):
135 self
.log
.write("OnLabelRightDClick: (%d,%d) %s\n" %
136 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
139 def OnRowSize(self
, evt
):
140 self
.log
.write("OnRowSize: row %d, %s\n" %
141 (evt
.GetRowOrCol(), evt
.GetPosition()))
144 def OnColSize(self
, evt
):
145 self
.log
.write("OnColSize: col %d, %s\n" %
146 (evt
.GetRowOrCol(), evt
.GetPosition()))
149 def OnRangeSelect(self
, evt
):
151 self
.log
.write("OnRangeSelect: top-left %s, bottom-right %s\n" %
152 (evt
.GetTopLeftCoords(), evt
.GetBottomRightCoords()))
156 def OnCellChange(self
, evt
):
157 self
.log
.write("OnCellChange: (%d,%d) %s\n" %
158 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
160 # Show how to stay in a cell that has bad data. We can't just
161 # call SetGridCursor here since we are nested inside one so it
162 # won't have any effect. Instead, set coordinates to move to in
164 value
= self
.GetCellValue(evt
.GetRow(), evt
.GetCol())
166 if value
== 'no good':
167 self
.moveTo
= evt
.GetRow(), evt
.GetCol()
170 def OnIdle(self
, evt
):
171 if self
.moveTo
!= None:
172 self
.SetGridCursor(self
.moveTo
[0], self
.moveTo
[1])
178 def OnSelectCell(self
, evt
):
179 self
.log
.write("OnSelectCell: (%d,%d) %s\n" %
180 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
182 # Another way to stay in a cell that has a bad value...
183 row
= self
.GetGridCursorRow()
184 col
= self
.GetGridCursorCol()
186 if self
.IsCellEditControlEnabled():
187 self
.HideCellEditControl()
188 self
.DisableCellEditControl()
190 value
= self
.GetCellValue(row
, col
)
192 if value
== 'no good 2':
193 return # cancels the cell selection
198 def OnEditorShown(self
, evt
):
199 if evt
.GetRow() == 6 and evt
.GetCol() == 3 and \
200 wx
.MessageBox("Are you sure you wish to edit this cell?",
201 "Checking", wx
.YES_NO
) == wx
.NO
:
205 self
.log
.write("OnEditorShown: (%d,%d) %s\n" %
206 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
210 def OnEditorHidden(self
, evt
):
211 if evt
.GetRow() == 6 and evt
.GetCol() == 3 and \
212 wx
.MessageBox("Are you sure you wish to finish editing this cell?",
213 "Checking", wx
.YES_NO
) == wx
.NO
:
217 self
.log
.write("OnEditorHidden: (%d,%d) %s\n" %
218 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
222 def OnEditorCreated(self
, evt
):
223 self
.log
.write("OnEditorCreated: (%d, %d) %s\n" %
224 (evt
.GetRow(), evt
.GetCol(), evt
.GetControl()))
228 #---------------------------------------------------------------------------
230 class TestFrame(wx
.Frame
):
231 def __init__(self
, parent
, log
):
232 wx
.Frame
.__init
__(self
, parent
, -1, "Simple Grid Demo", size
=(640,480))
233 grid
= SimpleGrid(self
, log
)
237 #---------------------------------------------------------------------------
239 if __name__
== '__main__':
241 app
= wx
.PySimpleApp()
242 frame
= TestFrame(None, sys
.stdout
)
247 #---------------------------------------------------------------------------