Das Verhalten, das Sie beobachten, wird durch die Tatsache verursacht, dass die Koordinaten des Ereignisses relativ zum gezogenen Widget sind. Aktualisieren der Widgets Position (in absolute Koordinaten) mit relativ Koordinaten offensichtlich ergibt sich Chaos.
Um dies zu beheben, habe ich die Funktionen (die erlauben, die relativen Koordinaten in absolute Koordinaten zu verwandeln), und das Button-1
Ereignis verwendet, um die Position des Cursors auf dem Widget zu bestimmen, wenn der Ziehvorgang beginnt. Das folgende ist ein Mixin, der ein Widget ziehbar macht.
class DragDropWidget:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.drag_start_x = 0
self.drag_start_y = 0
self.bind("<Button-1>", self.drag_start)
self.bind("<B1-Motion>", self.drag_motion)
def drag_start(self, event):
self.drag_start_x = event.x
self.drag_start_y = event.y
def drag_motion(self, event):
x = self.winfo_x() - self.drag_start_x + event.x
y = self.winfo_y() - self.drag_start_y + event.y
self.place(x=x, y=y)
Verbrauch:
# As always when it comes to mixins, make sure to
# inherit from DragDropWidget FIRST!
class DnDFrame(DragDropWidget, tk.Frame):
pass
# This wouldn't work:
# class DnDFrame(tk.Frame, DragDropWidget):
# pass
main = tk.Tk()
notesFrame = DnDFrame(main, bd = 4, bg = "grey")
notesFrame.place(x=10,y=10)
notes = tk.Text(notesFrame)
notes.pack()
Haben Sie versucht wirklich * dieses * Code? Denn es hat mehrere Fehler und scheint nichts zu bewegen - zumindest unter Python 3.5 auf Mac. –
Sie haben den Klick auf die Grenze, nicht das Textfeld –