0

Bwidgetsを使用してツリービューを作成し、それをTreeCtrlに変換しようとしていますが、TreeCtrlでBwidgetコマンドに相当するコマンドを理解できませんでした。

$tree itemcget $node -data
4

2 に答える 2

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

特定の場合に使いやすくするために、クラス(Snit、TclOO、XOTclなど)内でTkTreeCtrlをラップすることを推奨する人がたくさんいます。これは、包まれた状態でいいと思うようなものです…</ p>

于 2012-10-17T09:12:58.383 に答える
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を使用すると、このプログラム内だけでなく、パッケージとメソッド呼び出しが正しく含まれている複数の名前空間間で使用できます。

于 2012-10-22T09:55:10.617 に答える