5 #----------------------------------------------------------------------------
6 from wxPython
.wx
import *
7 from wxPython
.grid
import *
9 class MyCellEditor(wxPyGridCellEditor
):
11 A custom GridCellEditor that only accepts numbers.
12 Also tries to work around wxGTK anomaly that key cannot start edit.
15 def Create(self
, parent
, id, evtHandler
):
17 Called to create the control, which must derive from wxControl.
22 if wxPlatform
== '__WXMSW__':
23 theStyle
= wxTE_PROCESS_TAB | wxTE_MULTILINE | wxTE_NO_VSCROLL | wxTE_AUTO_SCROLL
24 #theStyle = wxTE_PROCESS_TAB | wxTE_PROCESS_ENTER
26 self
._tc
= wxTextCtrl(parent
, id, "", style
=theStyle
)
27 self
._tc
.SetInsertionPoint(0)
28 self
.SetControl(self
._tc
)
31 self
._tc
.PushEventHandler(evtHandler
)
34 def SetSize(self
, rect
):
36 Called to position/size the edit control within the cell rectangle.
37 If you don't fill the cell (the rect) then be sure to override
38 PaintBackground and do something meaningful there.
40 self
._tc
.SetDimensions(rect
.x
-1, rect
.y
-1, rect
.width
+4, rect
.height
+4)
42 def BeginEdit(self
, row
, col
, grid
):
44 Fetch the value from the table and prepare the edit control
45 to begin editing. Set the focus to the edit control.
49 self
.startValue
= grid
.GetTable().GetValue(row
, col
)
50 self
._tc
.SetValue(self
.startValue
)
53 def EndEdit(self
, row
, col
, grid
):
55 Complete the editing of the current cell. Returns true if the value
56 has changed. If necessary, the control may be destroyed.
60 val
= self
._tc
.GetValue()
61 if val
!= self
.startValue
:
63 grid
.GetTable().SetValue(row
, col
, val
) # update the table
72 Reset the value in the control back to its starting value.
75 self
._tc
.SetValue(self
.startValue
)
76 self
._tc
.SetInsertionPointEnd()
79 def IsAcceptedKey(self
, evt
):
81 Return TRUE to allow the given key to start editing: the base class
82 version only checks that the event has no modifiers.
84 key
= evt
.GetKeyCode()
86 if (key
in range(ord('0'),ord('9')+1) or
87 key
in range(WXK_NUMPAD0
, WXK_NUMPAD9
+1)):
93 def StartingKey(self
, evt
):
95 If the editor is enabled by pressing keys on the grid, this will be
96 called to let the editor do something about that first key if desired.
98 key
= evt
.GetKeyCode()
99 print "StartingKey", key
101 if key
in range(WXK_NUMPAD0
, WXK_NUMPAD9
+1):
102 ch
= ch
= chr(ord('0') + key
- WXK_NUMPAD0
)
104 elif key
< 256 and key
>= 0 and chr(key
) in string
.printable
:
106 if not evt
.ShiftDown():
107 ch
= string
.lower(ch
)
110 # Replace the text. Other option would be to append it.
111 # self._tc.AppendText(ch)
112 self
._tc
.SetValue(ch
)
113 self
._tc
.SetInsertionPointEnd()
125 Create a new object which is the copy of this one
129 return MyCellEditor()
132 class MyGrid(wxGrid
):
133 def __init__(self
, parent
, cust
):
134 wxGrid
.__init
__(self
, parent
, -1)
135 self
.CreateGrid(10, 10)
136 for column
in xrange(10):
137 self
.SetColSize(column
, 40)
139 self
.SetDefaultCellAlignment(wxCENTRE
, wxCENTRE
)
143 for column
in xrange(10):
144 # Note, we create attr and cell editor for each column
145 # otherwise segfault at exit, probably tries to free those
146 # multiple times from each column.
147 attr
= wxGridCellAttr()
148 attr
.SetEditor(MyCellEditor())
149 self
.SetColAttr(column
, attr
)
152 #----------------------------------------------------------------------------
154 class CardNoteBook(wxNotebook
):
155 def __init__(self
, parent
, id):
156 wxNotebook
.__init
__(self
, parent
, id)
158 for title
, cust
in [("Default", 0), ("Custom Cell Editor", 1)]:
159 win
= MyGrid(self
, cust
)
160 self
.AddPage(win
, title
)
162 EVT_NOTEBOOK_PAGE_CHANGED(self
, self
.GetId(), self
.OnPageChanged
)
163 EVT_KEY_DOWN(self
, self
.OnKeyDown
)
164 EVT_NAVIGATION_KEY(self
, self
.OnNavKey
)
167 def OnKeyDown(self
, evt
):
168 print 'CardNoteBook.OnKeyDown: ', evt
.GetKeyCode()
172 def OnNavKey(self
, evt
):
173 print 'CardNoteBook.OnNavKey:', evt
176 def OnPageChanged(self
, event
):
180 #----------------------------------------------------------------------------
182 class ScoreKeeper(wxFrame
):
183 def __init__(self
, parent
, id, title
):
184 wxFrame
.__init
__(self
, parent
, -1, title
, size
= (500, 400),
185 style
=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE
)
186 EVT_CLOSE(self
, self
.OnCloseWindow
)
189 self
.nb
= CardNoteBook(self
, -1)
190 #win=MyGrid(self, "GTK")
193 def OnCloseWindow(self
, event
):
199 def OnFileExit(self
, event
):
202 #----------------------------------------------------------------------------
206 frame
= ScoreKeeper(None, -1, "ScoreKeeper: (A Demonstration)")
208 self
.SetTopWindow(frame
)
213 #---------------------------------------------------------------------------