3

キャンバス上でアイテムを移動できるようにするドラッグアンドドロップ機能に取り組んでいます.動作していますが(一種)、少ししか移動しませんが、線が画面を横切って撮影します(最終的にはキャンバスなので、そこにたどり着けません。ここからどこへ行けばよいかわかりません。以下は、これまでに作成したドラッグ アンド ドロップ コードです。

def onPressToMove(self, event): #get initial location of object to be moved
    winX = event.x - self.workspace.canvasx(0)
    winY = event.y - self.workspace.canvasy(0)
    self.dragInfo["Widget"] = self.workspace.find_closest(event.x, event.y, halo = 5)[0]
    self.dragInfo["xCoord"] = winX
    self.dragInfo["yCoord"] = winY

def onReleaseToMove(self, event): #reset data on release
    self.dragInfo["Widget"] = None
    self.dragInfo["xCoord"] = 0
    self.dragInfo["yCoord"] = 0        

def onMovement(self, event):
    winX = event.x - self.workspace.canvasx(0)
    winY = event.y - self.workspace.canvasy(0)
    newX = winX - self.dragInfo["xCoord"]
    newY = winY - self.dragInfo["yCoord"]
    self.workspace.move(self.dragInfo["Widget"], newX, newY)

dragInfo は、データの保存に使用している辞書です。元々、キャンバス座標をウィンドウ座標に変換すると役立つと思っていましたが、それがない場合と同じように動作します。

4

1 に答える 1

4

「楕円を移動するボード描画コード」という質問に対するこの回答は、キャンバス上でオブジェクトをドラッグする方法を示しています。

あなたの場合、オブジェクトを移動するときにデルタのベースをリセットしていません。マウスが 1 ピクセル右に移動する場合、 を使用moveしてマウスを 1 ピクセル右に移動します。

ここで、もう 1 ピクセル右に移動するとします。今回は、実際にはマウスをもう 1 ピクセル動かしただけなのに、計算ではデルタは開始点から 2 であると示されています)。次に 1 ピクセル移動すると、デルタ 3 が計算されます。

解決策は簡単です。元の開始位置ではなく、以前の位置へのデルタを計算するだけなので、移動中にリセットdragInfo["xCoord"]します。dragInfo["yCoord"]

def onPressToMove(self, event): #get initial location of object to be moved
    winX = event.x - self.canvas.canvasx(0)
    winY = event.y - self.canvas.canvasy(0)
    self.dragInfo["Widget"] = self.canvas.find_closest(event.x, event.y, halo = 5)[0]

    # reset the starting point for the next move
    self.dragInfo["xCoord"] = winX
    self.dragInfo["yCoord"] = winY
于 2013-03-17T22:01:43.803 に答える