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 — это словарь, который я использую для хранения данных. Первоначально я думал, что перевод координат холста в координаты окна поможет, но он действует так же, как и без этого материала.


person user2148990    schedule 17.03.2013    source источник


Ответы (1)


Этот ответ на вопрос "Код рисования доски для перемещения овала" показывает, как перетаскивать объект на холсте.

В вашем случае вы не сбрасываете базу дельты при перемещении объекта. Если мышь перемещается на один пиксель вправо, вы используете 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
person Bryan Oakley    schedule 17.03.2013
comment
Я читал это, но это не совсем ответ на мой вопрос. Мой вопрос в том, есть ли причина, по которой он движется так быстро. Бесполезно что-то тащить, если что-то большее, чем малейшее движение, заставляет его лететь по холсту и исчезать из виду. - person user2148990; 18.03.2013
comment
@user2148990 user2148990: распечатали ли вы значения, которые вы используете в вызове move, чтобы увидеть, соответствуют ли они тому, что вы ожидаете? - person Bryan Oakley; 18.03.2013
comment
Это всегда простые вещи, которые легко упустить из виду. Сброс начальных точек теперь работал отлично. Спасибо! - person user2148990; 18.03.2013