如何检测按钮释放发生的位置

How to detect where a button release occurred

我正在尝试实现一个相当基本的拖放操作,以允许用户单击一个标签并将其文本拖到另一个标签。

我的按钮按下和拖动功能运行良好,但我不知道如何检测拖动完成的标签。我已经绑定到目标标签的事件,但是当绑定触发时,%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 确定那个位置的小部件。