`winfo child`和`winfo children`之间的区别

时间:2013-12-27 07:36:03

标签: tcl tk

我正在查看Tk演示小部件8.5 / 8.6并找到了内线:

eval destroy [winfo child .]

当我查找winfo时,没有child选项,但有一个children选项。我用两个测试了一些东西,看起来是一样的。

% package require Tk
% pack [label .m1 -text "Hello"]
% pack [label .m2 -text "World"]
% puts [winfo child .]
.m1 .m2
% puts [winfo children .]
.m1 .m2

这两个对我来说似乎是一样的,但有一个是有记录的,另一个则没有。是否存在任何差异,或者仅仅是不同版本的Tcl的结果(似乎child之前使用过children现在被{{1}}替换 - 可能是因为一个错误? - 虽然两者都表现出来大致相似)?

如果它们不同,是否有人会使用一个而不是另一个?

1 个答案:

答案 0 :(得分:4)

Tcl允许您将任何命令缩写为最接近的非模糊子字符串。例如:

% string range abcd 0 2
abc
% stri ran abcd 0 2
abc
% str r abcd 0 2
unknown or ambiguous subcommand "r": must be bytelength, compare, equal, first, index, is,  last, length, map, match, range, repeat, replace, reverse, tolower, totitle, toupper, trim, trimleft, trimright, wordend, or wordstart
% 

最后一行有一个模糊的匹配 - r可以匹配任何范围,重复,替换或反转,所以我们得到一个错误。 ra是此处range可能的最短匹配。

适用于此的具体文档实际上位于Tcl_GetIndexFromObj的手册页中,其中是状态

  

如果objPtr的字符串值与tablePtr中的某个字符串相同,或者如果它是tablePtr中的一个字符串的非空唯一缩写并且未指定TCL_EXACT标志,则会发生匹配

这是因为Tcl_GetIndexFromObj API调用通常是在整个Tcl源中识别命令和子命令的方式。