python - Tkinter 拖放

标签 python tkinter drag-and-drop tkinter-canvas

我正在开发一个拖放功能,它允许我在 Canvas 上四处移动项目。我让它工作(有点),但我只移动了一点点,但线条穿过屏幕(最终离开了 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)

dragInfo 是我用来存储数据的字典。最初我认为将 Canvas 坐标转换为窗口坐标会有所帮助,但它的作用与没有这些东西一样。

最佳答案

This answer问题“用于移动椭圆的板绘图代码”显示了如何在 Canvas 上拖动对象。

在您的例子中,您没有在移动对象时重置增量的底部。如果鼠标向右移动一个像素,则使用 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

关于python - Tkinter 拖放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15466469/

相关文章:

Android 拖放图像在 ICS (4.0.3) 上崩溃

Python Psycopg2 For 循环,大型数据库问题

python - Tkinter GUI 中的多线程,不同类中的线程

Python Tkinter : Delete the Last Character of a String

python - 只有一个类可用于 GUI 编程

drag-and-drop - 使用 HammerJS 检测放置目标

java - 有没有办法在拖放中达到下降时刻?

python - 我该如何让我的 Python 评分系统发挥作用?

python - 使用 easy-install 安装 MySQL-python 失败

python - 我如何将此代码转换为函数式风格?