如果按下按钮也设置焦点,如何禁止按钮命令?

时间:2019-04-02 09:19:30

标签: tcl tk

我的应用程序有一个绑定到鼠标按钮的命令。我已经意识到,当您单击一个窗口来设置焦点并执行按钮命令时,这很烦人。

这是将我的命令绑定到按钮1的行:

bind .f.canvas <Button-1> {panto %W %x %y 0.5}; # pan half distance

当同时按下按钮来设置焦点时,如何禁止按钮命令的调用?


这是我的“测试顺序”:

  1. 打开程序
  2. 单击画布。所需/结果:平移到单击的位置。
  3. 单击桌面。
  4. 单击画布。期望:没有锅。结果:平移到单击位置。
  5. 单击画布。所需/结果:平移到单击的位置。

2 个答案:

答案 0 :(得分:0)

如果使绑定脚本以break结尾,它将不会运行与该事件关联的任何其他脚本(例如,在小部件类级别,整个窗口级别或整个应用程序级别) )。具体来说,您可以这样做:

bind .f.canvas <Button-1> {
    panto %W %x %y 0.5; # pan half distance
    break
}

这种事情是推荐使用多命令绑定脚本的少数情况之一。通常,(为了易于理解)最好将内容提取到过程中,但在这种情况下,最好直接将break放入

答案 1 :(得分:0)

我当前的解决方案有点破烂。我背负着输入小部件上的键盘焦点事件,在输入未聚焦时暂时禁用了按钮命令:

ttk::entry .f.cmd -textvar e -width 30
bind .f.cmd <FocusOut> {
  puts "focus out, disable button press"; 
  bind .f.canvas <Button-1> {}
}
bind .f.cmd <FocusIn> {
  puts "focus in, enable button press starting next event"; 
  after idle {
    bind .f.canvas <Button-1> {
      panto %%W %%x %%y 0.5
    }
  };
}

在Win10,Tcl 8.6上进行了测试。