PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl: Tod eines Handlungsfensters



Molaf
08-04-2010, 12:53
Hallo allerseits,

ich möchte gerne mit Perl/Tk bei einer Fensteranwendung ein zusätzliches Fenster als Kontextmenu verwenden (Rahmen entfernen via overrideredirect, per attribute 'topmost' immer über Hauptfenster, usw.).

Leider kann man das (Sub-)Fenster bei aktivem Fokus mit Alt+F4 abschiessen.
Die Anwendung merkt aber nicht dass das zusätzliche Fenster weg ist.

Ein kurzes Beispiel:

use strict;
use warnings;

use Tk;

my $mw = MainWindow->new;
my $tpl='';

$mw->after(1000,\&mkToplevel);
$mw->repeat(2000,\&ckToplevel);
MainLoop;

sub mkToplevel
{
$tpl = $mw->Toplevel();
$tpl->attributes(-topmost=>1);
}

sub ckToplevel
{# hier möchte ich nun irgendwie feststellen, ob das Toplevel noch lebt

#leider kein Hinweis in der Zuordnung
print $tpl,"\n";

#Fehler wenn Toplevel weg ist
$tpl->configure(-bg=>('green','red','blue')[rand 3]);
}


Einer Hauptanwendung könnte ich ja mit END{ ... } einen Codeblock mitgeben, der mich am Ende über eine Abschaltung informiert, bei dem Toplevel-Fenster fällt mir aber keine Möglichkeit ein und die geeignete Tk-Funktion kann ich nicht finden.

Danke für eventuelle Hilfe,
Molaf

Molaf
08-04-2010, 14:28
Nicht in der Dokumentation sondern durch verzweifeltes Suchen im Internet habe ich noch diese Variante zutage gefördert:

$widget->OnDestroy(callback);


sub mkToplevel
{
$tpl = $mw->Toplevel();
$tpl->attributes(-topmost=>1);
$tpl->OnDestroy(\&Aua);
}

sub Aua
{
print "kapoot\n";
}


Sieht nicht so elegant aus, funktioniert aber. Wenn noch jemand weiß, wie es ordentlicher ginge, wäre ich natürlich dankbar.

jeebee
08-04-2010, 17:15
Ist doch genau so wie's gedacht ist: Wenn ein widget abgebaut wird, kann man über OnDestroy bookkeeping machen.

Molaf
09-04-2010, 06:41
Naja, stimmt auch wieder.
Irgendwie hatte ich eine Methode beim Handle des Hauptfensters vermutet, der hat das Zusatzfenster ja auch erstellt.