尝试添加第一个按钮时,我一直收到“错误的窗口或路径名称”。而且我没有一个clou为什么......我非常害羞在其他地方使用相同的语法而没有问题......
tk::toplevel ".topbox"
wm title .topbox "SnapShooter"
wm geometry .topbox 200x200+0+0
wm resizable .topbox 0 0
button .topbox.btn_1 -text "Destroy" -width 150 -background green -command [destroy .topbox ]
pack .topbox.btn_1
button .topbox.btn_2 -text "Shoot Image" -width 150 -background green -command [ puts something]
pack .topbox.btn_2
答案 0 :(得分:3)
每当您发出命令(例如button ...
)时,Tcl解释器会尝试尽可能地替换变量和命令之类的内容。这意味着如果(就像在这种情况下)你创建一个按钮并使用此调用设置其命令
button .top.btn -command [destroy .top]
作为执行destroy .top
调用的一部分,Tcl执行命令button
(并将执行的结果值作为传递给命令选项的命令字符串插入)。你不希望这种情况发生(通常,当然不是在这种情况下,因为它看到你的GUI所在的分支),所以你需要阻止Tcl替换调用的这个特定部分。
如果您不需要在传递给命令选项的命令字符串中替换任何,则可以像这样编写
button .top.btn -command {destroy .top}
或(稍微脆弱一些)
button .top.btn -command \[destroy .top]
但在某些情况下,您需要替换命令字符串的某些部分而不执行该命令。这不起作用:
set w .top
button $w.btn -command {destroy $w}
因为按钮会尝试执行未取消的命令字符串destroy $w
。
在这种情况下,将命令字符串包装在list
:
set w .top
button $w.btn -command [list destroy $w]
所以,而不是
button .topbox.btn_1 \
-text "Destroy" \
-width 150 \
-background green \
-command [destroy .topbox]
你应该写
button .topbox.btn_1 \
-text "Destroy" \
-width 150 \
-background green \
-command [list destroy .topbox]
或者可能将命令选项命名为
-command {destroy .topbox}
因为你不需要替换任何东西。