Schrift
[thread]4821[/thread]

Laden/Ausführen/Anzeigen Programm via GUI: Wie implementiere ich das in PERL/TK?



<< >> 9 Einträge, 1 Seite
Gerry
 2004-08-22 14:40
#42527 #42527
User since
2004-08-18
26 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen,

nach reichlichem Lesen dieses Forums habe ich einige gute Ansätze für ein kleines Perl/TK-Programm gefunden, das die folgende simple Funktion haben soll:

1. LOKALISIERE ein PERL Programm über einen FILE OPEN Dialog.          

2. Zeige den PFAD zum PERL-Programm sowie den Namen des PERL Programmes in einem ENTRY FIELD an.                                              

3. Bei drücken der "AUSFÜHREN"-Taste soll das PERL-Programm ausgeführt werden. Der normalerweise im DOS-Fenster angezeigte OUTPUT soll  umgeleitet und in einem
AUSGABE-FENSTER angezeigt werden.

Mein Problem ist es nun, dass ich es nicht schaffe, das über den FILE OPEN Dialog gefundene PERL-Programm auszuführen und den normalerweise im DOS-Fenster angezeigten Ablauf bzw. den TEXT des PERL-Programmes in ein TEXT WIDGET im PERL/TK-Programm auszugeben.

Wer kann mir zeigen:
1. wie das über den FILE-OPEN Dialog gefundene PERL-Programm ausgeführt werden kann (siehe SUB Programm_Ausfuehren).
2. wie die "Umleitung" der DOS-Box Ausgabe in ein TEXT widget funtioniert.


Hier das Perl/TK-Programm:

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
99
100
101
102
103
104
105
106
#!/usr/bin/perl
# ******************************************************************************
# ** Funktion:                                                                **
# ** 1. LOKALISIERE ein PERL Programm über einen FILE OPEN Dialog.            **
# ** 2. Zeige den PFAD zum PERL-Programm sowie den Namen des PERL Programmes  **
# **    in einem ENTRY FIELD an.                                              **
# ** 3. Bei drücken der "AUSFÜHREN"-Taste soll das PERL-Programm ausgeführt   **
# **    werden. Der normalerweise im DOS-Fenster angezeigte OUTPUT soll       **
# **    umgeleitet und in einem AUSGABE-FENSTER angezeigt werden.             **
# ******************************************************************************

use Tk;                                               # Use TK.
use Tk::LabFrame;                                     # Use "Label Frame".


# *****************************************************************************
# ** Generiere das HAUPTFENSTER ***********************************************
# *****************************************************************************
my $mw = MainWindow->new;                             # Das "Hauptfenster".
$mw->title("Programm laden und Ausführen");           # Der TITEL von "Hauptfenster".


# *****************************************************************************
# ** Generiere DATEI Menü *****************************************************
# *****************************************************************************
$ErstesMenuBar     = $mw->Frame(-relief=>'groove', -borderwidth=>3)->pack(-side=>'top',-fill=>'x'); # Das Rahmenwerk.
$MeinErstesMenuBar = $ErstesMenuBar->Menubutton(-text=>'Datei')->pack(-side =>'left');              # Der Button "Datei".
$MeinErstesMenuBar->command(-label=>'Ende', -command=>sub{$mw->destroy});                           # Der Button "Ende".


# *****************************************************************************
# ** Generiere DATEI LADEN Menü (Laden des Programmes) ************************
# ** - Zuerst zeichne ich ein FRAME um die ganze Einheit **********************
# ** - Danach kommt der LADEN BUTTON ******************************************
# ** - Abschließend kommt das ENTRY Feld **************************************
# *****************************************************************************
my $laden        = $mw->LabFrame(-label=>'[ 1--> Lade Programm zur Ausführung ]', -labelside=>'acrosstop')->pack
               
      (-side =>'top', -expand=>1, -fill=>'x');                                #
my $laden_button = $laden->Button(-text=>'Programm laden', -command=> \&Lade_Programm)->pack # Pack
                    (-side=>'left', -expand=>0, -fill=>'none');                             #
my $laden_entry  = $laden->Entry(-width=>50)->pack                                           # Pack
                    (-side=>'left', -expand=>1, -fill=>'x');                                #


# *****************************************************************************
# ** Generiere DATEI AUSFÜHREN Menü (ausführen der Aktion) ********************
# ** - Zuerst zeichne ich ein FRAME um die ganze Einheit **********************
# ** - Danach kommt der AUSFÜHREN BUTTON **************************************
# ** - Abschließend kommt der ENDE BUTTON *************************************
# *****************************************************************************
my $button   = $mw->LabFrame(-label=>'[ 2--> Führe Programm aus ]', -labelside => 'acrosstop') # Definition des RAHMENS.
                 ->pack (-side=>'top',            -expand=>1, -fill=>'x');          # Pack ...
my $doit_btn = $button->Button(-text=>'Ausführen', -command=> \&Programm_Ausfuehren) # Rufe Unterprogramm.  
               
   ->pack(-side=>'left',            -expand=>0);                      # EXPAND 0: button so groß wie Text.
my $exit_btn = $button->Button(-text=>'Ende',      -command =>sub { $mw->destroy() })# Der Button "SCHLIEßEN".
                 ->pack(-side=>'left',            -expand=>0);                      # Pack ...


# *****************************************************************************
# ** Generiere AUSGABE-FENSTER für Ausgabe des Protokolles ********************
# *****************************************************************************
my $protokoll = $mw->Scrolled("Text",                 # Ein TEXT widget.
              -scrollbars => 'osoe',                 # Optional SOUTH, Optional EAST.
              -background => '#ffffff',              # Hintergrundfarbe des Fensters.
              -foreground => 'black',                # Textfarbe
              -width      => 90,                     # Fensterbreite
              -height     => 20,                     # Fensterhöhe
              -relief     => 'sunken',               # SUNKEN
              -font       => '{verdana} 10 {normal}',# FONT und FONT SIZE
              -wrap       => 'none')                 #
              ->pack(-side=>'top', -expand=>1, -fill=>'both');  # PACK ...


# *****************************************************************************
# ** Das abschließende TEXT LABEL *********************************************
# *****************************************************************************
my $MyLabel = $mw->Label(-text=>"© XYZ", -relief=>'groove')->pack();




MainLoop;
# *****************************************************************************
# ** Sub LADE PROGRAMM  *******************************************************
# *****************************************************************************
sub Lade_Programm {                                   # Start der Unterroutine "Lade Programm".  
    my $file_typ = [                                 # Definition der zu öffnenden Dateitypen.
                   ['PERL Programm', '.pl' ],        # Erster Eintrag  = ".pl".
                   ['Alle Dateien',  '*'   ],        # Zweiter Eintrag = "*".
                   ];                                # Ende der Definition.
    my $dn = $mw->getOpenFile(-filetypes=>$file_typ);# ???
    if (defined $dn and $dn ne '') {                 # ???
       $laden_entry->delete(0, 'end');               # ???
       $laden_entry->insert('end', $dn);             # ???
    }                                                # Ende der Schleife.
}                                                     # Ende der Unterroutine "Lade Programm".


# *****************************************************************************
# ** Sub Programm_Ausfuehren **************************************************
# *****************************************************************************
sub Programm_Ausfuehren {
#    system($^X, "C:/TEST/a.pl");                      # Führe dieses PERL-Programm aus.
}






Das auszugebende PERL-Programm ist sehr simpel:
Code: (dl )
1
2
#!/usr/bin/perl
print "Diesen Text am Bildschirm ausgeben\n";


Bearbeitet von Crian: CODE-Tags ergänzt.\n\n

<!--EDIT|Crian|1093257618-->
Ishka
 2004-08-22 15:50
#42528 #42528
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
zum Beispiel:
Code: (dl )
1
2
3
4
5
6
open PROG,"$pfad_zum_programm|";
while(<PROG>)
{
# hier Code, um die Ausgabe zu bearbeiten, steht in $_
}
close PROG;


hat aber den Nachteil, daß das Programm nicht reagieren kann, solange es auf Ausgaben des anderen Programmes wartet.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
Gerry
 2004-08-23 00:32
#42529 #42529
User since
2004-08-18
26 Artikel
BenutzerIn
[default_avatar]
Hallo Ishka,

danke für die Anwort. Leider muss ich zugeben, dass ich diese Information zur Zeit (ich stehe noch im frühen Lernstadium von Perl bzw. Perl/TK) nicht einordnen kann. Kannst Du mir zeigen, wie ich diesen Code in mein Programm einbauen muss?

(1)-> Wie ÜBERNEHME ich korrekt das AUSZUFÜHRENDE Programm aus dem Menü "Datei Laden" (siehe "my $laden ...")? Hier hole ich mir via Datei-öffnen Dialog den Pfad und den Namen des auszuführenden Programmes.

(2)-> Wie übergebe ich den Namen des auszuführenden PERL Programmes an die Unter-Routine "sub Programm_Ausführen"? Geschieht das in einem Übergabe-Parameter? Ich rufe hier das Unterprogramm auf, welches das auszuführende PERL Script startet.

()3-> Wie führe ich dann das Unterprogramm "sub Programm_Ausführen" aus? Ist das dann der Code den du in deiner Antwort angegeben hast? Ich denke dass ich hier den namen des auszuführenden Programmes erhalte und dieses dann ausführe.
Alexfo85
 2004-08-23 03:29
#42530 #42530
User since
2004-08-18
20 Artikel
BenutzerIn
[default_avatar]
Hi
Versuchs mal hiermit:
Code: (dl )
1
2
3
4
5
sub Programm_Ausfuehren {
my $proggi = $laden_entry->get(); #Eintrag holen
if(!$proggi){return 1;} # Nix machen wenn kein Program angegeben
$protokoll->insert('end', qx(perl.exe $proggi));
}


qx führt Programm aus und fängt ausgabe ab
mit $protokoll->insert('end', "ewrt"); wird das ganze gleich in dein Protokollfenster gesendet

perl.exe unter windows ...
sonst unix perl path


Btw... benutzt mal oben noch:
Code: (dl )
1
2
use strict;
use warnings;

dann siehste mehr (mögliche) Fehler, bzw verhinderst sie gleich ;)
ptk
 2004-08-23 12:34
#42531 #42531
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Oder besser (wie in einem anderen Thread in diesem Forum kuerzlich beschrieben): $^X statt perl oder perl.exe.
Gerry
 2004-08-23 14:07
#42532 #42532
User since
2004-08-18
26 Artikel
BenutzerIn
[default_avatar]
Hallo zusamme,

erst mal danke für die Beiträge. Ich bin schon wieder ein Stück weitergekommen. Allerdings ist es jetzt so, dass lediglich die Zeilen 1, 3, 5 usw. am Bildschirm ausgegeben werden. Also wird offensichtlich jede zweite Zeile ignoriert.

Hier ist der Code des Unterprogrammes "sub Programm_Ausfuehren":
Code: (dl )
1
2
3
4
5
6
7
sub Programm_Ausfuehren { 
my $proggi = $laden_entry->get(); # Eintrag holen (Name des auszuführenden PERL Programmes).
if(!$proggi){return 1;} # Keine Aktion wenn KEIN Program angegeben wurde.
$protokoll->insert('end', qx($^X $proggi)); # qx führt Programm aus und fängt Ausgabe ab.
# Mit $protokoll->insert('end', "ewrt"); wird das
# ganze gleich in dein Protokollfenster gesendet.
}


Hier ist der Inhalt der Datei "a.pl" (dieses Programm soll ausgeführt werden):

Code: (dl )
1
2
3
4
5
6
#!/usr/bin/perl
print "Zeile 1: Diesen Text am Bildschirm ausgeben\n";
print "Zeile 2: Diesen Text am Bildschirm ausgeben\n";
print "Zeile 3: Diesen Text am Bildschirm ausgeben\n";
print "Zeile 4: Diesen Text am Bildschirm ausgeben\n";
print "Zeile 5: Diesen Text am Bildschirm ausgeben\n";


Und das wird im Protokollfenster angezeigt:

Quote
Zeile 1: Diesen Text am Bildschirm ausgeben
Zeile 3: Diesen Text am Bildschirm ausgeben
Zeile 5: Diesen Text am Bildschirm ausgeben
Alexfo85
 2004-08-23 14:18
#42533 #42533
User since
2004-08-18
20 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
3
4
5
6
7
sub Programm_Ausfuehren 
{
   my $proggi = $laden_entry->get();          
   if(!$proggi){return 1;}
   my $tmp = qx($^X $proggi);
   $protokoll->insert('end', $tmp);                                          
}


Scheinbar überspringt er sonst was...
ptk
 2004-08-23 14:20
#42534 #42534
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Du hast zwei Moeglichkeiten, das Problem zu umgehen. Entweder schreibst du
Code: (dl )
$protokoll->insert('end', join "", qx($^X $proggi))
oder
Code: (dl )
1
2
3
for (qx($^X $proggi)) {
$protokoll->insert('end', $_);
}


Der Grund ist, dass insert immer abwechselnd Text und Tags erwartet:
Code: (dl )
$textwidget->insert($position, $text1, $tags1, $text2, $tags2, ...)
Gerry
 2004-08-23 15:24
#42535 #42535
User since
2004-08-18
26 Artikel
BenutzerIn
[default_avatar]
Hallo Alexfo85 und ptk,

danke für die informationen. Beide Ansätze habe ich ausprobiert und beide Ansätze führen zum erwünschten Resultat.

Super ... und nochmals danke für eure Hilfe.
<< >> 9 Einträge, 1 Seite



View all threads created 2004-08-22 14:40.