我正在尝试实现一个相当基本的拖放操作,以允许用户单击标签并将其文本拖动到另一个标签。
我有按钮和拖动工作很好但我无法弄清楚如何检测拖动完成的标签。我已经绑定了目标标签的事件,但是当绑定触发时,%W
是最初按下按钮的标签。
以下代码说明了效果:
proc buttonRelease w {puts stdout ButtonRelease\ $w}
proc buttonPress w {puts stdout ButtonPress\ $w}
ttk::label .a -text a
ttk::label .b -text b
grid .a -row 0 -column 0 -sticky nsew -padx 30 -pady 15
grid .b -row 0 -column 1 -sticky nsew -padx 30 -pady 15
bind .a <ButtonPress> {buttonPress %W}
bind .b <ButtonPress> {buttonPress %W}
bind .a <ButtonRelease> {buttonRelease %W}
bind .b <ButtonRelease> {buttonRelease %W}
如果我点击“a”,我明白了
ButtonPress .a
ButtonRelease .a
但如果我从“a”拖到“b”,我会看到同样的事情。我想看
ButtonPress .a
ButtonRelease .b
我怎么做到的?
<ButtonRelease>
事件总是被传递到相应的<ButtonPress>
事件被传递到的小部件;窗口系统本身就可以执行此操作。相反,您需要获取全局X / Y坐标(事件中的%X
和%Y
替换)并使用winfo containing
来确定该位置的小部件。