所以我正在尝试学习TK树ctrl,并获得了大量的在线文档和示例代码,但不幸的是,他们都没有解释一些代码背后的逻辑。所以我创建了一个包含列和元素的tk树,以及下面的一些项目:
set Priv(dlg) [toplevel .topLevel];
set recess $Priv(dlg);
set Priv(tree1) [treectrl $recess.tree1]
grid $Priv(tree1) -sticky news;
grid columnconfigure $recess 0 -weight 1
grid rowconfigure $recess 0 -weight 1
::at::BOMComparison::CreateElems $Priv(tree1)
for {set i 0} {$i < 100} {incr i} {
set parent [expr {int(rand()*$i)}] #THIS IS WHERE I GET CONFUSED
$Priv(tree1) item create -tag item$i -button auto
$Priv(tree1) item lastchild $parent item$i
$Priv(tree1) item text item$i name item$i
}
proc BOAComparison::CreateElems {T} {
$T element create rect rect -fill [list grey selected]
$T element create name text
set S [$T style create nameStyle]
$T style elements $S {rect name};
$T style layout $S rect -detach yes -iexpand xy;
$T style layout $S name -detach no -iexpand xy -expand e;
$T column create -tag name -itemstyle $S -text Items
$T configure -treecolumn first;
}
所以我在for循环的第一个语句中创建了parent。现在奇怪的是,如果我改变这句话: -
set parent [expr {int(rand()*$i)}]
到这个
set parent "Module"
我收到错误消息,说“模块”项目不存在。所以我试图找出$ parent是一个整数和它是一个字符串名称之间的区别。我从here尝试了这个例子,但没有找到解释,并想知道是否有人可以提供帮助并解释。
set treeHierarchy [::getParentChildRel]; #This returns me a list of parent child relation. {{10 20} {20 21} {20 22} {21 24} {20 25}}. Here 10, 20... are ids of parent and child and these ids are associated with the string names of parent and child so i can get the parent child names out of these ids.
foreach item $modHierarchy {
lassign $item parent child;
set parent [::getName $parent]; #This returns the string name associated with the id. Eg. ModulaA is name associated with id 10.
set child [::getName $child]; #Same goes for this
if {[$T item id "tag $parent"] eq ""} { #Create parent if not existing and make it child of root
set p [$T item create -tag $parent -button auto];
$T item text $p name $parent
$T item lastchild root $p
}
$T item create -tag $child -button auto
$T item lastchild "$parent" "$child" # BUT I GET THE SAME ITEM "Module*" DOESN'T EXIST ERROR HERE. NOT SURE WHY.
$T item text "tag $child" name $child
}
但是,如果我删除了两个用于获取id的名称的语句,即
set parent [::getName $parent];
set child [::getName $child];
然后我得到适当的项目层次结构如下:
答案 0 :(得分:0)
使用内部递增Id
创建项目 - 这是Id
用于定义父项的内容。在树种群代码中,set parent [expr {int(rand()*$i)}]
得到一个整数,该整数在先前创建的项目的范围内(它们从1开始 - 我们找到一个从0开始的小于$i
的随机整数)。
如果您创建的项目名为&#34;模块&#34;,则需要找到其Id
作为parent
属性使用(您可以使用{{1}找到它} - 或保存创建该项目时的返回值)