Tkinter 拖放

Posted

技术标签:

【中文标题】Tkinter 拖放【英文标题】:Tkinter drag and drop 【发布时间】:2013-03-06 04:16:40 【问题描述】:

我正在开发一个拖放功能,它允许我在画布上移动项目。我让它工作(有点)但我只移动了一点,但线在屏幕上射出(最终离开画布的可见部分,所以我无法到达它。我不知道从这里去哪里。下面是我到目前为止创建的拖放代码:

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】:

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

【讨论】:

我读到了,但这并不能真正回答我的问题。我的问题是,它发展如此之快是否有原因。如果仅仅是最轻微的移动就让它在画布上射出并且看不见,那么拖动它是没有用的。 @user2148990:您是否打印出您在调用move 时使用的值,看看它们是否符合您的预期? 简单的事情总是容易被忽略。重置起点现在完美无缺。谢谢!

以上是关于Tkinter 拖放的主要内容,如果未能解决你的问题,请参考以下文章

tkinter 列表框用 python 拖放

拖放按钮 tkinter python

使用 Tkinter 的 GUI 应用程序 - 拖放

如何创建拖放界面? [复制]

PhotoImage Tkinter 问题:按钮不起作用且不显示

如何在 OSX 上通过 Python Tkinter 安装和使用 TkDnD?