我创建了一个简单的脚本来试用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)
我正在使用ActiveTcl 8.6.4.1和Windows 8.我还尝试了运行此操作的各种变体,例如使用wish
解释器而不是tclsh
,不使用package require Tk
,使用其他小部件等等。
唯一奇怪的是,如果我将脚本文件重命名为“button.tcl”之外的其他内容,则不会发生错误,从而解决了当前问题,但仍然存在问题:
答案 0 :(得分:4)
来自" Tcl和Tk中的实用编程" Brent B. Welch等人,第476页:
不要将小部件名称用于脚本名称。
应用程序类名称将成为主顶层窗口的类名称。例如,如果您使用类似button.tcl的脚本名称,则为。成为巴顿。这会导致它继承所有标准的Button绑定和属性值,这可能会导致应用程序出现问题。
查看button.tcl
库中的tk8.6
,问题很明显。此脚本将类Button
和Enter
事件绑定到tk::ButtonEnter
的调用,并将窗口名称作为参数。在tk::ButtonEnter
内,查询窗口的-state
选项值。由于您的脚本名为button.tcl
,因此当鼠标进入主窗口时将触发此绑定。