Thread [GTK2] About Dialog mit Glade 3 (2 answers)
Opened by MarkusH at 2012-04-11 19:37

topeg
 2012-04-12 00:00
#157405 #157405
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Also ganz kurz:

Code (perl): (dl )
1
2
3
4
 
  my $info=$glade->get_object('info_dialog');
  $info->run();
  $info->hide();


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:
more (21.3kb):
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
more (6.0kb):
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
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
<?xml version="1.0"?>
<interface>
<requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide -->
<object class="GtkAboutDialog" id="info_dialog">
<property name="border_width">5</property>
<property name="type_hint">normal</property>
<property name="program_name">TEST</property>
<property name="version">0.01</property>
<property name="copyright" translatable="yes">ToPeG</property>
<property name="comments" translatable="yes">Nur ein Test</property>
<property name="license" translatable="yes">Gpl2</property>
<property name="authors">ToPeG</property>
<property name="documenters">ToPeG</property>
<property name="artists">ToPeG</property>
<child internal-child="vbox">
<object class="GtkVBox" id="dialog-vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child>
<placeholder/>
</child>
<child internal-child="action_area">
<object class="GtkHButtonBox" id="dialog-action_area1">
<property name="visible">True</property>
<property name="layout_style">end</property>
</object>
<packing>
<property name="expand">False</property>
<property name="pack_type">end</property>
<property name="position">0</property>
</packing>
</child>
</object>
</child>
</object>
<object class="GtkWindow" id="mainwin">
<property name="border_width">5</property>
<signal name="destroy_event" handler="on_main_close"/>
<child>
<object class="GtkVBox" id="vbox1">
<property name="visible">True</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkButton" id="button1">
<property name="label">gtk-dialog-info</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_info_open"/>
</object>
<packing>
<property name="padding">5</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkHButtonBox" id="hbuttonbox1">
<property name="visible">True</property>
<property name="layout_style">end</property>
<child>
<object class="GtkButton" id="button2">
<property name="label">gtk-quit</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<signal name="clicked" handler="on_main_close"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>

View full thread [GTK2] About Dialog mit Glade 3