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"以外的名称,则不会出现错误,这解决了眼前的问题,但仍然给我留下了疑问:
- 为什么刚好调用脚本会出现这个错误"button.tcl"?
- 如果对脚本文件使用名称 "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 Button
和 Enter
事件绑定到以 window 名称作为参数的 tk::ButtonEnter
调用。在 tk::ButtonEnter
中,查询 window 的 -state
选项值。由于您的脚本名为 button.tcl
,因此当鼠标进入您的主 window.
时将触发此绑定
我创建了一个简单的脚本来试用 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"以外的名称,则不会出现错误,这解决了眼前的问题,但仍然给我留下了疑问:
- 为什么刚好调用脚本会出现这个错误"button.tcl"?
- 如果对脚本文件使用名称 "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 Button
和 Enter
事件绑定到以 window 名称作为参数的 tk::ButtonEnter
调用。在 tk::ButtonEnter
中,查询 window 的 -state
选项值。由于您的脚本名为 button.tcl
,因此当鼠标进入您的主 window.