wxPython - wxGrid - 如何检测哪个列移动到哪里

时间:2013-01-04 10:51:07

标签: python wxpython wxwidgets

当用户将列拖动到新索引时,会触发wx.grid.EVT_GRID_COL_MOVE事件。处理程序接收wx.grid.GridEvent,其中包含属性Col,其中包含已移动列的旧索引。该事件似乎不包含任何详细说明列已移动到的位置的属性。我怎么知道这个?

1 个答案:

答案 0 :(得分:2)

如果发生EVT_GRID_COL_MOVE事件,GridEvent.GetCol()会返回正在移动的列的 ID 。可以使用Grid.GetColPos(colId)获取列的实际位置。然而, wxWidgets 2.8和wx 2.9:

之间存在差异

wx 2.8中,{<1}}在列移动后发送,这会阻止您否决该事件。 因此,在活动期间调用EVT_GRID_COL_MOVE将返回列的 new 位置。

GetColPos()中,{<1}}在移动列之前触发,并且否决该事件将阻止该列移动。 在活动期间致电wx 2.9将返回该列的当前位置。

根据鼠标位置在内部计算列的新位置。 在python中复制该代码可能会与将来可能破坏该程序的版本冲突。

使用EVT_GRID_COL_MOVE,您可以实施一种解决方法,为您提供新的列位置,并允许您“否决”(或更确切地说撤消)移动:

GetColPos()
wx 2.9+

请注意,如果必须撤消移动(self.Bind(wx.grid.EVT_GRID_COL_MOVE, self.OnColMove) 内部和第二次),def OnColMove(self,evt): colId = evt.GetCol() colPos = self.grid.GetColPos(colId) wx.CallAfter(self.OnColMoved,colId,colPos) # allow the move to complete def OnColMoved(self,colId,oldPos): # once the move is done, GetColPos() returns the new position newPos = self.grid.GetColPos(colId) print colId, 'from', oldPos, 'to', newPos undo = False if undo: # undo the move (as if the event was veto'd) self.grid.SetColPos(colId,oldPos) 将被调用两次。

或者您可以查看SetColPos