Schrift
[thread]4772[/thread]

Fenster schließen: Ein aufgerufenes Fenster wieder schließe

Leser: 1


<< >> 5 Einträge, 1 Seite
Olav_888
 2004-05-04 17:15
#42063 #42063
User since
2004-05-04
4 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich möchte aus dem Hauptfenster ein Nebenfenster aufrufen, in dem dann Daten abgefragt werden. Leider habe ich noch keinen Weg gefunden, dieses Fenster über einen Button wieder zu schließen, ohne das das ganze Script beendet wird. Es funktioniert bisher nur, wenn ich das Fenster über die Windowsfunktion schließe. Hat da jemand eine Idee?

Mein 2. Problem ist wahrscheinlich genauso einfach. Ich möchte den Inhalt meines Fensters dynamisch halten. Gibt es eine Möglichkeit Frames oder Widgets zu verstecken, und dabei möglichst ihre Größe auf 0 zu reduzieren?

Danke für die Antworten.
ptk
 2004-05-04 18:44
#42064 #42064
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Du solltest immer angeben, welches GUI-Toolkit du benutzt. Ich antworte einfach mal fuer Tk. Wenn du ein Fenster mit
Code (perl): (dl )
$toplevel = $mainwindow->Toplevel
erzeugt hast, dann kannst du mit
Code (perl): (dl )
$toplevel->destroy
das Fenster wieder schliessen. Wenn du dir nicht sicher bist, dass das Fenster in der Zwischenzeit bereits geschlossen wurden, kann man
Code (perl): (dl )
$toplevel->destroy if Tk::Exists($toplevel)
schreiben.

Du kannst Widgets ausblenden, indem du die "forget"-Form des verwendeten Geometry-Managers verwendest. Also bei Verwendung von pack ist es packForget, bei grid ist es gridForget etc. Mit pack/grid/... kann man das Widget wieder sichtbar machen. Evtl. muss man die Position dann genau angeben --- in diesem Fall ist die Arbeit mit grid einfacher. Das Arbeiten mit forget hat den Nachteil, dass das Hauptfenster die Groesse anpasst --- das moechtest du wahrscheinlich nicht. Du kannst dafuer die Geometry-Propagation ausschalten ($toplevel->packPropagate(0)) oder eine feste Fenstergroesse angeben (evtl. reicht ein geometry-Aufrufen, evtl. muss aber auch minsize/maxsize/resizable gesetzte werden).

Eine andere Moeglichkeit ist, ein anderes Widget ueber ein existierendes zu legen. Das kann man mit place relativ elegant machen:
Code (perl): (dl )
1
2
$widget = $toplevel->Label(...)->pack;
$widget_drueber = $widget->Label(...)->place(-x => 0, -y => 0, -relwidth => 1, -relheight => 1);
Olav_888
 2004-05-04 22:55
#42065 #42065
User since
2004-05-04
4 Artikel
BenutzerIn
[default_avatar]
Danke für die schnelle Antwort. Der erste Teil mit dem Fenster funktioniert auch wunderbar. Nur bei dem 2. Problem scheine ich noch ein Verständnisproblem zu haben. Ich erstelle einen Frame:

Code: (dl )
$fd = $mw->Frame()->pack(-side=>"left");


wobei $mw das Hauptfenster ist. Wenn ich nun die Antwort richtig verstanden habe, müßte der Befehl zum Verschwinden lassen so aussehen:

Code: (dl )
$fd ->packforget();


Leider bringt mir hier Perl nur eine Fehlermeldung:

Tk::Error: Failed to AUTOLOAD 'Tk::Frame::packforget' at Agility_new.pl line 133

Gibt es nicht eine Option wie etwa "invisible", welche man dann mit configure() setzen kann?

Was ich vergessen hatte, ich arbeite mit Perl/TK auf W2k.
Crian
 2004-05-05 13:15
#42066 #42066
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
packForget
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
ptk
 2004-05-05 13:32
#42067 #42067
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Hier ist eine Moeglichkeit, wie man ein Label mittels eines darueber gelegten Frames zum Verschwinden gebracht werden kann. Das ist nur eine von mindestens zehn moeglichen Loesungen :-)
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
use Tk;
$mw = MainWindow->new;
$l = $mw->Label(-text => "Test")->pack;
$f = $l->Frame;
$b = $mw->Button(-text => "Toggle visibility",
-command => sub {
if ($f->manager) {
$f->placeForget;
} else {
$f->place(-x => 0, -y => 0,
-relwidth => 1,
-relheight => 1,
)
}
})->pack;
MainLoop;

Der Aufruf von ->manager bedarf vielleicht noch der Erklaerung. manager() gibt zurueck, welcher Geometry-Manager (pack, place,grid ...) fuer das angegebene Widget verwendet wird. Wird nichts zurueck gegeben, heisst das, dass das Widget nicht dargestellt ist.
<< >> 5 Einträge, 1 Seite



View all threads created 2004-05-04 17:15.