我有一个带有多个小部件的Tk窗口,使用户能够选择几何网格线以进行重新标注。小部件之一是列表框选择,其中列出了要重新定义的每个可能的网格线。当鼠标悬停在列表框中的一行上时,我想将该网格行的文本名称的字体更改为 bold ,然后将命令发送回另一个包(逐点)以在Pointwise网格生成软件的显示窗口中突出显示该行。 Tk是否提供这样的回调?我看到有一些方法可以检测鼠标何时“进入”和“离开”窗口小部件,以及是否在窗口小部件中选择了某些东西,但是将鼠标悬停似乎是一种模糊的构造。有没有类似于 curselection 的功能来捕获光标悬停在上方的文本?
答案 0 :(得分:0)
从这里开始:
bind . <Motion> {puts [winfo containing {*}[winfo pointerxy .]]}
也就是说,如果鼠标指针在.
中移动,则会打印出包含当前鼠标坐标的小部件的路径。
答案 1 :(得分:0)
当鼠标不动时,没有鼠标事件。鼠标第一次开始在小部件上移动时,发生<Enter>
个事件,鼠标停止在小部件上的情况发生<Leave>
个事件,而鼠标在小部件上的移动则发生<Motion>
个事件。这意味着您的GUI控制器代码需要做一些工作来跟踪正在发生的事情,但这通常不是一个大问题。运动事件具有多个关联的替换项,但最有用的替换项是%x
和%y
,它们表示鼠标在小部件相对坐标中移动到的位置。
请注意,如果用户在该小部件中单击并移开,您还将获得<Motion>
个事件传递给该小部件;按下任意鼠标按钮时,会自动发生(与鼠标有关的)事件的 grab 。这种事情使得在应用程序中进行拖放操作变得非常简单(您只需使用winfo containing %X %Y
(这些都是大写字母,因此我们正在使用全局坐标)来找出鼠标真正在何处。 来确定目标是哪个小部件),但是一旦您处理完所有细微的细节,这就是一个相当复杂的话题。