我使用Bwidgets构建了一个树vieew,现在我正在尝试将其转换为TreeCtrl,但我无法在TreeCtrl中找出Bwidget命令的等效命令:
$tree itemcget $node -data
答案 0 :(得分:1)
似乎没有任何机制可以将用户指定的数据直接附加到TkTreeCtrl中的节点。解决此问题的最简单方法是将数据存储在数组中,而不是通过节点的ID(以及在应用程序中使用多个树窗口小部件名称)索引的数据。
# Set the value (assuming you're only making one item here)
set id [$tree item create ...]
set ::userdata($tree,$id) $yourDataItem
# Get the value for a particular item
set id [$tree item id $itemDesc]
puts "the data for $id is $::userdata($tree,$id)"
# Remove the value when removing the item
set id [$tree item id $itemDesc]
unset ::userdata($tree,$id)
$tree item delete $id
我见过很多人建议在一个类中包装TkTreeCtrl(例如,Snit,TclOO,XOTcl),以便在特定情况下使用起来更简单。这是很好的包装......
答案 1 :(得分:0)
关于这个问题,我的项目负责人提出了一个非常简单的解决方案,用于将用户指定的数据附加到Treectrl节点,
您创建包含数据的节点
$tree item element configure $itemID $columnID elemText -text $text -data $data
然后当你想将数据用于任何目的时
set dataObj [$tree item element cget $itemID $columnID elemText -data]
现在数据保存在dataObj中,您可以将它用于任何操作,操作,它给了我Bwidget树命令的确切功能 -
$tree itemcget $node -data ------> which i thought was not directly possible in TreeCtrl.
我将在下面发布一个示例程序供您进行实验,并对格式化感到抱歉:
package require treectrl
package require TclOO
oo::class create Foo {
method test { obj } {
puts "This is otuput from test method in instant of class D. $obj"
}
}
treectrl .t -showheader 0 -selectmode single -showroot 0 -yscrollcommand {.y set}
scrollbar .y -ori vert -command ".t yview"
pack .y -side right -fill y
pack .t -side right -fill both -expand 1
set columnID [.t column create -text "Column 0"]
.t configure -treecolumn $columnID
.t element create el1 text
.t element create el2 rect -showfocus yes
.t style create s1
.t style elements s1 [list el1 el2]
.t style layout s1 el2 -union el1
.t configure -defaultstyle s1
# easily add a node with text $text as a child of $parent (the root is specified by the string "root")
proc add_node {parent text data} {
set itemID [.t item create -button yes ]
.t item element configure $itemID 0 el1 -text $text -data $data
.t item collapse $itemID
.t item lastchild $parent $itemID
return $itemID
}
set sample abcdef
set data1 $sample
set id1 [add_node root "This is data 1" $data1]
set id4 [add_node root "This is data 4" $data1]
set id5 [add_node root "This is data 5" $data1]
set id6 [add_node root "This is data 6" $data1]
set id7 [add_node root "This is data 7" $data1]
set id8 [add_node root "This is data 8" $data1]
set id9 [add_node root "This is data 9" $data1]
set id10 [add_node root "This is data 10" $data1]
set sample2 $id1
set sample3 $sample2
set dataObj [.t item element cget $sample3 0 el1 -data]
puts "--- $dataObj"
set dObj [Foo new]
set id2 [add_node $id1 "This is object Foo node" $dObj]
set dObj_1 [.t item element cget $id2 0 el1 -data]
$dObj test $dObj_1
在以下示例中使用值dataObj和dObj_1不仅可以在此程序中使用,还可以在多个名称空间之间使用,并且包含正确的包和方法调用。