実践?Tix(2):tkDND と tixDirTree
 このページのサンプルは、 tkDND のドラッグ/ドロップ機能とTixの tixDirTreeウィジェットを使って作った、 簡単なファイルビューアです。 ファイル一覧からファイルを他のアプリケーションのウィンドウにドロップできる他、 画像ファイルをダブルクリックするとウィンドウが開いて内容を見ることができます。
 

スクリーンショット

 

 tixDirTreeの使い方に特に変わったところはありませんが、 キー入力でディレクトリを移動できると便利だなあとGNOMEのgmcファイルマネージャを見ながら思ったので、 その機能だけ付け足しました。ディレクトリ名を編集してENTERキーを押すと、 tixDirTreeのchdirサブコマンドでそのディレクトリにフォーカスを移動させています。 また、tixDirTreeがクリックされてフォーカスが変わるたびに、 -browsecmdオプションで指定したコマンドでエントリ内のディレクトリ文字列を変えています。
 なお将来の版ではTix自身がドラッグ/ドロップ機能を持つことになるようです。
 ソースプログラムです。

package require Tix
package require tkdnd
package require pife
option add *Font kanji16
wm title . "Sample Directory Viewer"
set m [menu .m]
. configure -menu $m
set mf [menu $m.mf]
$mf add command -label "終了" -command exit
$m add cascade -label "ファイル" -menu $mf

set fa [frame .fa -rel groove -bd 2]
set g [tixDirTree $fa.g -width 200 -height 320 \
  -showhidden 1 -command "dirTreeClickCmd $fa.g" \
  -browsecmd "dirTreeClickCmd $fa.g" ]
pack $g

set fb [frame .fb -rel groove -bd 2]
set g [tixHList $fb.g -xsc "$fb.scrh set"  -ysc "$fb.scrv set" \
  -separator / -width 40 -height 20 -columns 3 -header 1 \
  -command "hlistActivateCmd $fb.g" -fg "#0000c0" ]
scrollbar $fb.scrv -ori v -command "$g yview"
scrollbar $fb.scrh -ori h -command "$g xview"
grid $g -row 1 -col 1
grid $fb.scrv -row 1 -col 2 -sti ns
grid $fb.scrh -row 2 -col 1 -sti ew

$g header create 0 -text 名前
$g header create 1 -text サイズ
$g header create 2 -text 更新時刻

dnd bindsource $g text/uri-list "return \[getSelectedFileName $g\]"
bind $g <Button-1> {
    if {[llength [%W info selection]] > 0} {
        dnd drag %W -actions {copy move link}
    }
}
bind $g <Button1-Leave> { break }

set fm [frame .fm -rel groove -bd 2]
set ea [entry $fm.ea -width 60 -textvariable xvCwd]
set xvCwd [.fa.g cget -value]
pack $ea
bind $ea <Key-Return> {.fa.g chdir $xvCwd; dirTreeClickCmd .fb.g $xvCwd}

proc dirTreeClickCmd {g dirs} {
    global xvCwd
    set dir [lindex $dirs 0]
    set xvCwd $dir

    set ha ".fb.g"
    $ha delete all
    set i 0
    foreach e [glob -nocomplain [file join $dir *]] {
	set a [file tail $e]
	$ha add $i -text $a -itemtype text
	$ha item create $i 1 -text [file size $e]
        $ha item create $i 2 -text [clock format [file mtime $e] \
          -format {%Y/%m/%d %H:%M:%S}]
        incr i
    }
}

proc getSelectedFileName g {
    set dir [.fa.g cget -value]
    set r {}
    foreach e [$g info selection] {
        lappend r [file join $dir [$g entrycget $e -text]] }
    return $r
}

set ICount 0
proc hlistActivateCmd {g index} {
    global ICount
    set e [$g entrycget $index -text]
    set dir [.fa.g cget -value]
    set path [file join $dir $e]

    if [file isdirectory $path] return

    set w [toplevel .g$ICount]
    wm title $w $path
    set im [image create photo Image$ICount -file $path]
    pack [set la [label $w.la -image $im]]
    bind $la <Button-3> "destroy $w"
    incr ICount
}
pack $fm -side top -anc w
pack $fa $fb -side left
# end.

拡張レビュー分室 top
(first uploaded 2001/09/22 last updated (not ever), MISUMI URANO)