2013-01-04 27 views
2

當用戶將列拖動到新索引時,將觸發wx.grid.EVT_GRID_COL_MOVE事件。處理程序收到wx.grid.GridEvent,其中包含屬性Col,其中包含已移動列的舊索引。該事件似乎沒有包含任何屬性,詳細說明列已被移動到之間。我如何解釋這一點?wxPython - wxGrid - 如何檢測哪個列在哪裏移動

回答

2

如果發生EVT_GRID_COL_MOVE事件,GridEvent.GetCol()返回正在移動的列的ID。列的實際位置可以通過Grid.GetColPos(colId)獲得。然而, 有wxWidgets的2.8之間的差異和WX 2.9:

wx 2.8EVT_GRID_COL_MOVE被後發送列已被移動這將阻止你否決事件。 因此在活動期間致電GetColPos()將返回新列的位置。

wx 2.9EVT_GRID_COL_MOVE被觸發前柱移動和否決該事件將防止柱被移動。 在活動期間調用GetColPos()將返回列的當前位置

該列的新位置是根據鼠標位置在內部計算的。 在python中複製代碼可能會與將來可能會破壞程序的版本衝突。

使用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會如果此舉必須撤消(一次在內部,第二次在OnColMoved),則調用兩次。您也可以查看wx.lib.gridmovers

+0

+1難以置信的好答案。當我有機會嘗試時,我會進一步評論。 – Hubro