Thread [GTK2] About Dialog mit Glade 3
(2 answers)
Opened by MarkusH at 2012-04-11 19:37
Also ganz kurz:
Nachfolgend ein funktionierendes Beispiel. Primär interessant dürfte Zeile 96ff sein. Der Ganze Rest ist ein Beispiel wie man komplexere GUIs mit Gtk2::Builder (Glade) elegant erstellen kann. Es sieht etwas komplex aus, hilft aber auch bei wachsender Komplexität den Überblick zu behalten. Solltest du dich über "Gtk2::Builder" wundern. Das ist ein Ersatz für "Gtk2::GladeXML" Es ist schneller Portabler und direkt in Gtk2 integriert. Wenn du es noch nicht nutzen solltest so sei dir ein Umstieg ans Herz gelegt. info.pl: Code (perl): (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 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 #!/usr/bin/perl use strict; use warnings; use Gtk2 '-init'; # ordentliche GUI-Klasse {package GUI; # es wird eine Abgeleitete Klasse von GTK2::Buider erzeugt. # und es werden ein paar signal hinzugefügt: # info_opend, info_closed, main_closed # diese können über signal_emit ausgelöst werden # damit verhält sich die GUI wie ein GTK2 Widget use Glib::Object::Subclass Gtk2::Builder::, signals => { info_opend => { flags => [qw/run-last/], param_types => [], }, info_closed => { flags => [qw/run-last/], param_types => [], }, main_closed => { flags => [qw/run-last/], param_types => [], }, }, properties => []; # new muss überladen werden sub new { my $class=shift; # die zu nutzendde Datei my $glade=shift; # objekt erzeugten # dazu das "new" der Elternklasse Aufrufen my $self= $class->SUPER::new(); # Datei laden return undef unless($self->add_from_file($glade)); # signale min diesem Paket verbinden # "$self" als Parameter an alle aufgerufenen Fuktionen mitgeben # das macht das Handhaben der Funktionen einfacher. # Sie verhalten sich damit fast wie Metoden des Objekts $self->connect_signals($self); # alles anzeigen $self->do_show(); # objekt zurück return $self; } # Wichtige Widgets sub GUI { return $_[0]; } sub main {return $_[0]->get_object('mainwin'); } sub info {return $_[0]->get_object('info_dialog'); } #---------------- # Kommandos #---------------- # alles Anzeigen sub do_show{ $_[0]->main()->show_all(); } # Main-Loop starten sub do_run { Gtk2->main; } # Main-Loop stoppen sub do_exit { Gtk2->main_quit; } # Hauptfenster verstecken sub do_hide_main { $_[0]->main->hide(); } # Hauptfenster zeigen sub do_show_main { $_[0]->main->show(); } #----------------- # Signale #----------------- # das Infofenster öffnen sub on_info_open { # siehe oben bei "connect_signals" my $self=pop; # info Fenster holen my $info=$self->info(); # signal aussenden $self->signal_emit('info_opend'); # hier das wichtige. # "GtkAboutDialog" kann nur mit einem eigenen loop laufen! # infofenster starten # run erzeugt einen eigegen Loop $info->run(); # fenster schließen # keine "destroy" verwenden! $info->hide(); # signal senden $self->signal_emit('info_closed'); } # hauptfender wird geschlossen sub on_main_close { my $self=pop; $self->main()->destroy(); $self->signal_emit('main_closed'); } 1;} # Das Hauptprgramm package main; # GUI Laden my $gui=GUI->new('info.glade'); die('no gui') unless($gui); # Signale Verbinden $gui->signal_connect('info_opend' => sub{ print "Info Dialog opend\n"; $gui->do_hide_main(); }); $gui->signal_connect('info_closed' => sub{ print "Info Dialog closed\n"; $gui->do_show_main(); }); $gui->signal_connect('main_closed' => sub{ print "Main Win closed\n"; $gui->do_exit(); }); # GUI Starten $gui->do_run(); exit(); info.glade Code: (dl
)
1 <?xml version="1.0"?> |