User since
2006-04-10
17
Artikel
BenutzerIn
Hallo!
Dies ist mein erster Beitrag hier, und gleich soviel Text, sorry!
Ich arbeite erst seit kurzem mit Perl/Tk und hab eine Problemstellung:
Mein Prorämmchen benötigt eine Anmeldemaske (für UserID und Kennwort) für das Anmelden an einer Datenbank mittels eines system()-Kommandos.
Nach erfolgreicher Anmeldung soll sich ein zweites Fenster öffnen, um dann Dateien in die DB einspielen zu können (wieder via system()-Kommando).
Mein Problem ist jetzt das zweite Fenster: Die Fenster, die mit TopLevel generiert wurden, sind für Eingaben scheinbar ungeeignet (laut Tutorial nur zur Ausgabe).
Daher lasse ich mit einem zweiten MainLoop (falls die Anmeldung erfolgreich war und die beiden Parameter nicht leer sind) das 2. Fenster erscheinen.
Schließe ich allerdings das Anmeldefenster per "x", und es steht ein (sinnloser) Wert in den beiden Variablen, erscheint das zweite Fenster trotzdem!
Wie verhindere ich das?
Bzw. wie programmier ich korrekt eine Applikation mit 2 eingabefähigen Fenstern? TopLevel kanns nicht ganz sein, das öffnende Fenster hat leider die gleiche Anzahl Frames und Zeilen wie das Anmeldefenster...
Danke fürs Lesen des ganzen Beitrages ; )
Gruß,
Christoph
User since
2003-08-04
5246
Artikel
ModeratorIn
vielleicht hilft dir "Programm-schliessen abfangen" auf meiner HP unter Perl -> Tips&Tricks -> Tk weiter; z.B.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
my $mw = MainWindow->new();
$mw->Button(-text => 'Logon', -command => \&Logon)->pack();
# input-zeug zeichnen
$mw->protocol('WM_DELETE_WINDOW', \&KillWindow);
MainLoop();
$mw = MainWindow->new();
$mw->protocol('WM_DELETE_WINDOW', \&ExitApplication);
# rest zeichnen
MainLoop();
# -----------------------------------
sub KillWindow {
# wird aufgerufen, wenn jemand das 1. $mw zu beenden versucht
# wenn du nichts tust, kann es nicht geschlossen werden
} # KillWindow
# -----------------------------------
sub Logon {
$mw->destroy();
} # Logon
bin mir gerade nicht ganz sicher, ob es so funktioniert...
User since
2006-04-10
17
Artikel
BenutzerIn
Hallo Strat,
und vielen Dank für Deine Antwort!
Den Event des "Fenster schliessen" hab ich so wie Du es geschrieben hast abgefangen, danke!
Zusätzlich steht in der sub KillWindow noch ein exit; damit das Perl-Skript nicht mehr zum zweiten Fenster führt.
Wenn der Return Code des Logins != 0 ist, wird das 2. Fenster auch nicht erzeugt.
Hatte gehofft, dass es eine elegantere Lösung geben würde, wie mit 2 komplett unabhängigen MainWindows zu arbeiten, schade...
Nochmals danke für Deine ausführliche Hilfe!
Christoph
User since
2003-08-04
5872
Artikel
ModeratorIn
Ich versteh nicht, was gegen ein Toplevel spricht. Ist doch viel einfacher =)
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
#!/usr/bin/perl
use strict;
use warnings;
use Tk;
my $fenster = MainWindow->new();
my $text = $fenster->Label(-text => 'Bitte geben sie Ihren Namen ein : ',
-height => 5,
-width => 40,
);
my $eingabe = $fenster->Entry();
my $schalter = $fenster->Button(-text => 'OK',
-height => 1,
-width => 4,
-command => \&eingabe_bearbeiten,
);
my $schalter2 = $fenster->Button(-text => 'Ende',
-height => 1,
-width => 4,
-command => sub { exit },
);
$text ->pack();
$eingabe ->pack();
$schalter ->pack();
$schalter2->pack();
MainLoop();
sub eingabe_bearbeiten {
my $popup = $fenster->Toplevel();
$popup-> Label(-text => 'Hallo ' . $eingabe->get() )->pack();
$popup->Button(-text => 'close',
-command => sub { $popup->destroy() } )->pack;
$eingabe->delete(0, 'end');
}
Siehe auch
http://wiki.perl-community.de/bin....apitel5 ...
Edit: Ich seh gerade, das macht nicht genau das was du willst, aber du kannst die Abfrage genausogut im Toplevel machen. Eventuell sollte der sich dann den Fokus grabben, dass man nicht zur nwendung zurück kommt ohne Anmeldung.\n\n
<!--EDIT|Crian|1144770169-->
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
User since
2006-04-10
17
Artikel
BenutzerIn
Hallo Crian,
das Problem ist (und was ich leider vergessen hab zu erwähnen), dass das 2. Fenster beim Aufbau mit Informationen aus der DB befüllt wird.
Nach dem Login-Fenster wird eine temporäre Datei erzeugt, die ausgelesen wird und eben die BrowseEntrys des 2. Fensters füllt.
Aber das mit dem Fokus sollte funktionieren! Kannst Du mir verraten, wie ich das anstelle?
User since
2003-08-04
5872
Artikel
ModeratorIn
Mit
$tl->grab();
$tl->focus();
Ich find gerade das passende Perldoc zu grab nicht ... bei Tk ist das ziemlich ungünstig verteilt...
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
User since
2005-08-29
222
Artikel
BenutzerIn
Warum benutzt du nicht auch einfach 2 MainWindows ?
Wenn dus dann noch mit protocol("WM_DELETE_WINDOW"); zusammentust, würde es doch gut funktionieren, oder ?
#!/perl -w
#
use Tk;
my $mw1 = MainWindow->new();
$mw1->protocol("WM_DELETE_WINDOW",
sub {
my $mw2 = MainWindow->new();
# Datenbank füllen
# usw.
});
# Anmelden...
MainLoop;
MfG. Matze
Mit freundlichen Grüßen: Matze
User since
2006-04-10
17
Artikel
BenutzerIn
Hallo Matze,
das ist auch ein sehr eleganter Ansatz!
Ich habs jetzt so gelöst, dass das 2. MainWindow durch das erfolgreiche Anmelden an der DB erzeugt wird.
Gruß,
Christoph
User since
2003-11-28
3645
Artikel
ModeratorIn
Lieber nur *ein* MainWindow und alles andere als Toplevel erzeugen. Es gab (und gibt vielleicht noch) Bugs in Perl/Tk, die nur beim Verwenden von mehreren MainWindows auftreten können.
User since
2003-08-04
14371
Artikel
ModeratorIn
Welche denn zum Beispiel??
Ich habe es in einem Programm so gelöst, dass ich dann das MainWindow-Objekt an für die nächste Klasse benutze. So komme ich mit einem MainWindow-Objekt aus und kann alles realisieren...