# mit tcl/tk perl und bash befehle aufrufen



## Binio (4. März 2008)

Habe folgende Oberfläche aufgebaut:

```
#!/usr/bin/wish -f

#wm withdraw .

#Hauptfenster nicht änderbar in seiner Größe
wm resizable . 0 0

#Willkommenstext
#toplevel .logo

#Historyfenster
toplevel .th

#Bildfenster
toplevel .pic

wm title . "Perl Ausarbeitung"
#wm title .logo "Willkommen"
wm title .th "History"
wm title .pic "Graphische darstellung"

wm geometry . +100+100
#wm geometry .logo +350+350
wm geometry .th +715+100
wm geometry .pic +100+200
#destroy .pic

#===========Prozeduren===========Start
proc dateidialog {} {
    global datei
    
    #Dateitypen festlegen
    set filetypes {
        {"Alle Dateien" *}
        {"Textdateien" {.txt .TXT}}
        {"Tcl-Dateien" { .tcl .TCL .tk .TK} }
    }
    
    #Öffnendialog
    set datei [tk_getOpenFile \
        -initialdir [pwd]\
        -title "Datei öffnen..."\
        -filetypes $filetypes\
        -defaultextension .txt\
        -parent .]
    
    #In die proc einlesen gehen
    einlesen
}

proc einlesen {} {
    global datei
    global historyvar

    #...wenn $datei ungleich leer
    if {$datei !=""} then {
        #Variable sicherheitshalber leeren
        set thefile ""
        
        #Dateigröße bestimmen
        set filesize [file size $datei]
        
        #Datei öffnen zum Lesen und Schreiben
        set thefile [open $datei "r+"]
        
        #Datei in die Variable "inhalt" mit der Dateigröße einlesen
        set inhalt [read $thefile $filesize]
        
        #Inhalt der Variable "inhalt" in die Variable "historyvar" kopieren
        set historyvar $inhalt
        
        #Kanal schließen
        close $thefile
        
        #Kopf des Hauptfenster ändern
        wm title . $datei
    }
}

proc speichern_unter {} {
    global historyvar
    
    #Speicherndialog
    set datei [tk_getSaveFile -title "Speichern unter ..." -parent .]
    if { $datei == "" } {
        return; #Es wurde Abbruch gedrückt
    }
    
    #Datei öffnen zum Schreiben
    set x [catch {set fid [open $datei "w+"]}]
    
    #Schreibe in die Datei
    set y [catch {puts $fid $historyvar}]
    
    #Kanal schließen
    set z [catch {close $fid}]
    
    #Überprüfen ob alles gut ging und die Datei existiert, lesbar und kein Verzeichnis ist
    if { $x || $y || $z || ![file exists $datei] || ![file isfile $datei] || ![file readable $datei] } {
        tk_messageBox -parent . -icon error -message "Ein error endstand während des speichern in \"$datei\""
    } else {
        tk_messageBox -parent . -icon info -message "Speichervorgang erfolgreich"
    }
}
#===========Prozeduren===========Ende

#===========Logo===========Start
#message .logo.text -text "Willkommen bei mein Programm welches Ihnen erleichtert ..." -aspect 200
#button .logo.btn -text "Ende" -command {exit}
#pack .logo.text .logo.btn
#===========Logo===========Ende

#===========Menüleiste===========Start
pack [frame .mbar -relief groove -bd 3] -side top -expand yes -fill x
pack [menubutton .mbar.datei -text "Datei" -menu .mbar.datei.menu] -side left

menu .mbar.datei.menu
.mbar.datei.menu add command -label "Öffnen" -command {dateidialog}
.mbar.datei.menu add command -label "Speichern unter ..." -command {speichern_unter}
.mbar.datei.menu add command -label "Beenden" -command {exit}
#===========Menüleiste===========Ende

#===========Haupt===========Start    
pack [frame .auswahl -relief groove -bd 2] -side left -anchor n
pack [label .auswahl.label -text "Regulärer Ausdruck"] -side left
pack [entry .auswahl.eingabe -width 50 -textvariable eingabevar] -side left
pack [checkbutton .auswahl.cb1 -text "Grafisch" -variable grafikvar] -side left
pack [checkbutton .auswahl.cb2 -text "Textuel" -variable textvar] -side left
pack [button .auswahl.los -text "LOS" -padx 20 -command {
    global eingabevar
    global grafikvar
    global textvar
    
    #... wenn Eingabefeld nicht leer ist, d.h. mindestens 1 Zeichen enthält
    if { [string length $eingabevar] > 0 && [.th.historylist get end] != $eingabevar } {
        .th.historylist insert end $eingabevar
        if { $grafikvar == 1 } {
            set labelbild [pwd]/Images/welle.pgm
            set foto [image create photo -file $labelbild]
            label .pic.l -image $foto
            pack .pic.l
        }
        if { $textvar == 1 } {
        
        }
    }
}] -side left
#===========Haupt===========Ende

#===========History===========Start
pack [label .th.lhistory2 -text "Ihre Aktion:"] -side top

pack [frame .th.aktion -relief groove -bd 2] -side top -anchor n
pack [button .th.aktion.bladen -text "In Eingabe laden" -padx 20 -command {
    .auswahl.eingabe delete 0 end
    .auswahl.eingabe insert 0 "[.th.historylist get active]"
}] -side left
pack [button .th.aktion.bloeschen -text "Aus der History löschen" -padx 20 -command {
    .th.historylist delete [.th.historylist index active]
}] -side left
pack[listbox .th.historylist -width 50 -height 20 -listvariable historyvar] -side bottom

.th.historylist insert end {/^a(b|z$)/} {/^(a|b)(c|d)$/} {/^(a(b|c)|def)$/}

focus .th.historylist
#===========History===========Ende

update
focus -force .auswahl.eingabe
```
und möchte je nach dem welche Checkbox gewählt ist das Erzeuge Bild von

```
perl re_graph.pl -o test.png '^([A-Za-z]*?)\s*([A-Za-z]*?)\s*(\d*?)\s*(\d*?):(\d*?):(\d*)\s*(\d*)$'
```
anzeigen oder die ausgabe von

```
#!/usr/bin/perl -w

use YAPE::Regex::Explain;
use strict;

my $re = '^([A-Za-z]*?)\s*([A-Za-z]*?)\s*(\d*?)\s*(\d*?):(\d*?):(\d*)\s*(\d*)$ ';
my $parser = YAPE::Regex::Explain->new($re);
print $parser->explain;
```
anzeigen lassen.
Finde überhaupt nichts im Internet wie ich sowas machen kann


----------



## Binio (7. März 2008)

Hier der funktionierende Code:


```
#!/usr/bin/wish -f

# =====================================================================================
#
#       Filename:  ausarbeitung1.tcl
#
#    Description:  Regul\Uffffffff Ausdr\Uffffffffraphisch und Textuel darstellen
#
#        Version:  1.0
#        Created:  7.03.2008
#       Revision:  none
#       Compiler:  Tcl/Tk
#
#         Author:  Robert Slowikowski admin@binnio.de
#        Company:  Fachhochschule S\Ufffffffffalen, Iserlohn
#
#   Mit diesem Programm k\Uffffffffn Sie ihre Regul\Uffffffffn Audr\Uffffffffraphisch oder Textuel
#   darstellen. Es gibt die m\Uffffffffchkeit diese zu speichern und zu ein anderen Zeitpunkt
#   zu laden und weiter zu bearbeiten.
# =====================================================================================


# Packet welches es erlaubt Jpeg, PNG, Tiff, PPM, ICO, XPM, XBM oder PCX einzubinden
set packetResult [catch { package require Img }]
if {$packetResult != 0} {
    wm withdraw .

    toplevel .fehler
    wm title .fehler "Fehler"
    pack [ message .fehler.meldung -width 300 -text "Es fehlt Ihnen das Packet \
    \"Img\" um graphische Elemente darzustellen \n\n Die Version 1.3 \
    ist bei Sourceforge erh\Ufffffffflich, dort hei\Uffffffff sie wegen eines Namenskonflikts \
    \"Tkimg\". Unter Debian hei\Uffffffff das Packet \"libtk-img\"." ] -side top
    pack [ button .fehler.ok -text "Ende" -command {exit} ] -side top
} else {
    #Hauptfenster nicht \Ufffffffferbar in seiner Gr\Uffffffff
    wm resizable . 0 0
    
    #Willkommenstext
    #toplevel .logo
    
    #Historyfenster
    toplevel .th
    
    wm title . "Perl Ausarbeitung"
    #wm title .logo "Willkommen"
    wm title .th "History"

    wm geometry . +100+100
    #wm geometry .logo +350+350
    wm geometry .th +815+100
    #destroy .pic

    #===========Prozeduren===========Start
    proc dateidialog {} {
        global datei
        
        #Dateitypen festlegen
        set filetypes {
            {"Alle Dateien" *}
            {"Textdateien" {.txt .TXT}}
            {"Tcl-Dateien" { .tcl .TCL .tk .TK} }
        }
        
        #\Ufffffffffnendialog
        set datei [tk_getOpenFile \
            -initialdir [pwd]\
            -title "Datei \Uffffffffen..."\
            -filetypes $filetypes\
            -defaultextension .txt\
            -parent .]
        
        #In die proc einlesen gehen
        einlesen
    }

    proc einlesen {} {
        global datei
        global historyvar

        #...wenn $datei ungleich leer
        iif {$datei !=""} then {
            #Variable sicherheitshalber leeren
            set thefile ""
            
            #Dateigr\Uffffffffbestimmen
            set filesize [file size $datei]
            
            #Datei \Uffffffffen zum Lesen und Schreiben
            set thefile [open $datei "r+"]
            
            #Datei in die Variable "inhalt" mit der Dateigr\Uffffffffeinlesen
            set inhalt [read $thefile $filesize]
            
            #Inhalt der Variable "inhalt" in die Variable "historyvar" kopieren
            set historyvar $inhalt
            
            #Kanal schlie\Uffffffffn
            close $thefile
            
            #Kopf des Hauptfenster \Uffffffffern
            wm title . $datei
        }
    }

    proc speichern_unter {} {
        global historyvar
        
        #Speicherndialog
        set datei [tk_getSaveFile -title "Speichern unter ..." -parent .]
        if { $datei == "" } {
            return; #Es wurde Abbruch gedr\Uffffffff        }
        
        #Datei \Uffffffffen zum Schreiben
        set x [catch {set fid [open $datei "w+"]}]
        
        #Schreibe in die Datei
        set y [catch {puts $fid $historyvar}]
        
        #Kanal schlie\Uffffffffn
        set z [catch {close $fid}]
        
        #\Ufffffffferpr\Uffffffffb alles gut ging und die Datei existiert, lesbar und kein Verzeichnis ist
        if { $x || $y || $z || ![file exists $datei] || ![file isfile $datei] || ![file readable $datei] } {
            tk_messageBox -parent . -icon error -message "Ein error endstand w\Uffffffffend des speichern in \"$datei\""
        } else {
            tk_messageBox -parent . -icon info -message "Speichervorgang erfolgreich"
        }
    }
    #===========Prozeduren===========Ende

    #===========Logo===========Start
    #message .logo.text -text "Willkommen bei mein Programm welches Ihnen erleichtert ..." -aspect 200
    #button .logo.btn -text "Ende" -command {exit}
    #pack .logo.text .logo.btn
    #===========Logo===========Ende

    #===========Men\Uffffffffe===========Start
    pack [frame .mbar -relief groove -bd 3] -side top -expand yes -fill x
    pack [menubutton .mbar.datei -text "Datei" -menu .mbar.datei.menu] -side left

    menu .mbar.datei.menu
    .mbar.datei.menu add command -label "\Ufffffffffnen" -command {dateidialog}
    .mbar.datei.menu add command -label "Speichern unter ..." -command {speichern_unter}
    .mbar.datei.menu add command -label "Beenden" -command {exit}
    #===========Men\Uffffffffe===========Ende

    #===========Haupt===========Start    
    pack [frame .auswahl -relief groove -bd 2] -side left -anchor n
    pack [label .auswahl.label -text "Regul\Uffffffffr Ausdruck"] -side left
    pack [entry .auswahl.eingabe -width 50 -textvariable eingabevar] -side left
    pack [checkbutton .auswahl.cb1 -text "Grafisch" -variable grafikvar] -side left
    pack [checkbutton .auswahl.cb2 -text "Textuel" -variable textvar] -side left
    pack [button .auswahl.los -text "LOS" -padx 20 -command {
        global eingabevar
        global grafikvar
        global textvar
        
        #... wenn Eingabefeld nicht leer ist, d.h. mindestens 1 Zeichen enth\Uffffffff
        if { [string length $eingabevar] > 0 } {
            #.th.historylist insert end $eingabevar
            
            #... wenn Grafisch angezeigt werden soll
            if { $grafikvar == 1 } {
                set catchResult [catch {exec perl [pwd]/re_graph.pl -o temp.png $eingabevar } bildResult]
                #... wenn der exec Befehl ohne Fehler war
                if {$catchResult == 0} {
                    #... wenn das Topfenster .bild nicht Existiert
                    if { [ winfo exists .bild  ] == 0 } {
                        toplevel .bild
                        wm title .bild "Bild darstellung"
                        wm geometry .bild +100+220

                        pack [label .bild.ergbild] -side left
                    }
                    set foto [image create photo -file [pwd]/temp.png ]
                    .bild.ergbild configure -image $foto
                }
            } else {
                destroy .bild            
            }
            
            #... wenn Textuel angezeigt werden soll
            if { $textvar == 1 } {
                set catchResult [catch {exec [pwd]/regex.sh $eingabevar } Result]
                #... wenn der exec Befehl ohne Fehler war
                if {$catchResult == 0} {
                    #... wenn das Topfenster .text nicht Existiert
                    if { [ winfo exists .text ] == 0 } {
                        toplevel .text
                        wm title .text "Textuelle darstellung"
                        wm geometry .text +400+200
                                    
                        pack [scrollbar .text.yscr -orient vertical -command {.text.ergtext yview}] \
                        -side right -anchor center -fill y -expand 0 -padx 0 -pady 0 -ipadx 0 -ipady 0
                        pack [text .text.ergtext -yscrollcommand {.text.yscr set}] -side left
                    }
                    .text.ergtext delete 1.0 end            
                    .text.ergtext insert 1.0 $Result
                    wm resizable .text 0 0
                }
            } else {
                destroy .text        
            }
            
            # Wenn es nicht gleich der letzte Reg. Aus. in der Histroy ist hinzuf\Uffffffff            if { [.th.historylist get end] != $eingabevar } {
                 .th.historylist insert end $eingabevar
            }
        }
    }] -side left
    #===========Haupt===========Ende

    #===========History===========Start
    pack [label .th.lhistory2 -text "Ihre Aktion:"] -side top

    pack [frame .th.aktion -relief groove -bd 2] -side top -anchor n
    pack [button .th.aktion.bladen -text "In Eingabe laden" -padx 20 -command {
        .auswahl.eingabe delete 0 end
        .auswahl.eingabe insert 0 "[.th.historylist get active]"
    }] -side left
    pack [button .th.aktion.bloeschen -text "Aus der History l\Uffffffffen" -padx 20 -command {
        .th.historylist delete [.th.historylist index active]
    }] -side left
    pack[listbox .th.historylist -width 50 -height 20 -listvariable historyvar] -side bottom

    .th.historylist insert end {^a(b|z$)} {^(a|b)(c|d)$} {^(a(b|c)|def)$}

    focus .th.historylist
    #===========History===========Ende

    update
    focus -force .auswahl.eingabe

}
```
vieleicht hilft es jemanden


----------

