我正在进行拖放功能,这将允许我在画布上移动项目。我有它的工作(种类)但我只是轻微移动但线条在屏幕上射击(最终关闭画布的可见部分,所以我无法理解。我不知道从哪里开始。下面是我到目前为止创建的拖放代码:
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是我用来存储数据的字典。最初我认为将画布坐标转换为窗口坐标会有所帮助,但它的作用与没有那些东西的情况相同。
答案 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