Python Tkinter拖放

Python Tkinter拖放,python,tkinter,drag-and-drop,tkinter-canvas,Python,Tkinter,Drag And Drop,Tkinter Canvas,我正在开发一个拖放功能,它允许我在画布上移动项目。我可以使用它(某种程度上),但我只移动了一点点,但线条会穿过屏幕(并最终离开画布的可见部分,因此我无法到达它。我不确定从这里走到哪里。下面是我迄今为止创建的拖放代码: def onPressToMove(self, event): #get initial location of object to be moved winX = event.x - self.workspace.canvasx(0) winY = event.y

我正在开发一个拖放功能,它允许我在画布上移动项目。我可以使用它(某种程度上),但我只移动了一点点,但线条会穿过屏幕(并最终离开画布的可见部分,因此我无法到达它。我不确定从这里走到哪里。下面是我迄今为止创建的拖放代码:

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是我用来存储数据的字典。最初我认为将画布坐标转换为窗口坐标会有所帮助,但它的作用与不使用这些东西一样。

关于“移动椭圆形的板绘制代码”的问题,说明了如何在画布上拖动对象

在您的情况下,移动对象时不会重置增量的底部。如果鼠标向右移动一个像素,则使用
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

我读到了,但这并没有真正回答我的问题。我的问题是,它移动得如此之快有什么原因吗?如果有任何比最轻微的移动都会使它穿过画布并消失在视线之外,那么拖动它是没有用的。@user2148990:您打印了调用
move
时使用的值吗你期望他们是什么样的人?总是简单的事情容易被忽视。重新设定起点现在非常有效。谢谢!