Thread Tk::DirTree und Wurzelverzeichnis (5 answers)
Opened by meier19 at 2009-02-21 10:08

meier19
 2009-02-21 10:08
#119057 #119057
User since
2009-02-03
73 Artikel
BenutzerIn
[Homepage] [default_avatar]
Mit Tk möchte ich die Verzeichnisstruktur ab einem bestimmten Verzeichnis darstellen und den Pfad jedes dargestellten Verzeichnisses abrufen können. Dafür steht Tk::DirTree zur Verfügung. Denn es gibt die Verzeichnisstruktur wider und ermöglicht, den Pfad für jedes dargestellte Verzeichnis abzurufen. Hier ein Skript-Beispiel, mit dem durch Mausklick auf ein Verzeichnis dessen Pfad ausgegeben wird:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/perl
use strict;
use warnings;

use Tk;
use strict;
use Tk::DirTree;
use Cwd;

my $mw = MainWindow->new;
$mw->geometry("300x400");
$mw->title("DirTree Example");

my $CWD = Cwd::cwd();

my $DIR_TREE = $mw->Scrolled('DirTree',
                             -scrollbars => "osoe",
                             -width => 30,
                             -height => 25,
                             -exportselection => 1,
                             -browsecmd => sub {$CWD = shift},
                             -command   => \&show_cwd)->pack(-fill => "both",
                                                             -expand => 1);

$DIR_TREE->chdir($CWD);

my $button_frame = $mw->Frame()->pack(-side => "bottom");
$button_frame->Button(-text => "Ok",
                      -command => \&show_cwd)->pack(-side => "left");
$button_frame->Button(-text => "Exit",
                      -command => sub{exit})->pack(-side => "left");

sub show_cwd {
  $mw->messageBox(-message => "Directory Selected: $CWD", -type => "ok");
}

MainLoop;



Was mir noch fehlt, ist die Möglichkeit, das Wurzelverzeichnis für die Darstellung vorzugeben. Denn nach dem Skript wird die Verzeichnisstruktur ab "/" als Wurzelverzeichnis dargestellt (Betriebssystem Linux-Ubuntu). Ich möchte jedoch nicht die ganze Verzeichnisstruktur darstellen lassen, sondern, wie ausgeführt, nur ab einem bestimmten Unterverzeichnis.

Meine Frage: wie lässt sich das Wurzelverzeichnis für die Darstellung der Verzeichnisstruktur mit Tk::DirTree bestimmen?

Gemäss Perldoc ist DirTree abgeleitet von Tree, und es enthält alle Methoden und Optionen dieser Überklasse. Tree wiederum ist abgeleitet von HList. HList erlaubt, das Wurzelverzeichnis zu bestimmen:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/perl
use strict;
use warnings;

use Tk;
use Tk::Label;
use Tk::HList;

my $mw = MainWindow->new();
my $label = $mw->Label(-width=>15);
my $hlist = $mw->HList(
                -itemtype   => 'text',
                -separator  => '/',
                -selectmode => 'single',
                -browsecmd  => sub {
                                my $file = shift;
                                $label->configure(-text=>$file);
                                }
                        );

foreach ( qw(/ /home /home/ioi /home/foo /usr /usr/lib) ) {
        $hlist->add($_, -text=>$_);
        }

$hlist->pack;
$label->pack;

MainLoop;



Da mir die Verzeichnisstruktur auch anderweitig zur Verfügung steht, könnte ich HList verwenden. HList bietet aber nicht die schöne Darstellung der Verzeichnisstruktur, wie sie von DirTree zur Verfügung gestellt wird. Möglicherweise lässt sich dies durch Kombination von DirTree und HList verwirklichen. Den Weg dazu habe ich aber bisher nicht gefunden.

Für jegliche Hilfe bin ich dankbar.
Der Mensch schöpft seine Gesetze nicht aus der Natur, sondern schreibt sie dieser vor (Immanuel Kant).

View full thread Tk::DirTree und Wurzelverzeichnis