<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//DE"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <META NAME="GENERATOR" CONTENT="lfparser_2.23"> <META NAME="LFCATEGORY" CONTENT="SoftwareDevelopment"> <!-- this is used by a number of tools: =LF=AUTHOR: Hilaire Fernandes =LF=CAT___: SoftwareDevelopment =LF=TITLE_: Entwickeln von Gnome Applikationen mit Python (Teil 2) =LF=NUMBER: 224 =LF=ANAME_: article224.shtml --> <TITLE>lf224, SoftwareDevelopment: Entwickeln von Gnome Applikationen mit Python (Teil 2)</TITLE> <!-- stylesheet added by lfparser: --> <style type="text/css"> <!-- td.top {font-family: Arial,Geneva,Verdana,Helvetica,sans-serif; font-size:12 } pre { font-familiy:monospace,Courier } p.cl { color:#EE9500 } a.nodec { text-decoration:none } p.trans { font-size:8pt; text-align:right } p.clbox { width:50%; alignment:center; background-color:#FFD700; border-style:none; border-width:medium; border-color:#FFD700; padding:0.5cm ; text-align:center } p.code { width:80%; alignment:center; background-color:#aedbe8; border-style:none; border-width:medium; border-color:#aedbe8; padding:0.1cm ; text-align:left } p.foot { background-color:#AAAAAA; color:#FFFFFF; border-style:none; border-width:medium; border-color:#AAAAAA; padding:0.5cm ; margin-top:0.1cm; margin-right:1cm; margin-left:1cm; text-align:center } --> </style> </HEAD> <BODY bgcolor="#ffffff" text="#000000"> <!-- this is generated html code. NEVER use this file for your translation work. Instead get the file with the same article number and .meta.shtml in its name. Translate this meta file and then use lfparser program to generate the final article --> <!-- lfparser can be obtained from http://www.linuxfocus.org/~guido/dev/lfparser.html --> <!-- 2pdaIgnoreStart --> <!-- start navegation bar --> <!-- top navegation bar --> <TABLE summary="topbar_1" cellspacing="0" cellpadding="0" border="0" align="center" width="90%"> <TR bgcolor="#2e2292"> <TD class="top"><TABLE summary="topbar_1_logo" cellspacing="0" cellpadding="0" border="0" width= "100%"> <TR><TD width="319"><IMG src="../../common/images/logolftop_319x45.gif" alt="[LinuxFocus-icon]" width="319" height="45" align="left" border="0"></TD> <TD class="top"> <TABLE summary="topbar_1_links" width="100%"> <TR align="right"> <TD class="top"><A class="nodec" href="../index.shtml"><FONT color= "#DDDDDD" size="2">Home</FONT></A> | <A class= "nodec" href="../map.html"><FONT color= "#DDDDDD" size="2">Plan</FONT></A> | <A class= "nodec" href="../indice.html"><FONT color= "#DDDDDD" size="2">Index</FONT></A> | <A class="nodec" href="../Search/index.html"><FONT color= "#DDDDDD" size="2">Suchen</FONT></A> </TD> </TR> <TR align="right"> <TD class="top"> <HR width="100%" noshade size="1"> </TD> </TR> </TABLE> </TD> </TR> </TABLE> </TD> </TR> </TABLE> <!-- end top navegation bar --> <!-- blue bar --> <TABLE summary="topbar_2" cellspacing="0" cellpadding="0" border="0" align="center" width="90%"> <TR bgcolor="#00ffff"> <TD><IMG src="../../common/images/transpix.gif" width="1" height= "2" alt=""></TD> </TR> </TABLE> <!-- end blue bar --> <!-- bottom navegation bar --> <TABLE summary="topbar_3" cellspacing="0" cellpadding="0" border="0" align="center" width="94%"> <TR bgcolor="#000000"> <TD> <TABLE summary="topbar_3_links" cellspacing="0" cellpadding="1" border="0" width= "100%"> <TR align="center"> <TD WIDTH="20%"><A class="nodec" href="../News/index.shtml"><FONT color= "#FFFFFF">Nachrichten</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Archives/index.html"><FONT color= "#FFFFFF">Archiv</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../Links/index.shtml"><FONT color= "#FFFFFF">Links</FONT></A> </TD> <TD WIDTH="5%"><FONT color="#FFFFFF">|</FONT> </TD> <TD WIDTH="20%"><A class="nodec" href="../aboutus.html"><FONT color= "#FFFFFF">Über uns</FONT></A> </TD> </TR> </TABLE> </TD> </TR> </TABLE> <!-- end bottom navegation bar --> <!-- stop navegation bar --> <!-- SSI_INFO --> <!-- tr_staticssi include virtual --> <!-- tr_staticssi exec cmd --> <!-- addedByLfdynahead ver 1.4 --><TABLE ALIGN="right" border=0><TR><TD ALIGN="right"><FONT SIZE="-1" FACE="Arial,Helvetica">Dieses Dokument ist verfübar auf: <A href="../../English/January2002/article224.shtml">English</a> <A href="../../Castellano/January2002/article224.shtml">Castellano</a> <A href="../../ChineseGB/January2002/article224.shtml">ChineseGB</a> <A href="../../Deutsch/January2002/article224.shtml">Deutsch</a> <A href="../../Francais/January2002/article224.shtml">Francais</a> <A href="../../Nederlands/January2002/article224.shtml">Nederlands</a> <A href="../../Portugues/January2002/article224.shtml">Portugues</a> <A href="../../Turkce/January2002/article224.shtml">Turkce</a> </FONT></TD></TR></TABLE><br> <!-- SSI_INFO STOP --> <!-- 2pdaIgnoreStop --> <!-- SHORT BIO ABOUT THE AUTHOR --> <TABLE ALIGN=LEFT BORDER=0 WIDTH="30%" > <TR> <TD> <!-- 2pdaIgnoreStart --> <!-- PALM DOC --> <TABLE BORDER=0 hspace=4 vspace=4> <TR> <TD> <font size=1> <img src="../../common/images/2doc.gif" width=34 align=left border=0 height=22 alt="convert to palm"><a href="http://cgi.linuxfocus.org/cgi-bin/2ztxt">Convert to GutenPalm</a><br>or <a href="http://cgi.linuxfocus.org/cgi-bin/2pda">to PalmDoc</a></font> </TD> </TR> </TABLE> <!-- END PALM DOC --> <!-- 2pdaIgnoreStop --> <br> <img src="../../common/images/HilaireFernandes_color.png" width="124" height="172" alt="Hilaire Fernandes"> <BR>von Hilaire Fernandes <br> <small><hilaire(at)ofset.org></small> <BR><BR> <I>Über den Autor:</I><BR> <p>Hilaire Fernandes ist Vizepräsident <a href= "http://www.ofset.org">OFSET</a>, einer Gesellschaft zur Förderung und Entwicklung von freier Schul- und Lernsoftware für das Gnome-Projekt. Er hat ebenfalls Dr. Geo, eine preisgekrönte Software für dynamische Geometrien geschrieben. Zur Zeit beschäftigt er sich mit Dr. Genius, einer anderen mathematischen Lernsoftware für das Gnome Projekt.</p> <!-- TRANSLATED TO de --> <BR><BR><I>Übersetzt ins Deutsche von:</I><BR> Günther Socher <small><gsocher(at)web.de></small> <br> <!-- TRANSLATED TO STOP --> <BR><i>Inhalt</i>: <UL> <LI><A HREF="#224lfindex0">Was man braucht</A></LI> <LI><A HREF="#224lfindex1">Drill, unser Support</A></LI> <LI><A HREF="#224lfindex2">Erstellung der Schnittstelle mit Glade</A></LI> <LI><A HREF="#224lfindex3">Der Code von Python</A></LI> <LI><A HREF="#224lfindex4">Die notwendigen Module</A></LI> <LI><A HREF="#224lfindex5">Die graphische Schnittstelle mit LibGlade</A></LI> <LI><A HREF="#224lfindex6">Das Widget GtkTree</A></LI> <LI><A HREF="#224lfindex7">Die Bedienungsfunktionen</A></LI> <LI><A HREF="#224lfindex8">Schlusswort</A></LI> <LI><A HREF="#224lfindex9">Anhang: Der vollständige Sourcecode</A></LI> <LI><A HREF="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=224&lang=en">Talkback für diesen Artikel</A></LI> </UL> </TD></TR></TABLE> <!-- HEAD OF THE ARTICLE --> <br> <H2>Entwickeln von Gnome Applikationen mit Python (Teil 2)</H2> <img src="../../common/images/article160/gnome.png" width="48" height="48" alt="Gnome" hspace="10"> <!-- ABSTRACT OF THE ARTICLE --> <P><i>Zusammenfassung</i>: <P> <p>Diese Artikelreihe ist vor allem für Anfänger in der Programmierung mit Gnome und GNU/Linux geschrieben. Die gewählte Programmiersprache Python ist einfach und vermeidet die gewöhnliche Überforderung des Benutzers wie z. B. mit der Compilersprache C. Um diesen Artikel zu verstehen, sind einige Grundkenntnisse in der Programierung mit Python notwendig.</p></P> <HR size="2" noshade align="right"><BR> <!-- BODY OF THE ARTICLE --> <A NAME="224lfindex0"> </A> <H2>Was man braucht</H2> <p>Eine Liste der notwendigen Software zur Ausführung des beschriebenen Programmes befindet sich im <a href="../July2000/article160.shtml">Teil I</a> dieser Artikelreihe.</p> <p>Ebenfalls benötigen Sie :</p> <ul> <li>die Datei .glade original [ <a href= "../../common/images/article160/drill.glade.txt">drill.glade</a> ] ;</li> <li>den Sourcecode von Python [ <a href= "../../common/images/article160/drill.py.txt">drill.py</a> ].</li> </ul> <p>Die Installation und die Anwendung von Python-Gnome und LibGlade ist ebenfalls im Teil I beschrieben.</p> <A NAME="224lfindex1"> </A> <H2><strong>Drill</strong>, unser Support</H2> <p>Ziel des ersten Teils war es, die verschiedenen Mechanismen und das Zusammenspiel der verschiedenen Teile eines unter Gnome-, Glade-, LibGlade- und Python- geschriebenen Programmes zu zeigen.</p> <p>Das Anwendungsbeispiel benutzt das Widget <tt>GnomeCanvas</tt>. Das ermöglicht uns eine farbenreiche Darstellung und zeigt die Vorteile und die Einfachheit der Programmentwicklung mit dieser Konfiguration.</p> <p>Im folgenden Abschnitt werden die verschiedenen Widgets von Gnome dargestellt. Dieser Artikel beschäftigt sich hauptsächlich damit, diese Rahmenbedingungen zu erklären. Weitere Artikel, die sich auf diesen beziehen werden, fügen noch mehr Funktionen hinzu, um die verschiedenen Widgets (=Elemente in einer grafischen Oberfläche, z.B. ein Knopf) von Gnome zu erklären</p> <p>Unsere wichtigste Software nennt sich <strong>Drill</strong>. Es handelt sich um eine Platform zur Schulung, auf die sich unsere Beispiele und Übungen beziehen. Diese Beispiele und Übungen dienen ausschließlich zu pädagogischen Zwecken, um den Umgang mit den Widgets zu zeigen.</p> <A NAME="224lfindex2"> </A> <H3>Erstellung der Schnittstelle mit Glade</H3> <p><b>Die Widgets</b></p> <p>Das Anwendungsfenster wird mit Hilfe von Glade erstellt. Wie im vorherigen Artikel erstellen Sie zunächst ein Fenster für eine Gnome Applikation. Darin müssen Sie die Icons und Menüs löschen.</p> <p>Der Haupteil von <strong>Drill</strong> ist mit dem Widget <tt>GtkPaned</tt> in zwei Teile unterteilt worden.</p> <center> <img src="../../common/images/article160/python2-0.png" width="361" height="407" alt="[Drill window]"><br> <strong>Abb. 1 - Fenster von Drill</strong> </center> <p>Sie sind vertikal unterteilt und diese Unterteilung lässt sich auch verschieben. Der linke Teil enthält ein Baum Widget (<tt>GtkTree</tt>), in welchem die verschiedenen Abschnitte der Übung angeordnet sind. Der rechte Teil ist leer und dort werden die Übungen von dem Anwender dann ausgeführt.</p> <p>Glade kann das Widget Interface von <strong>Drill</strong> in Form eines hirarchischen Baumes darstellen. Das erleichtert das Verständnis. </p> <center> <img src="../../common/images/article160/python2-1.png" width="262" height="345" alt="[widgets in tree]"><br> <strong>Abb. 2 - Baumdarstellung der Schnittstelle von Drill</strong> </center> <p>In der Abb. 2 kann man das Widget <tt>hpanedTree</tt> sehen (vom Typ <tt>GtkPaned</tt>). Es enthält nur einen einzigen Widget, <tt>frame2</tt> (vom Typ <tt>GtkFrame</tt>), dieser befindet sich links. <tt>frame2</tt> enthält den widget <tt>exerciceTree</tt>. Es ist vorteilhafter zunächst ein Widget <tt>GtkFrame</tt> mit der Schattierung des Typs <tt>GTK_SHADOW_IN</tt> in einem <tt>GtkPaned</tt> Widget, zu nehmen, was Überschneidungen mit der Trennleiste verhindert.</p> <p>Zum Schluß das Dialogfenster Gnome "À propos", das beim Beenden von <strong>Drill</strong> erscheint. </p> <center> <img src="../../common/images/article160/python2-2.png" width="246" height="258" alt="[Dialog window]"><br> <strong>Abb. 3 - Dialogfenster "À propos" von Drill</strong> </center> <p>Die unterschiedlichen Elemente sind von Glade aus im Dialogfenster <tt>Widget</tt> des Fensters <tt>Eigenschaften</tt> bearbeitet worden.</p> <p><b>Die Namen der Widgets und seine Bedingungsfunktionen</b></p> <p>Benutzen Sie die folgenden Namen für diese Widgets, um diese schließlich unter diesen Namen unter Python zu verändern.</p> <dl id="widgetname"> <dt><b>Anwendungsfenster Gnome :</b></dt> <dd><tt>drillApp</tt></dd> <dt><b>Die Trennleiste zwischen dem Baum und der Übung :</b></dt> <dd><tt>hpanedTree</tt></dd> <dt><b>Baum der Übungen :</b></dt> <dd><tt>exerciceTree</tt></dd> <dt><b>Dialogfenster Gnome À-propos :</b></dt> <dd><tt>about</tt></dd> </dl> <p>Diese widgets sind sichtbar auf der Abb. 2 bezeichnet</p> <p>Wir führen hier schnell die Bedienungsfunktionen auf. Falls Sie weitergehende Informationen zu diesem Thema benötigen, können Sie diese im <a href="../July2000/article160.shtml">Teil I </a>dieser Artikelserie nachschlagen</p> <p></p> <table border="1" cellpadding="8"> <tr> <th>Name des Widgets</th> <th>Signal</th> <th>Event handler</th> </tr> <tr> <td>about</td> <td>clicked</td> <td>gtk_widget_destroy</td> </tr> <tr> <td>about</td> <td>close</td> <td>gtk_widget_destroy</td> </tr> <tr> <td>about</td> <td>destroy</td> <td>gtk_widget_destroy</td> </tr> <tr> <td>button1 (Neues Icon in der<br> Arbeistleiste)</td> <td>clicked</td> <td>on_new_activate</td> </tr> <tr> <td>new</td> <td>activate</td> <td>on_new_activate</td> </tr> <tr> <td>drillApp</td> <td>destroy</td> <td>on_exit_activate</td> </tr> <tr> <td>exit</td> <td>activate</td> <td>on_exit_activate</td> </tr> <tr> <td>about</td> <td>activate</td> <td>on_about_activate</td> </tr> </table> <p><b>Letzte Anpassungen</b></p> <p>Von Glade aus ist es möglich, die Geometrie der Widgets zu definieren. In unserem Fall können Sie die Größe der <tt>drillApp</tt> auf 400x300 im Eigenschaftendialogfenster einstellen. Ebenfalls kann die Position der horizontalen Unterteilung des Fensters auf 100 statt 1 eingestellt werden.</p> <p>Anschließend muss das Widget <tt>exerciceTree</tt> eingestellt werden, um nur eine Auswahl gleichzeitig zu erlauben. Nur eine Übung gleichzeitig ausgewählt werden. Von dem Fenster <tt>Eigenschaften</tt>, wählt man <tt>Selection->Single</tt>. Die anderen Optionen von diesem Widget sind weniger wichtig</p> <p>Voilà! Was <strong>Drill</strong> betrifft, ist die Konfiguration fertig. Jetzt fangen wir an, die Übungen des Artikels auszuführen. Nun werden wir sehen, wie man die Schnittstelle von Python aus benutzt und wir werden uns mit den Einstellungen des Widgets <tt>GtkTree</tt> beschäftigen.</p> <A NAME="224lfindex3"> </A> <H3>Der Code von Python</H3> <p>Der vollständige Sourcecode befindet sich am Ende dieses Dokumentes. Er muss im gleichen Verzeichnis wie die Datei <tt>drill.glade</tt> abgelegt werden.</p> <A NAME="224lfindex4"> </A> <H3>Die notwendigen Module</H3> <p class="code"> from gtk import * <br>from gnome.ui import * <br>from GDK import * <br>from libglade import * </p> <A NAME="224lfindex5"> </A> <H3>Die graphische Schnittstelle mit LibGlade</H3> <p>Der Aufbau der graphischen Schnittstelle und die Einbindung der Bedienungsfunktionen mit LibGlade wird in analoger Weise wie im vorherigen Beispiel durchgeführt. Wir werden auf diesen Aspekt zurückkommen.</p> <p>Im Python Programm definieren wir die globalen Variablen :</p> <ul> <li><tt>currentExercice</tt>: Pointer auf das Widget, der die aktuelle Übung darstellt. Dieser wird in der rechten Seite des Anwendungsfensterns <strong>Drill</strong> abgelegt. Die Übungen sind ebenfalls von Glade aus geschrieben worden.</li> <li><tt>exerciceTree</tt>: Pointer auf den Baum auf den linken Teil des Anwendungsfensters von <strong>Drill</strong>.</li> <li><tt>label</tt>: Pointer auf den label (<tt>GtkLabel</tt>). Dieser Label ist ein Notbehelf bei Nichtvorhandensein der Übung. Er wird auf der rechten Seite des Baumes gesetzt -- wo die Übungen hingehören -- und wir werden dort Namen der ausgewählten Übungen anzeigen.</li> </ul> <br> <br> <p>Der Baum ist von LibGlade erzeugt worden, der Pointer ist mit folgendem Aufruf erhalten worden:</p> <p class="code"> exerciceTree = wTree.get_widget ("exerciceTree") </p> <p>Wir benötigen ebenfalls den Pointer auf die horizontalen Fenster, genauer gesagt, den Pointer vom Container Widget (<tt>GtkPaned</tt>), dem horizontalen Fenster mit der Trennleiste. Die linke Hälfte stellt den Baum dar und die rechte Hälfte die Übungen, wo wir jetzt den label gesetzt haben:</p> <p class="code"> paned = wTree.get_widget ("hpanedTree") <br> label = GtkLabel ("No exercise selected") <br> label.show () <br> paned.pack2 (label) </p> <p>Es empfiehlt sich, auch die <b>Bedienungsanleitung von GTK+</b> -- über die Objekte <tt>GtkLabel</tt> und <tt>GtkPaned</tt> -- und die Quellen von Python <tt>/usr/lib/python1.5/site-packages/gtk.py</tt> zu studieren. </p> <A NAME="224lfindex6"> </A> <H3>Das Widget <tt>GtkTree</tt></H3> <p>Wir kommen jetzt zum wichtigsten Teil unseres Artikels, um einen Baum des Types <tt>GtkTree</tt> benutzen zu können.</p> <p>Der Baum besteht aus aufeinanderfolgenden Aufrufen der Funktionen <tt>addMathExercices()</tt>, <tt>addFrenchExercices()</tt>, <tt>addHistoryExercices()</tt> et <tt>addGeographyExercices()</tt>. Diese Funktionen ähneln sich alle. Jede dieser Funktionen fügt eine neue Unterkategorie (Unterbaum) ebenso wie die Titel der Übung (die Items) hinzu:</p> <p class="code"> def addMathExercices (): <br> subtree = addSubtree ("Mathématiques") <br> addExercice (subtree, "Exercice 1", "Math. Ex1") <br> addExercice (subtree, "Exercice 2", "Math. Ex2") </p> <p><b>Der Unterbaum</b></p> <p class="code"> def addSubtree (name): <br> global exerciceTree <br> subTree = GtkTree () <br> item = GtkTreeItem (name) <br> exerciceTree.append (item) <br> item.set_subtree (subTree) <br> item.show () <br> item.connect ("select", selectSubtree) <br> return subTree </p> <p>Um einen Unterbaum im existierenden Baum zu erzeugen, muss man zwei Dinge erzeugen: Einen Baum <tt>GtkTree</tt> und ein Element <tt>GtkTreeItem</tt>, das nach dem Unterbaum benannt ist. Anschließend ist das Element an der Wurzel des Baumes hinzugefügt worden -- unser Baum beinhaltet alle Kategorien -- dann setzen wir unseren Unterbaum auf das Element mit Hilfe der Methode <tt>set_subtree()</tt> auf. Schließlich ist der Event <tt>select</tt> an das Element anzuschließen. Damit wird die Funktion <tt>selectSubtree()</tt> aufgerufen sobald ein Kathegorie ausgewählte wird.</p> <p><b>GtkTreeItem</b></p> <p class="code"> def addExercice (category, title, idValue): <br> item = GtkTreeItem (title) <br> item.set_data ("id", idValue) <br> category.append (item) <br> item.show () <br> item.connect ("select", selectTreeItem) <br> item.connect ("deselect", deselectTreeItem) </p> <p>Die Elemente tragen die gleichen Bezeichnungen wie die Namen der Übungen, hier im allgemeinen nur <tt>Übung 1</tt>, <tt>Übung 2</tt>, ... Bei jedem Element wird ein zusätzliches Attribut hinzugefügt, <tt>id</tt>. GTK+ bietet die Möglichkeit jedes Objekt vom Typ <tt>GtkObject</tt> hinzuzufügen. Hierzu existieren zwei Methoden <tt>set_data (key, value)</tt> und <tt>get_data (key)</tt>, um das Attribut zu initialisieren und auf dessen Wert zurückzugreifen. Das Element wird anschließend zu seiner Kategorie hinzugefügt -- einem Unterbaum. Die Methode <tt>show()</tt> wird aufgerufen um das element anzuzeigen. Anschließend werden die Events <tt>select</tt> und <tt>deselect</tt> eingebunden. Das Event <tt>deselect</tt> wird eingesetzt, wenn das Element nicht mehr ausgewählt wird. Analog dazu wird die Methode <tt>deselectTreeItem()</tt> oder <tt>selectTreeItem()</tt> ausgeführt. </p> <A NAME="224lfindex7"> </A> <H3>Die Bedienungsfunktionen</H3> <p>Wir haben drei Bedienungsfunktionen definiert <tt>selectTreeItem()</tt>, <tt>deselectTreeItem()</tt> und <tt>selectSubtree()</tt>. Diese Funktionen aktualisieren den Text des Labels -- in der rechten Zone -- mit dem Wert des Attributes <tt>id</tt>.</p> <A NAME="224lfindex8"> </A> <H3>Schlusswort</H3> <p>Wir haben die Infrastruktur, in der wir die Übungen durchführen, aufgebaut -- genauso wie die neu entdeckten Widgets. Wir haben uns hauptsächlich mit dem Widget <tt>GtkTree</tt> beschäftigt und wie man Attribute zu den Widgets hinzufügen kann. Dieses Verfahren wird sehr oft benutzt, um in den Bedienungsfunktionen noch zusätzliche Informationen zu erhalten. Bis zum nächsten Artikel können Sie versuchen, das Spiel <strong>Couleur</strong>, womit wir uns im Teil I beschäftigt haben, als eine Übung in <strong>Drill</strong> einzubauen.</p> <A NAME="224lfindex9"> </A> <H3>Anhang: Der vollständige Sourcecode</H3> <P class="code">#!/usr/bin/python<BR> # Drill - Teo Serie<BR> # Copyright Hilaire Fernandes 2001<BR> # Release under the terms of the GPL licence<BR> # You can get a copy of the license at http://www.gnu.org from gtk import *<BR> from gnome.ui import *<BR> from GDK import *<BR> from libglade import * exerciceTree = currentExercice = label = None<BR> <BR> def on_about_activate(obj):<BR> "display the about dialog"<BR> about = GladeXML ("drill.glade", "about").get_widget ("about")<BR> about.show ()<BR> <BR> def on_new_activate (obj):<BR> global exerciceTree, currentExercice<BR> <BR> def selectTreeItem (item):<BR> global label<BR> label.set_text ("L'exercice " +<BR> item.get_data ("id") + "est sélectionné.")<BR> <BR> def deselectTreeItem (item):<BR> global label<BR> label.set_text ("L'exercice " +<BR> item.get_data ("id") + "est désélectionné.")<BR> <BR> def selectSubtree (subtree):<BR> global label<BR> label.set_text ("No selected exercise")<BR> <BR> def addSubtree (name):<BR> global exerciceTree<BR> subTree = GtkTree ()<BR> item = GtkTreeItem (name)<BR> exerciceTree.append (item)<BR> item.set_subtree (subTree)<BR> item.show ()<BR> item.connect ("select", selectSubtree)<BR> return subTree<BR> <BR> def addExercice (category, title, id):<BR> item = GtkTreeItem (title)<BR> item.set_data ("id", id)<BR> category.append (item)<BR> item.show ()<BR> item.connect ("select", selectTreeItem)<BR> item.connect ("deselect", deselectTreeItem)<BR> <BR> def addMathExercices ():<BR> subtree = addSubtree ("Mathématiques")<BR> addExercice (subtree, "Exercice 1", "Math. Ex1")<BR> addExercice (subtree, "Exercice 2", "Math. Ex2")<BR> <BR> def addFrenchExercices ():<BR> subtree = addSubtree ("Français")<BR> addExercice (subtree, "Exercice 1", "Français Ex1")<BR> addExercice (subtree, "Exercice 2", "Français Ex2")<BR> <BR> def addHistoryExercices ():<BR> subtree = addSubtree ("Histoire")<BR> addExercice (subtree, "Exercice 1", "Histoire Ex1")<BR> addExercice (subtree, "Exercice 2", "Histoire Ex2")<BR> <BR> def addGeographyExercices ():<BR> subtree = addSubtree ("Géographie")<BR> addExercice (subtree, "Exercice 1", "Géographie Ex1")<BR> addExercice (subtree, "Exercice 2", "Géographie Ex2")<BR> <BR> def initDrill ():<BR> global exerciceTree, label<BR> wTree = GladeXML ("drill.glade", "drillApp")<BR> dic = {"on_about_activate": on_about_activate,<BR> "on_exit_activate": mainquit,<BR> "on_new_activate": on_new_activate}<BR> wTree.signal_autoconnect (dic)<BR> exerciceTree = wTree.get_widget ("exerciceTree")<BR> # Temporary until we implement real exercice<BR> paned = wTree.get_widget ("hpanedTree")<BR> label = GtkLabel ("No selected exercise")<BR> label.show ()<BR> paned.pack2 (label)<BR> # Free the GladeXML tree<BR> wTree.destroy ()<BR> # Add the exercices<BR> addMathExercices ()<BR> addFrenchExercices ()<BR> addHistoryExercices ()<BR> addGeographyExercices ()<BR> <BR> initDrill ()<BR> mainloop ()</P> <!-- 2pdaIgnoreStart --> <A NAME="talkback"> </a> <h2>Talkback für diesen Artikel</h2> Jeder Artikel hat seine eigene Seite für Kommentare und Rückmeldungen. Auf dieser Seite kann jeder eigene Kommentare abgeben und die Kommentare anderer Leser sehen: <center> <table border="0" CELLSPACING="2" CELLPADDING="1"> <tr BGCOLOR="#C2C2C2"><td align=center> <table border="3" CELLSPACING="2" CELLPADDING="1"> <tr BGCOLOR="#C2C2C2"><td align=center> <A href="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=224&lang=en"><b> Talkback Seite </b></a> </td></tr></table> </td></tr></table> </center> <HR size="2" noshade> <!-- ARTICLE FOOT --> <CENTER><TABLE WIDTH="98%"> <TR><TD ALIGN=CENTER BGCOLOR="#9999AA" WIDTH="50%"> <A HREF="../../common/lfteam.html">Der LinuxFocus Redaktion schreiben</A> <BR><FONT COLOR="#FFFFFF">© Hilaire Fernandes, <a href="../../common/copy.html">FDL</a> <BR><a href="http://www.linuxfocus.org">LinuxFocus.org</a></FONT> <BR><a href="http://cgi.linuxfocus.org/cgi-bin/lfcomment?lang=de&article=article224.shtml" target="_TOP">Einen Fehler melden oder einen Kommentar an LinuxFocus schicken</A><BR></TD> <TD BGCOLOR="#9999AA"> <!-- TRANSLATION INFO --> <font size=2>Autoren und Übersetzer:</font> <TABLE> <tr><td><font size="2">fr --> -- : Hilaire Fernandes <small><hilaire(at)ofset.org></small></font></td></tr> <tr><td><font size="2">fr --> de: Günther Socher <gsocher(at)web.de></font></td></tr> </TABLE> </TD> </TR></TABLE></CENTER> <p><font size=1>2002-01-01, generated by lfparser version 2.23</font></p> <!-- 2pdaIgnoreStop --> </BODY> </HTML>