Schrift
[thread]5171[/thread]

Zweitfenster durch 2. MainLoop?: Anmelde- und Arbeitsfenster benötigt



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
Herr_Cisie
 2006-04-10 11:32
#45314 #45314
User since
2006-04-10
17 Artikel
BenutzerIn
[default_avatar]
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
Strat
 2006-04-10 15:44
#45315 #45315
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
vielleicht hilft dir "Programm-schliessen abfangen" auf meiner HP unter Perl -> Tips&Tricks -> Tk weiter; z.B.
Code: (dl )
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...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Herr_Cisie
 2006-04-11 17:34
#45316 #45316
User since
2006-04-10
17 Artikel
BenutzerIn
[default_avatar]
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
Crian
 2006-04-11 19:35
#45317 #45317
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
Ich versteh nicht, was gegen ein Toplevel spricht. Ist doch viel einfacher =)

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
#!/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
Herr_Cisie
 2006-04-11 20:16
#45318 #45318
User since
2006-04-10
17 Artikel
BenutzerIn
[default_avatar]
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?
Crian
 2006-04-13 18:06
#45319 #45319
User since
2003-08-04
5872 Artikel
ModeratorIn
[Homepage]
user image
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
Matze
 2006-04-13 20:05
#45320 #45320
User since
2005-08-29
222 Artikel
BenutzerIn
[Homepage] [default_avatar]
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 ?

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/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
Herr_Cisie
 2006-04-13 21:05
#45321 #45321
User since
2006-04-10
17 Artikel
BenutzerIn
[default_avatar]
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
ptk
 2006-04-13 22:26
#45322 #45322
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
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.
renee
 2006-04-13 22:59
#45323 #45323
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
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...
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/
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2006-04-10 11:32.