54
55 if val != self.startValue: 56 changed = True
57 grid.GetTable().SetValue(row, col, val) # update the table 58
59 self.startValue = '' 60 self._tc.SetValue('') 61 return changed 62
63 def Reset(self): 64 \ 65 Reset the value in the control back to its starting value.
66 *Must Override* 67 \
68 self._tc.SetValue(self.startValue) 69 self._tc.SetInsertionPointEnd() 70
71 def Clone(self): 72 \
73 Create a new object which is the copy of this one 74 *Must Override* 75 \
76 return UpCaseCellEditor() 77
78 def StartingKey(self, evt): 79 \
80 If the editor is enabled by pressing keys on the grid, this will be
81 called to let the editor do something about that first key if desired. 82 \
83 self.OnChar(evt)
84 if evt.GetSkipped():
85 self._tc.EmulateKeyPress(evt) 86
87 def OnChar(self, evt): 88 key = evt.GetKeyCode() 89 if key 255: 90 evt.Skip() 91 return
92 char = chr(key)
93 if char in string.letters:
94 char = char.upper()
95 self._tc.WriteText(char)#转换为大写 96 else:
97 evt.Skip() 98
99 class TestFrame(wx.Frame): 100 def __init__(self):
101 wx.Frame.__init__(self, None, title=\Editor\,
102 size=(640,480)) 103
104 grid = wx.grid.Grid(self) 105 grid.CreateGrid(50,50)
106 grid.SetDefaultEditor(UpCaseCellEditor())#设置成默认编辑器 107 108
109 app = wx.PySimpleApp() 110 frame = TestFrame() 111 frame.Show() 112 app.MainLoop()
捕获用户事件
网格控件有许多的用户事件。我们将把它们分为鼠标事件和键盘事件。
如何捕获用户的鼠标动作?
对于网格控件,除了不同的鼠标事件类型外,对于这些类型还有一些不同的事件类。最常用的事件类是wx.grid.GridEvent。网格的事件类是wx.CommandEvent的一个子类,它提供了用于获得事件详情的几个方法,如表14.8所示。 表14.8 wx.grid.GridEvent的方法
AltDown() 当事件被触发时,如果alt键被按下了,则返回True。 ControlDown() 当事件被触发时,如果control键被按下了,则返回True。 GetCol() GetPosition() GetRow() 返回发生事件的单元格所在的列的索引。 返回返回一个wx.Point。它代表事件发生点的逻辑坐标(以像素为单位)。 返回发生事件的单元格所在的行的索引。 MetaDown() Selecting() ShiftDown() 当事件被触发时,如果met键被按下了,则返回True。 如果事件是一个被选事件,则返回True,如果事件是取消选择事件,则返回False。 当事件被触发时,如果shift键被按下了,则返回True。 与wx.grid.GridEvent相关的有几个不同的事件类型。如表14.9所示。 表14.9 关于网格鼠标事件的单元格事件类型
wx.grid.EVT_GRID_CELL_CHANGE wx.grid.EVT_GRID_CELL_LEFT_CLICK wx.grid.EVT_GRID_CELL_LEFT_DCLICK wx.grid.EVT_GRID_CELL_RIGHT_CLICK wx.grid.EVT_GRID_CELL_RIGHT_DCLICK wx.grid.EVT_GRID_EDITOR_HIDDEN wx.grid.EVT_GRID_EDITOR_SHOWN wx.grid.EVT_GRID_LABEL_LEFT_CLICK wx.grid.EVT_GRID_LABEL_LEFT_DCLICK wx.grid.EVT_GRID_LABEL_RIGHT_CLICK wx.grid.EVT_GRID_LABEL_RIGHT_DCLICK wx.grid.EVT_GRID_Select_CELL 当用户通过编辑器改变单元格中的数据时触发该事件。 当用户在一个单元格中敲击鼠标左键时触发该事件。 当用户在一个单元格中双击鼠标左键时触发该事件。 当用户在一个单元格中敲击鼠标右键时触发该事件。 当用户在一个单元格中双击鼠标右键时触发该事件。 当在编辑会话结束时隐藏一个单元格编辑器则触发该事件。 当在编辑会话结束时显示一个单元格编辑器则触发该事件。 当用户在行或列的标签区域敲击鼠标左键时触发该事件。 当用户在行或列的标签区域双击鼠标左键时触发该事件。 当用户在行或列的标签区域敲击鼠标右键时触发该事件。 当用户在行或列的标签区域双击鼠标右键时触发该事件。 当用户将焦点移到一个新的单元格,并选择它时触发该事件。 有两个事件类型,它们有一个wx.grid.GridSizeEvent实例。这两个事件类型分别是wx.grid.EVT_GRID_COL_SIZE:当列大小被改变时触发,
wx.grid.EVT_GRID_ROW_SIZE:当行的大小被改变时触发。网格的尺寸事件有5个与wx.GridEvent!AltDown(), ControlDown(), GetPosition(), MetaDow(), 和
ShiftDown相同的方法。wx.grid.GridSizeEvent的最后的一个方法是
GetRowOrCol(),该方法返回发生改变的列或行的索引,当然这依赖于具体的事件类型。
事件类型wx.grid.EVT_GRID_RANGE_Select有一个
wx.grid.GridRangeSelectEvent的实例,该事件当用户选择连续矩形范围内的单元格中被触发。该事件的实例拥有的方法是
GetBottomRightCoords(), GetBottomRow(), GetLeftCol(), GetRightCol(), GetTopRightCoords()和GetTopRow(),它们返回被选择区域的整数索引或(row, col)元组。
最后,事件类型EVT_GRID_EDITOR_CreateD有一个
wx.grid.GridEditorCreatedEvent实例。这个事件在当通过一个编辑会话创建了一个编辑器时被触发。该事件实例的方法有GetCol(), GetRow(), 和GetControl(),它们分别返回发生事件的列,行的索引和使用的编辑控件。
如何捕获用户的键盘动作?
除了使用鼠标外,用户还可以使用键盘来在网格中移动。你可以通过代码的方法来使用表14.10中的移动方法改变光标。其中的许多方法都要求一个expandSelection参数。每个方法中的expandSelection的作用都相同。如果这个参数为True,那么当前的选项将被扩展以容纳这个新的光标位置。如果这个参数为False,那么当前的选项被新的光标所取代。
表14.10 网格光标移动方法
MoveCursorDown(expandSelection) 向下移动光标。如果expandSelection为False,等同于按下\下箭头键\,如果为True,则等同于按下\下箭头键\。 向下移动光标。如果expandSelection为False,则等同于\下箭头键\,如果为True,则等同于\下箭头键\。 向左移动光标。如果expandSelection为False,等同于按下\左箭头键\,如果为True,则等同于按下\左箭头键\。 向左移动光标。如果expandSelection为False,则等同于\左箭头键\,如果为True,则等同于\左箭MoveCursorDownBlock(expandSelection) MoveCursorLeft(expandSelection) MoveCursorLeftBlock(expandSelection)