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)#, gridlib.Grid.SelectRows)
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 = gridlib.GridCellAutoWrapStringRenderer()
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")
75 renderer
= gridlib
.GridCellAutoWrapStringRenderer()
76 self
.SetCellRenderer(15,0, renderer
)
77 self
.SetCellValue(15,0, "The text in this cell will be rendered with word-wrapping")
81 self
.Bind(gridlib
.EVT_GRID_CELL_LEFT_CLICK
, self
.OnCellLeftClick
)
82 self
.Bind(gridlib
.EVT_GRID_CELL_RIGHT_CLICK
, self
.OnCellRightClick
)
83 self
.Bind(gridlib
.EVT_GRID_CELL_LEFT_DCLICK
, self
.OnCellLeftDClick
)
84 self
.Bind(gridlib
.EVT_GRID_CELL_RIGHT_DCLICK
, self
.OnCellRightDClick
)
86 self
.Bind(gridlib
.EVT_GRID_LABEL_LEFT_CLICK
, self
.OnLabelLeftClick
)
87 self
.Bind(gridlib
.EVT_GRID_LABEL_RIGHT_CLICK
, self
.OnLabelRightClick
)
88 self
.Bind(gridlib
.EVT_GRID_LABEL_LEFT_DCLICK
, self
.OnLabelLeftDClick
)
89 self
.Bind(gridlib
.EVT_GRID_LABEL_RIGHT_DCLICK
, self
.OnLabelRightDClick
)
91 self
.Bind(gridlib
.EVT_GRID_ROW_SIZE
, self
.OnRowSize
)
92 self
.Bind(gridlib
.EVT_GRID_COL_SIZE
, self
.OnColSize
)
94 self
.Bind(gridlib
.EVT_GRID_RANGE_SELECT
, self
.OnRangeSelect
)
95 self
.Bind(gridlib
.EVT_GRID_CELL_CHANGE
, self
.OnCellChange
)
96 self
.Bind(gridlib
.EVT_GRID_SELECT_CELL
, self
.OnSelectCell
)
98 self
.Bind(gridlib
.EVT_GRID_EDITOR_SHOWN
, self
.OnEditorShown
)
99 self
.Bind(gridlib
.EVT_GRID_EDITOR_HIDDEN
, self
.OnEditorHidden
)
100 self
.Bind(gridlib
.EVT_GRID_EDITOR_CREATED
, self
.OnEditorCreated
)
103 def OnCellLeftClick(self
, evt
):
104 self
.log
.write("OnCellLeftClick: (%d,%d) %s\n" %
105 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
108 def OnCellRightClick(self
, evt
):
109 self
.log
.write("OnCellRightClick: (%d,%d) %s\n" %
110 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
113 def OnCellLeftDClick(self
, evt
):
114 self
.log
.write("OnCellLeftDClick: (%d,%d) %s\n" %
115 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
118 def OnCellRightDClick(self
, evt
):
119 self
.log
.write("OnCellRightDClick: (%d,%d) %s\n" %
120 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
123 def OnLabelLeftClick(self
, evt
):
124 self
.log
.write("OnLabelLeftClick: (%d,%d) %s\n" %
125 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
128 def OnLabelRightClick(self
, evt
):
129 self
.log
.write("OnLabelRightClick: (%d,%d) %s\n" %
130 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
133 def OnLabelLeftDClick(self
, evt
):
134 self
.log
.write("OnLabelLeftDClick: (%d,%d) %s\n" %
135 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
138 def OnLabelRightDClick(self
, evt
):
139 self
.log
.write("OnLabelRightDClick: (%d,%d) %s\n" %
140 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
143 def OnRowSize(self
, evt
):
144 self
.log
.write("OnRowSize: row %d, %s\n" %
145 (evt
.GetRowOrCol(), evt
.GetPosition()))
148 def OnColSize(self
, evt
):
149 self
.log
.write("OnColSize: col %d, %s\n" %
150 (evt
.GetRowOrCol(), evt
.GetPosition()))
153 def OnRangeSelect(self
, evt
):
155 self
.log
.write("OnRangeSelect: top-left %s, bottom-right %s\n" %
156 (evt
.GetTopLeftCoords(), evt
.GetBottomRightCoords()))
160 def OnCellChange(self
, evt
):
161 self
.log
.write("OnCellChange: (%d,%d) %s\n" %
162 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
164 # Show how to stay in a cell that has bad data. We can't just
165 # call SetGridCursor here since we are nested inside one so it
166 # won't have any effect. Instead, set coordinates to move to in
168 value
= self
.GetCellValue(evt
.GetRow(), evt
.GetCol())
170 if value
== 'no good':
171 self
.moveTo
= evt
.GetRow(), evt
.GetCol()
174 def OnIdle(self
, evt
):
175 if self
.moveTo
!= None:
176 self
.SetGridCursor(self
.moveTo
[0], self
.moveTo
[1])
182 def OnSelectCell(self
, evt
):
183 self
.log
.write("OnSelectCell: (%d,%d) %s\n" %
184 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
186 # Another way to stay in a cell that has a bad value...
187 row
= self
.GetGridCursorRow()
188 col
= self
.GetGridCursorCol()
190 if self
.IsCellEditControlEnabled():
191 self
.HideCellEditControl()
192 self
.DisableCellEditControl()
194 value
= self
.GetCellValue(row
, col
)
196 if value
== 'no good 2':
197 return # cancels the cell selection
202 def OnEditorShown(self
, evt
):
203 if evt
.GetRow() == 6 and evt
.GetCol() == 3 and \
204 wx
.MessageBox("Are you sure you wish to edit this cell?",
205 "Checking", wx
.YES_NO
) == wx
.NO
:
209 self
.log
.write("OnEditorShown: (%d,%d) %s\n" %
210 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
214 def OnEditorHidden(self
, evt
):
215 if evt
.GetRow() == 6 and evt
.GetCol() == 3 and \
216 wx
.MessageBox("Are you sure you wish to finish editing this cell?",
217 "Checking", wx
.YES_NO
) == wx
.NO
:
221 self
.log
.write("OnEditorHidden: (%d,%d) %s\n" %
222 (evt
.GetRow(), evt
.GetCol(), evt
.GetPosition()))
226 def OnEditorCreated(self
, evt
):
227 self
.log
.write("OnEditorCreated: (%d, %d) %s\n" %
228 (evt
.GetRow(), evt
.GetCol(), evt
.GetControl()))
232 #---------------------------------------------------------------------------
234 class TestFrame(wx
.Frame
):
235 def __init__(self
, parent
, log
):
236 wx
.Frame
.__init
__(self
, parent
, -1, "Simple Grid Demo", size
=(640,480))
237 self
.grid
= SimpleGrid(self
, log
)
241 #---------------------------------------------------------------------------
243 if __name__
== '__main__':
245 app
= wx
.PySimpleApp()
246 frame
= TestFrame(None, sys
.stdout
)
249 #shell = wx.py.shell.ShellFrame(frame, locals={'wx':wx, 'frame':frame})
254 #---------------------------------------------------------------------------