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

TK-Modul Ein und Aulsesen: Anfänger verzweifelt (Seite 2)

Leser: 1


<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten
Crian
 2004-08-18 15:09
#42436 #42436
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
Hatte ich mir schon gedacht, dass Du "nur" panisch / verzweifelt bist :)

No panic! (frei nach dem Anhalter)

Also nochmal zur Aufgabe:

Quote
(1) Erstellen Sie mithilfe des Moduls "Tk" ein PERL-Skript mit grafischer Oberfläche, welches die Möglichkeit bietet, eine Ausgangsdatei im Textformat (.txt) zu spezifizieren.

(2) Der User muss außerdem den Namen einer Ausgabedatei selbst festlegen können.

(3) Durch das Anklicken eines Buttons soll das Skript die bestehnde Datei einlesen und jeweils an der ersten Stelle einer Zeile eine fortlaufende Zeilennummerierung einfügen.

(4) Außerdem müssen die festgelegte Ausgabedatei generiert und der Ergebnistext in die Datei ausgegeben werden, wobei über die grafische Oberfläche (Listbox) die erfolgreiche Ausführung angezeigt werden soll.


Zu (1): Was ist in diesem Zusammenhang mit "der Möglichkeit, eine Ausgangsdatei [...] zu spezifizieren" gemeint? Soll der User eine Datei über die Oberfläche auswählen können? Soll das über einen "Datei-laden" Dialog geschehen, oder über die Eingabe des Dateinamens in einem Editcontrol oder über Auswahl fest eingestellter Dateien in einer Listbox? Weist Du das oder kannst es erahnen?

Lösungsvorschlag: Eingabefeld und daneben Knopf, um eine (Eingabe-)Datei auf dem Rechner auszuwählen.

Zu (2) aha, wir brauchen also einen Speichern unter Dialog.

Lösungsvorschlag: Eingabefeld und daneben Knopf, um eine (Eingabe-)Datei auf dem Rechner auszuwählen.

Zu (3) : Einlesen der Datei und vor jede Zeile die fortlaufende Nummer einfügen, da haben wir schon Code von Renee :-)

Zu (4) : Der erste Teil bis zum Komma ist klar: man soll die vom Benutzer angegebene Datei herausschreiben (also die Eingabedatei mit Nummern vor den Zeilen), aber der Teil nach dem Komma ist mir schleierhaft, soll man die generierte Datei nochmal anzeigen, und zwar in einer Listbox (warum in einer Listbox)?

Bis auf den zweiten Teil des Punktes (4) mach ich mich mal ans Basteln, ich glaub in Deinem Fall ist akute Hilfe nötig ;-)
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
Crian
 2004-08-18 15:59
#42437 #42437
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
So, ich habe mal eine Lösung erstellt, wobei ich die Ausgabe in einem Textfeld vorgenommen habe. Aber das sollte Dir schonmal eine ganze Ecke weiterhelfen, hoffe ich. Sonst (und bei anderen Problemen): Nachfragen =)

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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#!/usr/bin/perl
use strict;
use warnings;

=pod

=head AUFGABE

Erstellen Sie mithilfe des Moduls "Tk" ein PERL-Skript mit grafischer
Oberfläche, welches die Möglichkeit bietet, eine Ausgangsdatei im
Textformat (.txt) zu spezifizieren. Der User muss außerdem den Namen
einer Ausgabedatei selbst festlegen können. Durch das Anklicken eines
Buttons soll das Skript die bestehnde Datei einlesen und jeweils an
der ersten Stelle einer Zeile eine fortlaufende Zeilennummerierung
einfügen. Außerdem müssen die festgelegte Ausgabedatei generiert und
der Ergebnistext in die Datei ausgegeben werden, wobei über die
grafische Oberfläche (Listbox) die erfolgreiche Ausführung angezeigt
werden soll.

=cut

use Tk;
use Tk::LabFrame;
use Tk::ErrorDialog;


#
# MainWindow
#
my $mw = new MainWindow;
$mw->title("Komische Aufgabe von Satanica");

#
# Eingabedatei auswaehlen:
#
my $f1 = $mw->LabFrame(-label => 'Eingabedatei',
-labelside => 'acrosstop',
)
->pack(-side => 'top',
-expand => 1,
-fill => 'x',
);
my $ein_entry = $f1->Entry(-width => 50,
)
->pack(-side => 'left',
-expand => 1,
-fill => 'x',
);
my $ein_btn = $f1->Button(-text => 'Durchsuchen',
-command =>
sub {
my $typen = [
['Textdateien', '.txt' ],
['Alle Dateien', '*' ],
];
my $dn = $mw->getOpenFile(-filetypes => $typen,
);
if (defined $dn and $dn ne '') {
$ein_entry->delete(0, 'end');
$ein_entry->insert('end', $dn);
}
},
)
->pack(-side => 'left',
-expand => 0,
-fill => 'none',
);

#
# Ausgabedatei auswaehlen:
#
my $f2 = $mw->LabFrame(-label => 'Ausgabedatei',
-labelside => 'acrosstop',
)
->pack(-side => 'top',
-expand => 1,
-fill => 'x',
);
my $aus_entry = $f2->Entry(-width => 50,
)
->pack(-side => 'left',
-expand => 1,
-fill => 'x',
);
my $aus_btn = $f2->Button(-text => 'Durchsuchen',
-command =>
sub {
my $typen = [
['Textdateien', '.txt' ],
['Alle Dateien', '*' ],
];
my $dn = $mw->getSaveFile(-filetypes => $typen,
-defaultextension => 'txt',
);

if (defined $dn and $dn ne '') {
$aus_entry->delete(0, 'end');
$aus_entry->insert('end', $dn);
}
},
)
->pack(-side => 'left',
-expand => 0,
-fill => 'none',
);

#
# DoIt-Button:
#
my $doit_btn = $mw->Button(-text => 'do it',
-command => sub {do_it( $ein_entry->get(), $aus_entry->get())},
)
->pack(-side => 'top',
-expand => 1,
-fill => 'x',
);

#
# Beweisausgabe:
#
my $anzeige = $mw->Scrolled("Text",
-scrollbars => 'osoe',
-background => '#d7d7d7',
-foreground => 'blue',
-width => 80,
-height => 25,
-relief => 'flat',
-font => '{Courier New} 10 {normal}',
-wrap => 'none',
)
->pack(-side => 'top',
-expand => 1,
-fill => 'both',
);

#
# Exit-Button:
#
my $exit_btn = $mw->Button(-text => 'Ende',
-command => sub { $mw->destroy() },
)
->pack(-side => 'top',
-expand => 1,
-fill => 'x',
);

#
# Bindungen:
#
$mw->bind ('<Return>', sub{$doit_btn->invoke()});
$mw->bind ('<Escape>', sub{$exit_btn->invoke()});


MainLoop();

sub do_it {
my ($ein, $aus) = @_;

die "Fehlende Parameter in do_it"
unless defined $ein
and defined $aus;
die "Eingabedatei '$ein' nicht vorhanden in do_it"
unless -f $ein;

open (IN, $ein ) or die "Kann '$ein' nicht zum Lesen oeffen: $!";
open (OUT, ">$aus") or die "Kann '$aus' nicht zum Schreiben oeffen: $!";
while (<IN>) {
print OUT $. . ':' . $_;
}
close OUT or die "Kann '$aus' nicht schliessen: $!";
close IN or warn "Kann '$ein' nicht schliessen: $!";

open (IN, $aus ) or die "Kann '$aus' nicht zum Lesen oeffen: $!";
while (<IN>) {
$anzeige->insert('end', $_);
}
close IN or warn "Kann '$aus' nicht schliessen: $!";
}


(Kann ich Dir sonst auch nochmal schicken, der CODE-Tag klaut leider immer das erste Whitespace-Zeichen.)

[getestet an einer Datei mit 100000 Zeilken :-)\n\n

<!--EDIT|Crian|1092830685-->
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
satanica1976
 2004-08-18 16:15
#42438 #42438
User since
2004-08-16
17 Artikel
BenutzerIn
[default_avatar]
wow ich bin tief beeindruckt, danke. werde es gleich mal testen bei mir um zu sehen was passiert.
das hätte ich niemals hinbekommen als ich meinen tutor um hilfe bat paralell zu diesen thread bekam ich folgende antwort:
Es ist nicht so kompliziert, wie es sich vielleicht anhört:
-2 Eingabefelder, eins für den Namen der Eingabedatei, eins für den Namen der Ausgabedatei
-ein Knopf. Wenn man den drückt, wird die Eingabedatei geöffnet, und deren Inhalt, ergänzt um eine Zeilennummerierung, in die Ausgabedatei geschrieben.
- in der Listbox geben Sie aus "Ausgabedatie erfolgreich geschrieben".

meine mail lasse ich dir mal per PN zukommen. ich danke dir für deine hilfe zu dieser aufgabe.
Mein Name ist Hase.......
renee
 2004-08-18 16:37
#42439 #42439
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Nach dem, was Dein Tutor gesagt hat, reicht so etwas:
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
#! /usr/bin/perl

use strict;
use warnings;
use Tk;

my ($input,$output);

my $mw = MainWindow->new();
$mw->Entry(-textvariable => \$input)->pack(); # Eingabefeld für Pfad der einzulesenden Datei
$mw->Entry(-textvariable => \$output)->pack();# Eingabefeld für Pfad, wo gespeichert werden soll
$mw->Button(-command => \&save, -text => 'Speichern')->pack(); # "Speichern"-Button
my $list = $mw->ScrlListbox()->pack(); # Listbox für Ausgabe, ob Speichern erfolgreich war

MainLoop;

# Methode zum einlesen und speichern
sub save{
 my $counter = 1; # Counter für Zeilennummer
 open(R_TXT,"<$input") or die $!; # Datei zum Lesen öffnen
 open(W_TXT,">$output") or die $!; # Datei zum Schreiben öffnen
 while(my $line = <R_TXT>){ # Zeilenweise einlesen
   $line = $counter." ".$line; # Zeilennummer vorne anfügen
   print W_TXT $line; # Veränderte Zeile speichern
   $counter++; # counter hochzählen
 }
 close W_TXT;
 close R_TXT; # Filehandle schließen
 $list->insert('end',"Speichern erfolgreich!");
}


edit: Kommentare eingefügt!\n\n

<!--EDIT|renee|1092835218-->
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/
Crian
 2004-08-18 16:41
#42440 #42440
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
[quote=satanica1976,18.08.2004, 14:15]wow ich bin tief beeindruckt, danke. werde es gleich mal testen bei mir um zu sehen was passiert.
das hätte ich niemals hinbekommen als ich meinen tutor um hilfe bat paralell zu diesen thread bekam ich folgende antwort:
Es ist nicht so kompliziert, wie es sich vielleicht anhört:
-2 Eingabefelder, eins für den Namen der Eingabedatei, eins für den Namen der Ausgabedatei
-ein Knopf. Wenn man den drückt, wird die Eingabedatei geöffnet, und deren Inhalt, ergänzt um eine Zeilennummerierung, in die Ausgabedatei geschrieben.
- in der Listbox geben Sie aus "Ausgabedatie erfolgreich geschrieben".

meine mail lasse ich dir mal per PN zukommen. ich danke dir für deine hilfe zu dieser aufgabe.[/quote]
Oh, da hab ich die Aufgabe viel zu kompliziert verstanden. Aber dann hast Du jetzt zwei Lösungen, eine zum Abgeben, und eine schöne ;)
Oder Du gibst beide ab, wenn Du verstanden hast, was in der längeren passiert (sonst besser nicht, oder nachfragen, bis Du es verstanden hast).

@Renee: schau Dir mal die Variable $. an, Dein Counter ist irgendwie überflüssig.

(
Quote
HANDLE->input_line_number(EXPR)
$INPUT_LINE_NUMBER
$NR
$. Current line number for the last filehandle accessed.

Each filehandle in Perl counts the number of lines that have
been read from it. (Depending on the value of $/, Perl's idea of
what constitutes a line may not match yours.) When a line is
read from a filehandle (via readline() or "<>"), or when tell()
or seek() is called on it, $. becomes an alias to the line
counter for that filehandle.

You can adjust the counter by assigning to $., but this will not
actually move the seek pointer. *Localizing $. will not localize
the filehandle's line count*. Instead, it will localize perl's
notion of which filehandle $. is currently aliased to.

$. is reset when the filehandle is closed, but not when an open
filehandle is reopened without an intervening close(). For more
details, see "I/O Operators" in perlop. Because "<>" never does
an explicit close, line numbers increase across ARGV files (but
see examples in "eof" in perlfunc).

You can also use "HANDLE->input_line_number(EXPR)" to access the
line counter for a given filehandle without having to worry
about which handle you last accessed.

(Mnemonic: many programs use "." to mean the current line
number.)
)\n\n

<!--EDIT|Crian|1092833036-->
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
renee
 2004-08-18 16:46
#42441 #42441
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
@Crian: richtig! Hab ich vergessen...

Aber vielleicht ist $counter für Anfänger erstmal besser *ausrede_such*
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/
satanica1976
 2004-08-18 16:47
#42442 #42442
User since
2004-08-16
17 Artikel
BenutzerIn
[default_avatar]
ich glaube die version 2 von renee entspricht mehr dem was wir in dem einen lehrheft (welches auch noch fehlerhaft war) männers ihr seid meine engel nun muss ich dann nur noch aufgabe zwei gebacken bekommen. *jeden zwei küsschen aufdrückt* :blush:
Mein Name ist Hase.......
Crian
 2004-08-18 16:51
#42443 #42443
User since
2003-08-04
5873 Artikel
ModeratorIn
[Homepage]
user image
=)

Hast Du denn die Version von mir auch bei Dir zum Laufen gebracht? Abgabegeeigneter ist dann aber wohl wirklich Renees Version.\n\n

<!--EDIT|Crian|1092833526-->
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
satanica1976
 2004-08-18 16:54
#42444 #42444
User since
2004-08-16
17 Artikel
BenutzerIn
[default_avatar]
ja crian die lief auch :)
Mein Name ist Hase.......
satanica1976
 2004-08-18 17:00
#42445 #42445
User since
2004-08-16
17 Artikel
BenutzerIn
[default_avatar]
renee ich habe eben dein skript bei mir mal laufen lassen, das fenster geht auch auf wie geplant aber bekomme dann bei der anwendung des fensters folgend fehlermeldung in der cmd-console

Tk::Error: No such file or directory at D:\satanica2.pl line 20.
[\&main::save]
Tk callback for .button
Tk:: at D:/Perl/site/lib/Tk.pm line 228
Tk::Button::butUp at D:/Perl/site/lib/Tk/Button.pm line 111
(command bound to event)

was bedeutet das??
Mein Name ist Hase.......
<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten



View all threads created 2004-08-16 17:43.