ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/docs/pws2004/gtk2.pod
Revision: 1.2
Committed: Sat Apr 24 02:47:38 2004 UTC (22 years, 5 months ago) by root
Branch: MAIN
Changes since 1.1: +15 -2 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 Gtk+2 - ein erweiterbares GUI-Toolkit
2    
3     =head2 Abstract
4    
5 root 1.2 Gtk+2 (das {{G}}IMP {{T}}ool{{K}}it, Version 2)...
6 root 1.1
7     =head1 Teil 1 - Gtk+ als GUI-Baukasten
8    
9     =head2 Übersicht über die G-Bibliotheken
10    
11     Glib
12     Gtk2
13 root 1.2 Gtk2::GLExt
14     Gtk2::GladeXML
15     Gtk2::TrayIcon
16     Gtk2::Spell
17     Glade
18 root 1.1 Gnome2
19 root 1.2 Gnome2::Canvas
20     Gnome2::GConf
21     Gnome2::PanelApplet
22     Gnome2::Print
23     Gnome2::Rsvg
24     Gnome2::VFS
25     Gnome2::Vte
26     Gnome2::Wnck
27 root 1.1
28 root 1.2 =head2 Die Widgets von Gtk2
29 root 1.1
30     =head2 Properties und Signale
31    
32     =head3 Beispiel: Einfaches Session-Management
33    
34     =head2 Wie man seine Objekte wieder loskriegt
35    
36     =head2 Glade
37    
38     =head1 Teil 2 - Gtk+ als solide Grundlage für Eigenentwicklungen
39    
40     =head2 Perl-Objekte vs. Glib-Objekte
41    
42     mit einem objektorientiertem Design. Gtk+ selbst ist in C geschrieben,
43     es existieren jedoch Bindings für C++, Perl, Python und einige andere
44     Sprachen. Das Perl-Interface ist noch nicht vollkommen ausgereift,
45     ist aber schon hervorragend benutzbar und wird immer mehr eingesetzt
46     (z.B. für Administrationsfrontends in Debian GNU/Linux). Die Vorteile
47     von Gtk+ gegenüber Tk und anderen Toolkits ist die hervorragende
48     Integration{{}}: Perl-Widgets können von anderen Sprachen benutzt werden (z.B.
49     von C) und natürlich umgekehrt. Eigene Widgets können sehr einfach erzeugt
50     werden (im Gegensatz zu Tk), und die Gtk+-Bibliothek ist frei (im Sinne
51     der LGPL) -- auch auf anderen Betriebssystemen als UNIX.
52    
53     H1: Gtk
54    
55     C<Gtk> ist das Perl-Modul, das die Schnittstelle zur Gtk+-Bibliothek
56     bildet. Da die meisten Menschen "Gtk" sagen, wenn sie Gtk+ meinen, wird
57     die Perl-Schnittstelle meistens explizit "Gtk-Perl" genannt (genauso, wie
58     das Gimp-Modul meistens Gimp-Perl genannt wird).
59    
60     Zur Zeit bietet das Gtk-Modul auch Bindungen für Gnome und einige
61     andere Bibliotheken an, möglicherweise (das ist nicht sicher) werden
62     diese Module aber aufgetrennt werden: Gtk+ war ursprünglich das
63     {{G}}imp-{{T}}ool{{K}}it, und sowohl Gtk+ als auch Gimp sind {{kein}} Teil
64     des Gnome-Projektes und können deshalb ohne Gnome verwendet werden.
65    
66     H2: Ein einfaches Programm
67    
68     Hier ist ein ganz einfaches Gtk-Programm. Nichtsdestotrotz öffnet es schon ein Fenster:
69    
70     !block perl
71     use Gtk;
72    
73     Gtk->init;
74    
75     $main = new Gtk::Window;
76    
77     $main->show;
78     Gtk->main;
79     !endblock
80    
81     C<use Gtk;> sollte klar sein. Eine Eigenheit von Gtk+ ist es, daß es
82     zuerst explizit initialisiert werden muß (in einem Gnome-Programm würde
83     statt {{C:Gtk->init}} ein {{C:Gnome->init}} stehen), sonst gibt es jede Menge
84     Fehler.
85    
86     Der Aufruf C<new Gtk::Window> ist {{ein}} Weg, ein neues Fenster zu
87     erzeugen. Neue Gtk-{{Widgets}} sind Anfangs aber noch unsichtbar. Damit
88     sie angezeigt werden, muß zuerst die C<show>-Methode aufgerufen werden (es
89     gibt auch das entsprechende C<hide>).
90    
91     Das letzte, was unser Programm macht, ist, in die Hauptschleife von Gtk+
92     zu springen. Die Hauptschleife zeigt das Fenster und und -- wartet auf
93     Ereignisse{{}}:
94    
95     !import "hello1"; title="Das erste Fenster"
96    
97     Das Fenster ist natürlich leer und es wurden auch keine Reaktionen auf
98     Ereignisse. Die einzige Möglichkeit, das Programm zu beenden, ist es, es
99     zu "killen" (entweder C<xkill> oder z.B. C<SIGINT>).
100    
101     H2: Das Signalsystem von Gtk+
102    
103     Gtk+ setzt intern auf einer Bibliothek namens C<Gdk> (GNU Drawing ToolKit) auf, die
104     eine Schnittstelle auf niedriger Ebene zum jeweiligen Fenstersystem (X, Win32, BeOS...)
105     bildet. Diese Schnittstelle erzeugt Ereignisobjekte und reicht sie an Gtk+ weiter.
106    
107     Gtk+ verteilt diese Ereignisse an seine Widgets, indem es diesen Signale
108     schickt. Ein Signal ist z.B. eine Mausklick (C<clicked>) oder das
109     anklicken des "Fenster-Schließen"-Knopfes (C<delete_event>). Gtk+ kennt
110     aber auch eigene Signal, z.B. wenn ein Objekt zerstört wird (C<destroy>),
111     was einem Destruktor entspricht.
112    
113     Jeder Signal-Handler kann das Signal konsumieren, an andere Widgets
114     weiterreichen oder einfach ignorieren (wodurch es z.B. an das Vaterwidget
115     gelangt).
116    
117     Um eine Aktion an ein Signal zu binden, kann man die C<signal_connect>-Methode aufrufen:
118    
119     !block perl
120     $main = new Gtk::Window;
121    
122     $main->signal_connect(delete_event => sub { Gtk->main_quit });
123     !endblock
124    
125     Nun kann man den Schließknopf des Fensters betätigen, und das ausgelöste
126     Signal (C<delete_event>) führt zu einem Aufruf von {{C:Gtk->main_quit}}. Das
127     Beendet die Hauptschleife und damit das Programm.
128    
129     H2: Der erste Button
130    
131     Nun zu etwas mehr Aktion. Ein "Hello-World!"-Button muß her. Dies ist ganz einfach:
132    
133     !block perl
134     $button = new Gtk::Button "Hello, World!";
135     $main->add($button);
136    
137     $button->show;
138     !endblock
139    
140     Das einzig neue (neben der Erkenntnis, daß es auch C<Gtk::Button>s
141     gibt), ist der Aufruf von C<$main->add>. C<Gtk::Window> {{ist ein}}
142     C<Gtk::Container>, und erbt von diesem einige Methoden (unter anderem
143     C<add>).
144    
145     Das Fenster sieht nun so aus (nicht schön, aber es wird):
146    
147     !import "hello2"; title="Das Fenster -- mit Button!"
148    
149     Nun besetzen wir noch das C<clicked>-Ereignis mit einem überflüssigen Signal-Handler:
150    
151     !block perl
152     $button->signal_connect(clicked => sub { print "I was here!\n" });
153     !endblock
154    
155     H2: Vereinfachungen
156    
157     Das ganze Programm kann man (wenn man will) noch etwas einfacher
158     haben. Zuersteinmal: mir geht dieses dauernde {{C:$xxx->show}} auf
159     die Nerven. Weil es anderen wohl auch so ging, gibt es die Methode
160     C<show_all>. Sie ruft C<show> für das Widget und, rekursiv, für alle seine
161     Kinder auf. Man kann also alle (naja, zwei) C<show>-Aufrufe durch ein
162     einzelnes {{C:$main->show_all}} ersetzen.
163    
164     Die zweite Vereinfachung ist eher Geschmackssache: Man kann die Erzeugung
165     des Widgets und alle Initialisierungen (z.B. Signale) in einem Aufruf
166     erledigen:
167    
168     !block perl
169     use Gtk;
170    
171     init Gtk;
172    
173     $main = new Gtk::Widget "Gtk::Window",
174     -signal::delete_event => sub { Gtk->main_quit };
175    
176     add $main (new Gtk::Widget "Gtk::Button",
177     -label => "Hello, World!",
178     -signal::clicked => sub { print "I was here!\n" });
179    
180     $main->show_all;
181    
182     Gtk->main;
183     !endblock
184    
185     H2: Verschönerungen
186    
187     Um noch ein paar Features vorzustellen sollen noch ein paar Knöpfe
188     hinzukommen. Der "Hello-World"-Knopf soll in einen Rahmen. Unter den
189     Rahmen sollen zwei Knöpfe: der erste soll den Text an- und abschalten, der
190     zweite soll das Programm beenden:
191    
192     !import "hello-layout"; title="Schematisches Layout"
193     !import "hello31"; title="Das Programm beim Start"
194     !import "hello32"; title="Nach dem abschalten der Nachricht"
195    
196     Die Technik, Widgets an- und abzuschalten wird gerne für Dialoge in
197     der Art "Advanced Options >>" verwendet, um dem Benutzer mehr Optionen
198     anzubieten.
199    
200     Gtk+ bietet viele Arten von Layout-Managern. Grundsätzlich möchte es
201     aber das Layouten des Fensters gerne selbst übernehmen. Man {{kann}}
202     die Größe und Lage von Widgets selbst bestimmen, aber Gtk+ arbeitet
203     wesentlich besser, wenn man nur Hinweise gibt. Ein solcher Hinweis kann
204     in Form der C<Gtk::VBox> und C<Gtk::HBox>-Container geschehen. Diese
205     sind Rechtecke, die mehrere Widgets enthalten können, die vertikal oder
206     horizontal ausgerichtet werden.
207    
208     Das Hauptelement des Fensters soll also eine C<Gtk::VBox> werden. Oben
209     soll eine C<Gtk::Frame> stehen, und im unteren Teil soll eine C<Gtk::HBox>
210     mit den "Bedienelementen" sein (Eine C<Gtk::Box> kann durchaus auch mehr
211     als zwei Widgets enthalten). Die VBox wird einfach erzeugt mit:
212    
213     !block perl
214     add $main (my $vbox = new Gtk::Widget "Gtk::VBox",
215     homogeneous => 0,
216     spacing => 5,
217     border_width => 5);
218     !endblock
219    
220     Eine C<Gtk::Box> ist C<homogeneous>, wenn alle Widgets die gleiche Größe
221     haben. Unsere VBox soll das {{nicht}} sein, die C<Gtk::HBox> dagegen
222     schon. Dann wird eine C<Gtk::Frame> erzeugt, in die das C<Gtk::Label> mit
223     dem "Hello, World!" gepackt wird (der Layoutvorgang wird auch "packen"
224     genannt, da die Widgets dabei in den verfügbaren Raum "eingepackt
225     werden").
226    
227     !block perl
228     # Message-Frame:
229     add $vbox (my $frame = new Gtk::Frame "A Message:");
230    
231     # Message-Label:
232     add $frame (my $label = new Gtk::Label "Hello, World!");
233     !endblock
234    
235     Die horizontale Box für die Knöpfe wird mit einem vereinfachten
236     Konstruktor (statt dem allgemeinen {{C:Gtk::Widget->new}}) erzeugt, der
237     nur zwei Argumente ("homogen" und "Abstand") akzeptiert.
238    
239     !block perl
240     add $vbox (my $hbox = new Gtk::HBox 1,5);
241     !endblock
242    
243     Das Interessanteste an dem Programm ist zweifellos der Umschaltknopf,
244     der die Nachricht an- und abschaltet. Dazu bedienen wir uns eines
245     C<Gtk::ToggleButton>s, der zwei Zustände (aktiv und inaktiv) besitzt:
246    
247     !block perl
248     add $hbox (new Gtk::Widget "Gtk::ToggleButton",
249     label => "Message Shown",
250     active => 1,
251     signal::clicked => sub {
252     $label->visible
253     ? $label->hide
254     : $label->show;
255     });
256     !endblock
257    
258     Hier ist das gesamte Programm:
259    
260     !block perl
261     use Gtk;
262    
263     init Gtk;
264    
265     $main = new Gtk::Widget "Gtk::Window",
266     -signal::delete_event => sub { Gtk->main_quit };
267    
268     add $main (my $vbox = new Gtk::Widget "Gtk::VBox",
269     homogeneous => 0,
270     spacing => 5,
271     border_width => 5);
272    
273     # Message-Frame:
274     add $vbox (my $frame = new Gtk::Frame "A Message:");
275    
276     # Message-Label:
277     add $frame (my $label = new Gtk::Label "Hello, World!");
278    
279     # Button-Bar
280     add $vbox (my $hbox = new Gtk::HBox 1,5);
281    
282     # Toggle-Button
283     add $hbox (new Gtk::Widget "Gtk::ToggleButton",
284     label => "Message Shown",
285     active => 1,
286     signal::clicked => sub {
287     $label->visible
288     ? $label->hide
289     : $label->show;
290     });
291    
292     # Close Button
293     add $hbox (new Gtk::Widget "Gtk::Button",
294     label => "OK",
295     signal::clicked => sub { main_quit Gtk });
296    
297     $main->show_all;
298    
299     Gtk->main;
300     !endblock
301    
302     H1: Eine Widget-Demo
303    
304     Als Abschluß folgt noch ein Screenshot, bei dem ich mich bemüht habe,
305     die wichtigsten (schon verfügbaren) Widgets alle auf einen Bildschirm
306     zu bekommen (das Gtk-Perl-Demoprogramm, C<Gtk/samples/test.pl> war sehr
307     hilfreich ;)
308    
309     Natürlich kann man jederzeit auch eigene Widgets programmieren...
310    
311     !import "screenshot"; title="Der mega-unübersichtliche Screenshot"
312    
313    
314    
315    
316