2013-03-17 69 views
2

我正在研究一个拖放功能,可以让我在canvas上移动项目。我让它工作(种类),但我只移动一点,但是线条在屏幕上射击(并最终关闭画布的可见部分,所以我不能得到它,我不知道在哪里何去何从下面是拖放我创建至今代码:。Tkinter拖放

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是我使用的存储数据的字典。原本我以为翻译画布坐标到窗口坐标会有所帮助,但它的作用与没有的东西。

回答

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 
+0

,我读了,但是这并没有真正回答我的问题。我的问题是,它是如此迅速地移动的原因。如果有任何东西比最轻微的运动使它在画布上射击并且看不见,那么拖动它是没有用的。 – user2148990 2013-03-17 22:08:01

+0

@ user2148990:您是否打印出了在“移动”调用中使用的值,看看它们是否您期望它们是? – 2013-03-17 22:17:49

+0

它总是容易忽略的简单事情。重置起点现在已经很完美了。谢谢! – user2148990 2013-03-17 22:43:05