使用TCL了解TK TreeCtrl中的项目创建

时间:2014-10-29 19:57:14

标签: tree tcl tk

所以我正在尝试学习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]; 

然后我得到适当的项目层次结构如下:

  • 10
    • 20
      • 21
        • 24
      • 22
      • 25

1 个答案:

答案 0 :(得分:0)

使用内部递增Id创建项目 - 这是Id用于定义父项的内容。在树种群代码中,set parent [expr {int(rand()*$i)}]得到一个整数,该整数在先前创建的项目的范围内(它们从1开始 - 我们找到一个从0开始的小于$i的随机整数)。

如果您创建的项目名为&#34;模块&#34;,则需要找到其Id作为parent属性使用(您可以使用{{1}找到它} - 或保存创建该项目时的返回值)