如何在 tcl tk 中显示目录结构(资源管理器)?

How to show a directory structure(explorer) in tcl tk?

我无法在树控件中递归添加节点。即我想像在资源管理器中一样显示所有目录和文件。

到目前为止,这就是我所拥有的。我目前正在每个文件夹中添加虚拟节点。

package require treectrl
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

proc add_node {parent text} {
    set itemID [.t item create -button yes ]
    .t item element configure $itemID 0 el1 -text $text
    .t item collapse $itemID
    .t item lastchild $parent $itemID
    return $itemID    
}

set images [glob -nocomplain -directory "D:/Explore" "*"]
for {set i 0} {$i<=[llength $images]} {incr i} {
    set root [lsearch $images [lindex $images $i]]
    add_node [add_node [add_node root [list directory [file tail [lindex $images $i]]]] dummy] dummy2
}

首先,你需要使用glob命令的选项-tipes。这样就可以将目录和文件分开。其次,你需要递归来处理嵌套的文件和目录。

package require Tk
package require treectrl
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

proc add_node {parent text button} {
    set itemID [.t item create -button $button ]
    .t item element configure $itemID 0 el1 -text $text
    .t item collapse $itemID
    .t item lastchild $parent $itemID
    return $itemID
}

proc add_directory {path parent} {
  set directory_list [glob -nocomplain -types d -directory $path "*"]
  foreach directory $directory_list {
    set n [add_node $parent [file tail $directory] yes]
    add_directory $directory $n
  }
  set files_list [glob -nocomplain -types f -directory $path "*"]
  foreach file $files_list {
    set n [add_node $parent [file tail $file] no]
  }
}

add_directory "D:/Explore" root