Tkinter拖放

时间:2013-03-17 21:31:23

标签: 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 - 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 个答案:

答案 0 :(得分:3)

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

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