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

Dynamisches Füllen einer LISTBOX ???: Directory lesen und LISTBOX füllen ???



<< |< 1 2 >| >> 15 Einträge, 2 Seiten
Gerry
 2004-09-02 18:24
#42636 #42636
User since
2004-08-18
26 Artikel
BenutzerIn
[default_avatar]
Nachdem ich in diesem Thread (-> http://board.perl-community.de/cgi-bin....3;t=217) doch einiges erfahren und gelernt habe, wie man ein DIRECTORY auswählt, komme ich nun zum eigentlichen Kern meiner Diskussion.

Ich möchte folgendes erledigen (wieder unter WIN32):
1. Selektiere ein Directory (das mache ich wie im o.g. thread diskutiert).
2. Lese die Namen aller *.pl Programme aus dem selektierten Directory aus.
3. Schreibe diese unter (2) ausgelesenen Dateinamen in eine LISTBOX.
4. Selektiere einen oder mehrere Einträge aus der LISTBOX.
5. Führe nun diejenigen Programme aus, die ich aus der LISTBOX selektiert habe.

Nun, hört sich für mich logisch an und ich denke es gibt hierfür schon gute Ansätze. Ich habe versucht, im unten angehängten Beispiel solch eine Funktion abzubilden. Es ist alles noch sehr holprig, das ist aber weniger von Belang. Wie ihr seht, kann ich schon mal ein Directory auswählen (yep, ich weiß dass meine Lösung der DIRECTORY Auswahl alles andere als Elegant ist, aber es geht schon noch). Im Moment fülle ich aber die LISTBOX noch manuell mit "a.pl", "b.pl" und "c.pl". Und genau das möchte ich ändern.

Frage 1: -> Wer kann mir sagen, wie ich nun die Dateinamen uas einem vorher selektierten Directory auslese und sie in die LISTBOX einfüge?
Frage 2: -> Wer kann mir sagen, wie ich dann die SELEKTIERTEN Einträge der LISTBOX dazu verwende, die Perl-Programme auszuführen? Ich muss wohl die LISTBOX-Einträge irgendwie mit einem INDEX versehen, um sie dann auszulesen (oder so ähnlich). Ich habe leider trotz stundenlangem Suchen kein vernünftiges Beispiel gefunden und hoffe nun, von Euch die entsprechenden Tips zu bekommen.


Code: (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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/usr/bin/perl
use strict;
use Tk;
use Tk::LabFrame;
use File::Basename;

my $mw = MainWindow->new;
$mw->title("Ein TEST mit LISTBOX");

# *****************************************************************************
# ** Generiere Menü AUSWAHL DES DIRECTORIES ***********************************
# *****************************************************************************
my $laden = $mw->LabFrame(-label=>'[ 1--> Auswahl des Directories ]', -labelside=>'acrosstop')
->pack (-side =>'top', -expand=>1, -fill=>'x');
my $laden_button = $laden->Button(-text=>'Auswählen', -command=> \&Load_Path)
->pack (-side=>'left', -expand=>0, -fill=>'none');
my $laden_entry = $laden->Entry(-width=>50)
->pack (-side=>'left', -expand=>1, -fill=>'x');

# *****************************************************************************
# ** Generiere Menü PROGRAMME-AUSWÄHLEN ***************************************
# *****************************************************************************
my $listbox_frame = $mw->LabFrame(-label=>'[ 2--> Programme-Auswählen ]', -labelside=>'acrosstop')
->pack (-side =>'top', -expand=>1, -fill=>'x');
my $Auswahl_Liste = $listbox_frame->Listbox("width" => 20,
"height" => 5,


-selectmode => 'single')


->pack(-side=> 'left');
$Auswahl_Liste->insert('end', "a.pl",
"b.pl",

"c.pl",);


$Auswahl_Liste->bind('<Double-1>', \&Zeige_Auswahl);


# *****************************************************************************
# ** Generiere Menü PROGRAMME AUSFÜHREN ***************************************
# *****************************************************************************
my $button = $mw->LabFrame(-label=>'[ 3--> Programme ausführen ]', -labelside => 'acrosstop')
->pack(-side=>'top', -expand=>1, -fill=>'x');
my $doit_btn = $button->Button(-text=>'Ausgewählte Programme ausführen', -command=> \&Run_Perl_Prog)

->pack(-side=>'left', -expand=>0);



MainLoop();
# *****************************************************************************
# ** Sub ZEIGE_AUSWAHL ********************************************************
# *****************************************************************************
sub Zeige_Auswahl {
my $Auswahl = $Auswahl_Liste->get('active');
return if (!$Auswahl);
print "Deine Auswahl: '$Auswahl'.\n";
my $Run_Prog = "D:\\eigene\\MY_DEVELOPMENT\\My_PERL_TK\\LIST_BOX_2\\$Auswahl";
system($^X, $Run_Prog);
}


# *****************************************************************************
# ** Sub LADE PATH ************************************************************
# *****************************************************************************
sub Load_Path {
my $file_typ = [
['PERL Program', '.pl' ],
['All Files', '*' ],
];
my $dn = $mw->getOpenFile(-filetypes=>$file_typ);
my $file = $dn;
my $dn = dirname($file);
my $sl = "/";
print "Pfad ist: $dn$sl";
if (defined $dn and $dn ne '') {
$laden_entry->delete(0, 'end');
$laden_entry->insert('end', $dn);
}
}


# *****************************************************************************
# ** Sub Run_Perl_Prog ********************************************************
# *****************************************************************************
sub Run_Perl_Prog {
my $DoIt_1 = $laden_entry->get();
if(!$DoIt_1 || $DoIt_1 eq ''){
$mw->messageBox(-message=>" Bitte zuerst ein Programm auswählen.",
-type=>"OK"),
return 1;
}
print "Dateinamen: $DoIt_1 \n";
my $tmp_1 = system(qx($^X $DoIt_1));
}
Crian
 2004-09-02 19:04
#42637 #42637
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
Schau Dir mal das zweite Beispiel an in unserem Tutorial, da sollten sich all Deine Fragen klären:

http://wiki.perl-community.de/bin....apitel7

Ich hab gerade ein Programm in Arbeit, da schreibe ich Dateien aus einem Verzeichnis in eine HList, aber das ist wahrscheinlich nicht das, was Du willst...\n\n

<!--EDIT|Crian|1094137565-->
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Gerry
 2004-09-02 19:22
#42638 #42638
User since
2004-08-18
26 Artikel
BenutzerIn
[default_avatar]
Crian, danke für den Hinweis. In diesem Tutorial habe ich auch schon nachgeschaut. Im angegebenen Tutorial ist die LISTBOX ebenfalls schon "statisch" gefüllt.
Ich möchte aber zuerst ein Unterverzeichnis nach bestimmten Dateien durchsuchen und dann die gefundenen DATEI-NAMEN in die LISTBOX übernehmen.

Ich habe mir schon überlegt, die gefundenen Datei-Namen in eine FILE zu schreiben und dann den INHALT der File (die dann die benötigten Datei-Namen beinhaltet), Satzweise auszulesen und in die LISTBOX einzufüllen. So was ähnliches wird schon hier diskutiert: http://board.perl-community.de/cgi-bin....3;t=216

Aber ich warte mal ab, was noch so alles an Info's reinkommt.
renee
 2004-09-03 01:53
#42639 #42639
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
in Load_Path...
Code: (dl )
1
2
3
4
5
6
7
8
9
[...]     my $dn   = dirname($file);                          
my $sl = "/";
print "Pfad ist: $dn$sl";
my @files = glob($db.'/*.pl');
$laden_entry->delete(0, 'end') if(@files);
foreach my $pl(@files){
$laden_entry->insert('end', $pl);
}
[...]
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/
ptk
 2004-09-03 12:34
#42640 #42640
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
[quote=renee,02.09.2004, 23:53]
Code: (dl )
1
2
3
4
5
[...]
foreach my $pl(@files){
$laden_entry->insert('end', $pl);
}
[...]
[/quote]
Das kann auch abgekuerzt werden:
Code: (dl )
$laden_entry->insert('end', @files)
Gerry
 2004-09-03 13:29
#42641 #42641
User since
2004-08-18
26 Artikel
BenutzerIn
[default_avatar]
So, liebe Gemeinde, wir kommen der Sache Stück für Stück näher. Ich habe die Vorschläge von renee und ptk berücksichtigt und das kleine Programm angepasst (sie nachstehenden Code).

Was passiert jetzt im Moment?
1. ich kann über den Button "Auswählen" ein Directory wählen (yep, nach wie vor selektiere ich eine Datei und schneide mir dann einfach den Pfad heraus).
2. Die LISTBOX wird mit den gefundenen *.PL-Dateien gefüllt. Hier habe ich jetzt das Problem, dass auch der gesamte Pfad zur Datei noch mit dabei ist. Aber das lässt sich sicherlich noch lösen.
3. Ich wähle jetzt EINEN Eintrag aus der LISTBOX aus und drücke auf den Button "Ausgewählte Programme ausführen". Und jetzt passiert folgendes:
3.1 Ich erhalte den Fehler "Ausgewaehlte Datei: 2. Can't open perl script "2": No such file or directory".
3.2 Ich erhalte also den INDEX der ausgewählten Datei und dieser Index beginnt wohl bei "0", da ich den DRITTEN Eintrag in der Listbox auswähle und mir dann aber "2" als ausgewählten Eintrag angezeigt wird.
3.3 FRAGE: wie kann ich jetzt den EINTRAG auswählen, also den NAMEN des Perl Programmes, das ich ausgewählt habe? Ich möchte also dasjenige Perl Programm ausführen, das ich ausgewählt habe.

Hier ist der aktuelle Code:

Code: (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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/perl
use strict;
use Tk;
use Tk::LabFrame;
use File::Basename;

# *****************************************************************************
# ** Generiere HAUPTMENÜ ******************************************************
# *****************************************************************************
my $mw = MainWindow->new;
$mw->title("Ein TEST mit LISTBOX");

# *****************************************************************************
# ** Generiere Menü AUSWAHL DES DIRECTORIES ***********************************
# *****************************************************************************
my $laden = $mw->LabFrame(-label=>'[ 1--> Auswahl des Directories ]', -labelside=>'acrosstop')
->pack (-side =>'top', -expand=>1, -fill=>'x');
my $laden_button = $laden->Button(-text=>'Auswählen', -command=> \&Load_Path)
->pack (-side=>'left', -expand=>0, -fill=>'none');
my $laden_entry = $laden->Entry(-width=>100)
->pack (-side=>'left', -expand=>1, -fill=>'x');

# *****************************************************************************
# ** Generiere LISTBOX ********************************************************
# *****************************************************************************
my $listbox_frame = $mw->LabFrame(-label=>'[ 2--> Programme-Auswählen ]', -labelside=>'acrosstop')
->pack (-side =>'top', -expand=>1, -fill=>'x');
my $Auswahl_Liste = $listbox_frame->Listbox("width" => 70,
"height" => 5,

-selectmode => 'single')

->pack(-side=> 'left');

my $doit_btn = $listbox_frame->Button(-text=>'Ausgewählte Programme ausführen', -command=> \&Run_Perl_Prog)

->pack(-side=>'left', -expand=>0);



MainLoop();
# *****************************************************************************
# ** Sub LOAD PATH ************************************************************
# *****************************************************************************
sub Load_Path {
my $file_typ = [
['PERL Program', '.pl' ],
['All Files', '*' ],
];
my $dn = $mw->getOpenFile(-filetypes=>$file_typ);
my $file = $dn;
my $dn = dirname($file);

if (defined $dn and $dn ne '') {
$laden_entry->delete(0, 'end');
$laden_entry->insert('end', $dn);

my @files = glob($dn.'/*.pl');
$Auswahl_Liste->delete(0, 'end')
if(@files);
$Auswahl_Liste->insert('end', @files)
}
}


# *****************************************************************************
# ** Sub Run_Perl_Prog ********************************************************
# *****************************************************************************
sub Run_Perl_Prog {
my $DoIt_1 = $Auswahl_Liste->curselection(); #<-- Hole Eintrag aus LISTBOX ($Auswahl_Liste)
print "Ausgewaehlte Datei: $DoIt_1\n";
if(!$DoIt_1 || $DoIt_1 eq ''){
$mw->messageBox(-message=>" Zuerst ein Programm auswählen.",
-type=>"OK"),
return 1;
}
my $tmp_1 = system(qx($^X $DoIt_1));
}
renee
 2004-09-03 14:10
#42642 #42642
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Um nur die Dateinamen zu bekommen:

in Load_Path:
Code: (dl )
$_ = basename($_) for(@files);


direkt nach
Code: (dl )
my @files = glob($dn.'/*.pl');
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/
renee
 2004-09-03 14:23
#42643 #42643
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
So bekommst Du den Programmnamen:

Code: (dl )
    my $DoIt_1 = $Auswahl_Liste->get($Auswahl_Liste->curselection()); 
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/
Gerry
 2004-09-03 18:21
#42644 #42644
User since
2004-08-18
26 Artikel
BenutzerIn
[default_avatar]
Mit eurer Hilfe bin ich der endgültigen Lösung (wenn es sowas überhaupt gibt) sehr nahe. Die LISTBOX wird jetzt sauber gefüllt, und zwar nur mit den DATEI-NAMEN (also ohne den PFAD). Nur der letztendliche Schritt, nämlich das ausgewählte programm auszuführen, schlägt fehl.

Die Fehlermeldung:
Code: (dl )
1
2
Die Syntax für den Dateinamen, Verzeichnisnamen oder die Datenträgerbezeichnung
ist falsch.


Offensichtlich ist dieser aufgerufene String fehlerhaft (in SUB RUN_PERL_PROG, vorletzte Zeile)
Code: (dl )
1
2
3
4
5
...
...
my $tmp_2 = system(qx($^X $tmp_1));
...
...


Hier nochmals der komplette Code zum testen:
Code: (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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#!/usr/bin/perl
use strict;
use Tk;
use Tk::LabFrame;
use File::Basename;

# *****************************************************************************
# ** Generiere HAUPTMENÜ ******************************************************
# *****************************************************************************
my $mw = MainWindow->new;
$mw->title("Ein TEST mit LISTBOX");

# *****************************************************************************
# ** Generiere Menü AUSWAHL DES DIRECTORIES ***********************************
# *****************************************************************************
my $laden = $mw->LabFrame(-label=>'[ 1--> Auswahl des Directories ]', -labelside=>'acrosstop')
->pack (-side =>'top', -expand=>1, -fill=>'x');
my $laden_button = $laden->Button(-text=>'Auswählen', -command=> \&Load_Path)
->pack (-side=>'left', -expand=>0, -fill=>'none');
my $laden_entry = $laden->Entry(-width=>100)
->pack (-side=>'left', -expand=>1, -fill=>'x');

# *****************************************************************************
# ** Generiere LISTBOX ********************************************************
# *****************************************************************************
my $listbox_frame = $mw->LabFrame(-label=>'[ 2--> Programme-Auswählen ]', -labelside=>'acrosstop')
->pack (-side =>'top', -expand=>1, -fill=>'x');
my $Auswahl_Liste = $listbox_frame->Listbox("width" => 70,
"height" => 5,

-selectmode => 'single')

->pack(-side=> 'left');

my $doit_btn = $listbox_frame->Button(-text=>'Ausgewählte Programme ausführen', -command=> \&Run_Perl_Prog)

->pack(-side=>'left', -expand=>0);



MainLoop();
# *****************************************************************************
# ** Sub LOAD PATH ************************************************************
# *****************************************************************************
sub Load_Path {
my $file_typ = [
['PERL Program', '.pl' ],
['All Files', '*' ],
];
my $dn = $mw->getOpenFile(-filetypes=>$file_typ);
my $file = $dn;
my $dn = dirname($file);

if (defined $dn and $dn ne '') {
$laden_entry->delete(0, 'end');
$laden_entry->insert('end', $dn);

my @files = glob($dn.'/*.pl');
$_ = basename($_) for(@files); # <---Nur FILE NAME übrig lassen.
$Auswahl_Liste->delete(0, 'end')
if(@files);
$Auswahl_Liste->insert('end', @files)
}
}


# *****************************************************************************
# ** Sub Run_Perl_Prog ********************************************************
# *****************************************************************************
sub Run_Perl_Prog {
my $Get_Path = $Auswahl_Liste->get($Auswahl_Liste->curselection());
my $Get_File_Name = $laden_entry->get();
my $slash = "/";
print "Ausgewaehlter Pfad: $Get_File_Name\n";
print "Der Slash : $slash\n";
print "Ausgewaehlte Datei: $Get_Path\n";
if(!$Get_Path || $Get_Path eq ''){
$mw->messageBox(-message=>" Zuerst ein Programm auswählen.",
-type=>"OK"),
return 1;
}
my $tmp_1 = "$Get_File_Name$slash$Get_Path";
my $tmp_2 = system(qx($^X $tmp_1));
}
Gerry
 2004-09-03 18:41
#42645 #42645
User since
2004-08-18
26 Artikel
BenutzerIn
[default_avatar]
Hoppla, da habe ich aber einiges durcheinander gewürfelt. Bitte den kompletten SUB RUN_PERL_PROG austauschen.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# *****************************************************************************
# ** Sub Run_Perl_Prog ********************************************************
# *****************************************************************************
sub Run_Perl_Prog {
my $Get_Path = $laden_entry->get();
my $Get_File_Name = $Auswahl_Liste->get($Auswahl_Liste->curselection());
my $slash = "/";
print "Ausgewaehlter Pfad: $Get_Path\n";
print "Der Slash : $slash\n";
print "Ausgewaehlte Datei: $Get_File_Name\n";
print "$Get_Path$slash$Get_File_Name";
if(!$Get_Path || $Get_Path eq ''){
$mw->messageBox(-message=>" Zuerst ein Programm auswählen.",
-type=>"OK"),
return 1;
}
my $tmp_1 = "$Get_Path$slash$Get_File_Name";
my $tmp_2 = system(qx($^X $tmp_1));
}
<< |< 1 2 >| >> 15 Einträge, 2 Seiten



View all threads created 2004-09-02 18:24.