Tkinter 拖放

use*_*990 3 python drag-and-drop tkinter tkinter-canvas

我正在开发一个拖放功能,它允许我在画布上移动项目。我让它工作(有点),但我只稍微移动,但线穿过屏幕(并最终离开屏幕的可见部分)画布,所以我无法到达它。我不知道从这里去哪里。下面是我到目前为止创建的拖放代码:

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)
Run Code Online (Sandbox Code Playgroud)

DragInfo 是我用来存储数据的字典。最初我认为将画布坐标转换为窗口坐标会有所帮助,但它的作用与没有这些东西时相同。

Bry*_*ley 5

对“移动椭圆的板绘图代码”问题的回答显示了如何在画布上拖动对象。

在您的情况下,您在移动对象时不会重置增量的底部。如果鼠标向右移动一像素,则可以move将鼠标向右移动一像素。

现在,假设您将其向右移动一个像素。这次,您的计算显示距起点的增量为 2,即使您实际上仅将鼠标移动了一个像素)。下次移动一个像素时,您将计算 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
Run Code Online (Sandbox Code Playgroud)