添加按钮时TCL / TK坏窗口或路径名称

时间:2014-01-24 14:55:51

标签: tcl tk

尝试添加第一个按钮时,我一直收到“错误的窗口或路径名称”。而且我没有一个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

1 个答案:

答案 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}

因为你不需要替换任何东西。