Tkinter拖放

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是一个我用来存储数据的字典。起初我认为将画布坐标转换为窗口坐标会有帮助,但事实上并没有任何变化。

1个回答

5

这个回答解决了关于在canvas上拖动对象的问题。

在你的情况下,当你移动对象时没有重置delta的基础。如果鼠标向右移动一个像素,你使用move将鼠标向右移动一个像素。

现在,假设你再向右移动一个像素。这一次,你的计算会从起始点计算出delta值为2,即使你实际上只移动了鼠标一个像素。下一次,当你移动一个像素时,你正在计算3的delta值,以此类推。

解决方法很简单:在移动时重新设置dragInfo["xCoord"]dragInfo["yCoord"],因为你只想计算到它之前的位置的delta,而不是原始起始位置的delta。

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
@user2148990:你是否打印出在调用“move”时使用的值,以查看它们是否符合你的预期? - Bryan Oakley
总是那些简单的事情容易被忽视。现在重置起始点完美地解决了问题。谢谢! - user2148990

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接