错误:运行名为button.tcl的脚本时出现未知选项“-state”

时间:2016-05-07 11:23:32

标签: tcl tk

我创建了一个简单的脚本来试用Tk按钮小部件但我遇到了意外错误。

#!/usr/bin/env tclsh
package require Tk

set w .demo
toplevel $w

ttk::button $w.ok -text OK -command {puts "OK Pressed"}
grid $w.ok

当我运行它时,我得到两个窗口:一个窗口由标题栏中名为“button”的package require Tk命令创建(因为我将脚本命名为“button.tcl”)而另一个窗口由toplevel $w命令创建,在标题栏中称为“demo”。

“演示”顶级窗口的行为符合预期。如果单击“确定”按钮,则执行脚本命令。问题是,如果我在“按钮”窗口中移动鼠标,我会得到以下错误对话框:

错误:未知选项“-state”

详情及GT;>

unknown option "-state"
unknown option "-state"
    while executing
"$w cget -state"
    (procedure "tk::ButtonEnter" line 3)
    invoked from within
"tk::ButtonEnter ."
    (command bound to event)

Failing button application with error message

我正在使用ActiveTcl 8.6.4.1和Windows 8.我还尝试了运行此操作的各种变体,例如使用wish解释器而不是tclsh,不使用package require Tk,使用其他小部件等等。

唯一奇怪的是,如果我将脚本文件重命名为“button.tcl”之外的其他内容,则不会发生错误,从而解决了当前问题,但仍然存在问题:

  1. 当脚本恰好被称为“button.tcl”时,为什么会发生这种错误?
  2. 如果对脚本文件使用名称“button.tcl”存在潜在问题,是否还有其他此类文件名需要注意?

1 个答案:

答案 0 :(得分:4)

来自" Tcl和Tk中的实用编程" Brent B. Welch等人,第476页:

  

不要将小部件名称用于脚本名称。
  应用程序类名称将成为主顶层窗口的类名称。例如,如果您使用类似button.tcl的脚本名称,则为。成为巴顿。这会导致它继承所有标准的Button绑定和属性值,这可能会导致应用程序出现问题。

查看button.tcl库中的tk8.6,问题很明显。此脚本将类ButtonEnter事件绑定到tk::ButtonEnter的调用,并将窗口名称作为参数。在tk::ButtonEnter内,查询窗口的-state选项值。由于您的脚本名为button.tcl,因此当鼠标进入主窗口时将触发此绑定。