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

时间:2019-04-03 10:39:25

标签: tcl tk

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

我已经按下了按钮,并且拖动的东西工作得很好,但是我不知道如何检测拖动完成的标签。我已经绑定了目标标签的事件,但是当绑定触发时,%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

我怎么得到的?

1 个答案:

答案 0 :(得分:0)

<ButtonRelease>事件总是传递到相应的<ButtonPress>事件传递到的小部件;强制执行此操作的窗口系统本身进行了抓取。相反,您需要获取全局X / Y坐标(在事件中为%X%Y替换),并使用winfo containing确定该位置的小部件。