PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl und Gtk2::Dialog



mathisdt
23-04-2006, 18:32
Hallo!
Ich möchte in einem Perl-Skript, welches alle 2 Sekunden Daten pollt, bei bestimmten Daten eine Dialogbox anzeigen, und das in Gtk2. Dazu habe ich folgendes geschrieben:


use Gtk2 '-init';
while(1) {
sleep 2;
# Daten einlesen und $ist_wichtig setzen
if ($ist_wichtig) {
$dialog = Gtk2::Dialog->new ('Info',
undef,
[qw/no-separator modal destroy-with-parent/],
'OK' => '0');
my $label = Gtk2::Label->new ();
$label->set_markup('NACHRICHT IN PANGO-MARKUP');
my $vbox = Gtk2::VBox->new(FALSE,5);
$vbox->pack_start ($label, FALSE, FALSE, 0);
$vbox->set_border_width(25);
$dialog->vbox->add($vbox);
$label->show;
$vbox->show;
$dialog->set_position('center-always');
$dialog->run; # wartet bis der Benutzer klickt
$dialog->destroy; # hier soll der Dialog verschwinden
}
}


Mein Problem ist, dass die Dialogbox nicht verschwindet, wenn der Benutzer die Meldung wegklickt! Das Skript läuft weiter und pollt fleißig, nur das Fenster ist immer noch da mit gedrücktem Button. Wie kann man das Fenster endgültig entsorgen?

Mathis :confused:

Edit: Wenn die Schleife wieder wichtige Infos findet, ersetzt das neue Fenster das nicht verschwundene alte!

RapidMax
23-04-2006, 19:34
Ich kenne mich mit Perl und Gtk nicht aus. Aber mit GTK. GTK verwendet normalerweise einen mainloop, den du nicht so einfach ersetzen kannst. (gtk_main()). Um das ganz nach Gtk-Manier zu machen, solltest du deshalb den Gtk-Mainloop starten und regelmässig über timeout-Handler pollen. (gtk_timeout_add()).

Gruss, Andy

mathisdt
23-04-2006, 19:49
OK, ich habe ein Beispiel von http://gtk2-perl.sourceforge.net/doc/intro/ verwendet (lauffähiges Programm zum selbst-ausprobieren unten). Aber selbst bei diesem simplen Beispiel verschwindet das Fenster nicht direkt nach dem Klick auf den Button, sondern nach Beendigung des Perl-Programms (also nach sleep 2 ganz unten). Warum? Gibt's vielleicht sowas wie einen GTK2 Graphic Garbage Collector, der erst ganz zum Schluss aufräumt? :(
Edit: Oder muss ich dafür Threads verwenden? Es ist eigentlich nicht nötig, dass das Pollen im Hintergrund weitergeht...

use warnings;
use Gtk2 '-init';
use Data::Dumper;

my $window = Gtk2::Window->new;
$window->set_title ('Simple Signals');

# signal 1, attached to the main window, when it is destroyed, clicked close
# button, <alt-f4>, etc., quit the main loop
$window->signal_connect (destroy => sub { Gtk2->main_quit; });

my $button = Gtk2::Button->new ('Click Me To Quit');

# something to be passed by gtk to our signal handler, can be just about
# anything perl has to offer
my $user_data = 'Hello';

# signal 2, attached to the button, when the button is clicked this function
# is called.
$button->signal_connect (clicked => \&button_callback, $user_data);
$window->add ($button);

$window->show_all;
Gtk2->main;

sub button_callback {
# print out the parameters we were passed: (button, user_data)
print Dumper (@_);
# then quit
Gtk2->main_quit;
1;
}

sleep 2;

mathisdt
23-04-2006, 20:57
Hier ein Experiment mit einem detached thread. Sehr merkwürdig: Das Schließen des Fensters lässt es verschwinden und die Uhr läuft ab, genau so will ich es auch mit dem Button wenn man ihn klickt. Da jedoch wird das Fenster nicht unsichtbar, sondern der Button hat eine "geklickt"-Optik und das Fenster bleibt sichtbar bis die 10 Sekunden um sind. Warum? :eek:


use warnings;
use threads;
use threads::shared;
use Glib qw/TRUE FALSE/;
use Gtk2 qw/-init -threads-init/;

my $thread = threads->new(\&showdialog);
$thread->detach();
print "GOING ON\n";
$| = 1; # damit GOING ON tatsächlich ausgegeben wird
sleep 10;
exit;


sub showdialog {
my $window = Gtk2::Window->new;
$window->set_title ('Simple Signals');

# GEHT:
$window->signal_connect (destroy => sub { Gtk2->main_quit; });

my $button = Gtk2::Button->new ('Click Me To Quit');

# GEHT NICHT:
$button->signal_connect (clicked => sub { Gtk2->main_quit; });
$window->add ($button);

$window->show_all;
Gtk2->main;
}

mathisdt
24-04-2006, 17:02
Oder gibt es andere einfache und schön aussehende Möglichkeiten, ein Perl-Script etwas graphisch ausgeben zu lassen? Es muss nur eine Meldung, eine Eingabemöglichkeit und anpassbare Buttons haben...

Mathis

mathisdt
28-04-2006, 08:01
Lösung gefunden! Ich habe das ganze einfach ohne den vordefinierten Dialog gemacht und mir selbst ein Window gebaut. Das Ergebnis gibt's unter http://zephyrsoftware.sourceforge.net/?q=fli4l/telmoncscript

Mathis