Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]13170[/thread]

Tk::DirTree und Wurzelverzeichnis

Leser: 6


<< >> 6 Einträge, 1 Seite
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).
renee
 2009-02-21 10:16
#119058 #119058
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Also man soll auch gar nicht in die übergeordneten Verzeichnisse kommen?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
meier19
 2009-02-21 10:18
#119059 #119059
User since
2009-02-03
73 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo renee

Vielen Dank für die rasche Antwort. Ja, die übergeordneten Verzeichnisse sollen nicht dargestellt werden, und man soll also nicht dahin gelangen können.

Gruss
meier19
Der Mensch schöpft seine Gesetze nicht aus der Natur, sondern schreibt sie dieser vor (Immanuel Kant).
renee
 2009-02-21 11:26
#119060 #119060
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Das scheint mit Tk::DirTree nicht zu gehen. Schau mal, ob Du nicht was mit Tk::Tree selbst machen kannst...

Oder schau Dir WxPerl an ;-)
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
meier19
 2009-02-21 11:34
#119061 #119061
User since
2009-02-03
73 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ich gebe mich nicht ganz zufrieden mit der Antwort, wonach es mir DirTree nicht zu gehen scheine. Wenn doch DirTree von Tree abhängt und Tree von HList, das die Möglichkeit gibt, das Wurzelverzeichnis zu bestimmen. Nachdem ich mich nun mit einigem Aufwand in Perl-Tk eingearbeitet habe, möchte ich nicht wegen eines Detailproblems auch noch WxPerl erlernen. Mit Tree werde ich es jedoch dem Ratschlag entsprechend versuchen.

Also ist meine Frage immer noch offen, und ich würde mich freuen, wenn man mir einen Ansatz zur Lösung des gestellten Problems aufzeigen könnte.
Der Mensch schöpft seine Gesetze nicht aus der Natur, sondern schreibt sie dieser vor (Immanuel Kant).
meier19
 2009-02-23 12:21
#119076 #119076
User since
2009-02-03
73 Artikel
BenutzerIn
[Homepage] [default_avatar]
Lösung mit Tk::Tree

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
#!/usr/bin/perl
use strict;
use warnings;

# Module einbinden
use Tk;
use Tk::Tree;
use utf8;

# Fenster erstellen
my $mw = MainWindow -> new;

# Hilfetext
my $text = 'Doppelklick oder <Enter> auf Zeile';
$mw -> Label (-textvariable => \$text) -> pack (-side => 'top');

# Verzeichnisbaum erstellen
my $tree = $mw -> Tree (-command => sub {$text = shift}, -width => 30, -height => 20) -> pack (-anchor => 'nw');

# Zeilen in Verzeichnisbaum einfügen
foreach(qw (a b b.eins b.zwei b.drei b.drei.alfa b.drei.beta b.drei.beta.rot b.drei.beta.blau b.drei.beta.grün b.drei.gamma b.vier c d))
        {
        my @t = split (/\./, $_);
        $tree->add($_, -text => $t[-1]);
        }

# Weichen stellen
$tree->autosetmode();

# Beenden-Button
$mw -> Button (-text => 'Beenden', -command => sub {exit}) -> pack ();

# Fenstererstellung ausführen
MainLoop;
Der Mensch schöpft seine Gesetze nicht aus der Natur, sondern schreibt sie dieser vor (Immanuel Kant).
<< >> 6 Einträge, 1 Seite



View all threads created 2009-02-21 10:08.