您正在觀察的行爲是由事件的座標相對於拖動的窗口部件引起的。更新小部件的位置(在絕對座標)與相對座標顯然導致混亂。
爲了解決這個問題,我使用了.winfo_x()
and .winfo_y()
函數(允許將相對座標轉換爲絕對座標)和Button-1
事件來確定拖動開始時光標在控件上的位置。 以下是一個混合使得一個小部件可拖動。
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)
用法:
# 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()
你真的嘗試* *這個代碼?因爲它有多個錯誤,並且不會移動任何東西 - 至少在Mac上的Python 3.5下。 –
你有點擊邊框,而不是文本框 –