ユーザーが列を新しいインデックスにドラッグすると、wx.grid.EVT_GRID_COL_MOVE
イベントがトリガーされます。ハンドラーは、移動された列の古いインデックスを含むwx.grid.GridEvent
プロパティを含むを受け取ります。ただし、イベントには、列が移動さCol
れた場所の詳細を示す属性が含まれていないようです。どうすればそれを理解できますか?
1 に答える
EVT_GRID_COL_MOVE
イベントの場合、移動中の列のIDGridEvent.GetCol()
を返します。列の実際の位置は で取得できます。ただし、wxWidgets 2.8 と wx 2.9 には違いがあります。Grid.GetColPos(colId)
ではwx 2.8
、列が移動された後EVT_GRID_COL_MOVE
に送信されます。これにより、イベントを拒否できなくなります。したがって、イベント中に呼び出すと、列の新しい位置が返されます。GetColPos()
ではwx 2.9
、列が移動される前EVT_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
移動を元に戻す必要がある場合は、 が 2 回呼び出されることに注意してください(内部で 1 回、 で 2 回目OnColMoved
)。
または、 を調べることもできますwx.lib.gridmovers
。