ユーザーが列を新しいインデックスにドラッグすると、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。