Error: unknown option "-state" occurs when running a script named button.tcl

Error: unknown option "-state" occurs when running a script named button.tcl

我创建了一个简单的脚本来试用 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

当我 运行 这个时,我得到两个 windows:一个 window 是由标题栏中名为 "button" 的 package require Tk 命令创建的(因为我将脚本命名为 "button.tcl")和另一个由 toplevel $w 命令创建并在标题栏中称为 "demo" 的脚本。

"demo" top-level window 的行为符合预期。如果我单击“确定”按钮,它会执行脚本命令。问题是,如果我将鼠标移到 "button" window 内,我会收到以下错误对话框:

错误:未知选项“-state”

详情>>

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)

我正在使用 ActiveTcl 8.6.4.1 和 Windows8。我还尝试了 运行ning 的变体,例如使用 wish 解释器而不是 tclsh ,离开 package require Tk,改用其他小部件等。

唯一奇怪的是,如果我将脚本文件重命名为"button.tcl"以外的名称,则不会出现错误,这解决了眼前的问题,但仍然给我留下了疑问:

  1. 为什么刚好调用脚本会出现这个错误"button.tcl"?
  2. 如果对脚本文件使用名称 "button.tcl" 存在潜在问题,是否还有其他我应该注意的此类文件名?

来自 Brent B. Welch 等人的 "Practical Programming in Tcl and Tk",第 476 页:

Don't use widget names for script names.
The application class name becomes the class name for the main toplevel window. For example, if you use a script name like button.tcl, the class for . becomes Button. This causes it to inherit all the standard Button bindings and attribute values, which can cause problems in your application.

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

时将触发此绑定