Veröffentlicht 25. Oktober 201014 j Hallo, Ich stecke gerade mitten in der Ausbildung zum Fachinformatiker Systemintegration. Habe jetzt aber in einem Praktikum die Aufgabe mit Perl und Tk zu arbeiten. Als Übung für mich selbst, wollte ich mal einen kleinen Taschenrechner programmieren, der mich vor folgendes Problem stellt: Das GUI ist soweit fertig. Ich bräuchte aber jetzt einen Algorhytmus der mir die eingegebenen Tasten so in einen Skalar überträgt, das dieser erstens Live auf dem Label (was als Display dienen soll) erscheint und zweitens Ich damit rechnen kann und somit das Ergebnis dann auch auf dem Display ausgeben kann. Und für alle die jetzt gleich das Flamen anfangen das dieses ding einen Funktionsumfang von einer Handgranate hat, es dient lediglich zum Verständnis. Hier noch mein Code den ich bis jetzt umgesetzt habe (Ich weiß ich hätte die Buttons auch über eine schleife generieren können, mir fehlt halt noch ein wenig die Routine): #!perl use strict; use warnings; use Tk; # *** Globale Variablen *** my $entry = 0; # *** Hauptfenster *** my $mw = MainWindow->new; $mw->title("Chilli Calculator"); # *** Rahmen *** my $frame_display = $mw->Frame( -relief => 'groove', -background => 'white', -borderwidth => 2, )->pack( -side => 'top', -fill => 'x' ); my $frame_keyboard = $mw->Frame( )->pack( -side => 'left', ); my $frame_keyboard2 = $mw->Frame( )->pack( -side => 'right', ); # *** Anzeige *** my $display = $frame_display->Label( -textvariable => \$entry, -background => 'white', )->pack( -side => 'right', ); # *** Tastatur *** my $keyboard = $frame_keyboard->Button( -text => "1", -command => sub { print "1" } )->grid( $frame_keyboard->Button( -text => "2", -command => sub { print "2" } ), $frame_keyboard->Button( -text => "3", -command => sub { print "3" } ) ); $frame_keyboard->Button( -text => "4", -command => sub { print "4" } )->grid( $frame_keyboard->Button( -text => "5", -command => sub { print "5" } ), $frame_keyboard->Button( -text => "6", -command => sub { print "6" } ) ); $frame_keyboard->Button( -text => "7", -command => sub { print "7" } )->grid( $frame_keyboard->Button( -text => "8", -command => sub { print "8" } ), $frame_keyboard->Button( -text => "9", -command => sub { print "9" } ) ); $frame_keyboard->Button( -text => "0", -command => sub { print "0" } )->grid( $frame_keyboard->Button( -text => "C", -command => sub { print "Clear" } ), "-", -sticky => "nsew" ); $frame_keyboard2->Button( -text => "+", -command => sub { print "+" }, -width => '5', )->pack( -side => 'top', ); $frame_keyboard2->Button( -text => "-", -command => sub { print "-" }, -width => '5', )->pack( -side => 'top', ); $frame_keyboard2->Button( -text => "*", -command => sub { print "*" }, -width => '5', )->pack( -side => 'top', ); $frame_keyboard2->Button( -text => "/", -command => sub { print "/" }, -width => '5', )->pack( -side => 'top', ); MainLoop();
25. Oktober 201014 j ich weiß nicht was TK ist, aber es gibt sachen, die macht man einfach nicht :old perl = arbeitstier für dateimanipulation. gui und gedöns, man nehme irgend was wo man nur noch den grid fertig macht. Du codest dir einen wolf mit dem ding, schon alleine der view, sollte es einer sein, ist kaum leserlich. vielleicht bin ich aber auch komplett neben der spur
26. Oktober 201014 j Ich kann ja auch nicht 's für das die dass im Praktikum von mir verlangen. :hells: Mal abgesehen davon das Tcl/Tk einiges an Kritik vertragen muss, mir bereitet es eigentlich schon Spaß damit zu arbeiten. Und Perl ist ja wohl total genial. Wenn ich das Programm auf Konsolenbasis schreiben müsste, wär das ein Vierzeiler (der Handgranatentaschenrechner). Leider fehlt mir (noch) das Verständnis um das auch in Tk umzusetzen, was auch eigentlich der Grund für dieses Topic war. Vielleicht findet sich ja doch noch wer, der die Lösung mal eben aus dem Ärmel schüttelt (wenn ich es bis dahin nicht selbst geschafft habe). :cool: Danke schon mal für eure Mühe. Grüße.
26. Oktober 201014 j Hab das ganze jetzt mit ein wenig spielerei und rauchendem Kopf gelöst. Hier mein Ergebnis: #!perl use strict; use warnings; use Tk; use Math::Complex; # *** Globale Variablen *** my $wert; my $eingabe = "0"; # *** Hauptfenster *** my $mw = MainWindow->new; $mw->title("Chilli Calculator"); # *** Rahmen *** my $frame_display = $mw->Frame( -relief => 'groove', -background => 'white', -borderwidth => 2, )->pack( -side => 'top', -fill => 'x', ); my $frame_keyboard = $mw->Frame()->pack( -side => 'left', ); my $frame_keyboard2 = $mw->Frame()->pack( -side => 'left', ); my $frame_keyboard3 = $mw->Frame()->pack( -side => 'left', ); # *** Anzeige *** my $display = $frame_display->Label( -textvariable => \$eingabe, -background => 'white', )->pack( -side => 'right', ); # *** Tastatur *** my $keyboard = $frame_keyboard->Button( -text => "1", -command => sub { nummer("1") }, -activebackground => 'NavyBlue', -activeforeground => 'white', )->grid( $frame_keyboard->Button( -text => "2", -command => sub { nummer("2") }, -activebackground => 'NavyBlue', -activeforeground => 'white', ), $frame_keyboard->Button( -text => "3", -activebackground => 'NavyBlue', -activeforeground => 'white', -command => sub { nummer("3") }, ) ); $frame_keyboard->Button( -text => "4", -command => sub { nummer("4") }, -activebackground => 'NavyBlue', -activeforeground => 'white', )->grid( $frame_keyboard->Button( -text => "5", -command => sub { nummer("5") }, -activebackground => 'NavyBlue', -activeforeground => 'white', ), $frame_keyboard->Button( -text => "6", -command => sub { nummer("6") }, -activebackground => 'NavyBlue', -activeforeground => 'white', ) ); $frame_keyboard->Button( -text => "7", -command => sub { nummer("7") }, -activebackground => 'NavyBlue', -activeforeground => 'white', )->grid( $frame_keyboard->Button( -text => "8", -command => sub { nummer("8") }, -activebackground => 'NavyBlue', -activeforeground => 'white', ), $frame_keyboard->Button( -text => "9", -command => sub { nummer("9") }, -activebackground => 'NavyBlue', -activeforeground => 'white', ) ); $frame_keyboard->Button( -text => "0", -command => sub { nummer("0") }, -activebackground => 'NavyBlue', -activeforeground => 'white', )->grid( $frame_keyboard->Button( -text => ".", -command => sub { nummer(".") }, -activebackground => 'NavyBlue', -activeforeground => 'white', ), "-", -sticky => "nsew" ); $frame_keyboard2->Button( -text => "+", -command => sub { nummer("+") }, -activebackground => 'NavyBlue', -activeforeground => 'white', -width => '5', )->pack( -side => 'top', ); $frame_keyboard2->Button( -text => "-", -command => sub { nummer("-") }, -activebackground => 'NavyBlue', -activeforeground => 'white', -width => '5', )->pack( -side => 'top', ); $frame_keyboard2->Button( -text => "*", -command => sub { nummer("*") }, -activebackground => 'NavyBlue', -activeforeground => 'white', -width => '5', )->pack( -side => 'top', ); $frame_keyboard2->Button( -text => "/", -command => sub { nummer("/") }, -activebackground => 'NavyBlue', -activeforeground => 'white', -width => '5', )->pack( -side => 'top', ); $frame_keyboard3->Button( -text => "DEL", -command => sub { $eingabe = substr $eingabe, 0, ( length($eingabe) - 1 ) }, -activebackground => 'NavyBlue', -activeforeground => 'white', -width => '10', )->pack( -side => 'top', ); $frame_keyboard3->Button( -text => "SQRT", -command => sub { $eingabe = sqrt($eingabe) }, -activebackground => 'NavyBlue', -activeforeground => 'white', -width => '10', )->pack( -side => 'top', ); $frame_keyboard3->Button( -text => "CLEAR", -command => sub { $eingabe = "0" }, -activebackground => 'NavyBlue', -activeforeground => 'white', -width => '10', )->pack( -side => 'top', ); $frame_keyboard3->Button( -text => "CALCULATE", -command => sub { $eingabe = eval($eingabe); }, -activebackground => 'NavyBlue', -activeforeground => 'white', -width => '10', )->pack( -side => 'top', ); # *** Funktionen *** sub nummer { $wert = shift; if ( ( $eingabe eq "0" ) && ( $wert ne "." ) ) { $eingabe = $wert; } else { $eingabe = "$eingabe" . "$wert"; } } MainLoop(); Und noch ein kleines Bild von dem guten Stück. Liebe Grüße.
27. Oktober 201014 j perl = arbeitstier für dateimanipulation. gui und gedöns, man nehme irgend was wo man nur noch den grid fertig macht. Du codest dir einen wolf mit dem ding, schon alleine der view, sollte es einer sein, ist kaum leserlich. Frei nach Dieter Nuhr: Wenn man keine Ahnung hat, einfach mal die Schnauze halten. @19_reaper_87: Mit Moose haettest du das Ganze noch ein wenig aufpeppen koennen. Via augment oder BUILD haettest du die GUI aufbauen koennen. Die Callbacks der verschiedenen Elemente haetten dann auf anonyme Subroutinen, die Methoden deiner Klasse aufrufen werden koennen. Aber wenn es sowieso nur so eine kleine Anwendung ist, braucht man auch nicht mit Kanonen auf Spatzen zu schiessen. Ich meine ich hatte grade im Code einen eval gesehen. Vorsicht damit. Bei solchen Sachen wie 42 / 0 koennte das schief gehen. Auch bei besonders grossen Zahlen koennte das daneben gehen. Math::Pari kann komplexe mathematische Fragestellungen beantworten, ohne dass man eval bemuehen muss.
27. Oktober 201014 j Huhu, erst mal Danke für die Tipps! Hatte die Zahlen und Operatoren erst versucht durch parsing abzufangen, und sie dann verschiedenen Skalaren zu zuordnen. Mit einer while Schleife dann auf mehrere Operatoren und Skalare erweitern. Hat eigentlich auch Funktioniert, aber irgendwie hatte ich dann den Geistesblitz die Funktion und Eval einzubauen. Sicherlich ist das Programm nicht perfekt, aber es ist ja auch mein erstes Skript. Grüße, Reaper.
28. Oktober 201014 j Jetzt hab ich noch 'ne anderer Frage, gibt es Tools die .pl zu einer .exe zu kompilieren? Habe es mal mit dem Activestate Tool gemacht, das kostet aber leider einiges und die trial läuft nur 21 Tage. Gibt es kostenfreie Alternativen? Muss nicht unbedingt eine Executable sein, sollte aber Stand alone ausführbar sein. Was auch stört, das Dos Fenster popppt jedes mal mit auf wenn ich die Executable ausführe. Grüße. Reaper.
29. Oktober 201014 j Du könntest PAR::Packer (Roderich Schupp / PAR-Packer - search.cpan.org) oder Cava (Cava Packager) nehmen.
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.