<!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> &nbsp;|&nbsp; <A class=
                 "nodec" href="../map.html"><FONT color=
                 "#DDDDDD" size="2">Plan</FONT></A> &nbsp;|&nbsp; <A class=
                 "nodec" href="../indice.html"><FONT color=
                 "#DDDDDD" size="2">Index</FONT></A> &nbsp;|&nbsp; <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">&Uuml;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&uuml;bar auf: <A href="../../English/January2002/article224.shtml">English</a> &nbsp;<A href="../../Castellano/January2002/article224.shtml">Castellano</a> &nbsp;<A href="../../ChineseGB/January2002/article224.shtml">ChineseGB</a> &nbsp;<A href="../../Deutsch/January2002/article224.shtml">Deutsch</a> &nbsp;<A href="../../Francais/January2002/article224.shtml">Francais</a> &nbsp;<A href="../../Nederlands/January2002/article224.shtml">Nederlands</a> &nbsp;<A href="../../Portugues/January2002/article224.shtml">Portugues</a> &nbsp;<A href="../../Turkce/January2002/article224.shtml">Turkce</a> &nbsp;</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>&lt;hilaire(at)ofset.org&gt;</small>
<BR><BR>
<I>&Uuml;ber den Autor:</I><BR>
<p>Hilaire Fernandes ist Vizepr&auml;sident <a href=
    "http://www.ofset.org">OFSET</a>, einer Gesellschaft zur
    F&ouml;rderung und Entwicklung von freier Schul- und
    Lernsoftware f&uuml;r das Gnome-Projekt. Er hat ebenfalls Dr.
    Geo, eine preisgekr&ouml;nte Software f&uuml;r dynamische
    Geometrien geschrieben. Zur Zeit besch&auml;ftigt er sich mit
    Dr. Genius, einer anderen mathematischen Lernsoftware
    f&uuml;r das Gnome Projekt.</p>
<!-- TRANSLATED TO de -->
<BR><BR><I>&Uuml;bersetzt ins Deutsche von:</I><BR>
G&uuml;nther Socher <small>&lt;gsocher(at)web.de&gt;</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&auml;ndige Sourcecode</A></LI>
  <LI><A HREF="http://cgi.linuxfocus.org/cgi-bin/lftalkback?anum=224&amp;lang=en">Talkback f&uuml;r diesen Artikel</A></LI>
</UL>

</TD></TR></TABLE>
<!-- HEAD OF THE ARTICLE -->
<br>&nbsp;
<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&uuml;r Anf&auml;nger in
    der Programmierung mit Gnome und GNU/Linux geschrieben. Die
    gew&auml;hlte Programmiersprache Python ist einfach und vermeidet die
    gew&ouml;hnliche &Uuml;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">&nbsp;</A>
<H2>Was man braucht</H2>


    <p>Eine Liste der notwendigen Software zur Ausf&uuml;hrung des
    beschriebenen Programmes befindet sich im <a href="../July2000/article160.shtml">Teil I</a> dieser
    Artikelreihe.</p>

    <p>Ebenfalls ben&ouml;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">&nbsp;</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&ouml;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&auml;ftigt
    sich haupts&auml;chlich damit, diese Rahmenbedingungen
    zu erkl&auml;ren. Weitere Artikel, die sich auf diesen
    beziehen werden, f&uuml;gen noch mehr Funktionen hinzu, um die
    verschiedenen Widgets (=Elemente in einer grafischen Oberfl&auml;che, z.B. ein Knopf) von Gnome zu erkl&auml;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 &Uuml;bungen
    beziehen. Diese Beispiele und &Uuml;bungen dienen
    ausschlie&szlig;lich zu p&auml;dagogischen Zwecken, um den Umgang mit den
    Widgets zu zeigen.</p>

    <A NAME="224lfindex2">&nbsp;</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&auml;chst ein
    Fenster f&uuml;r eine  Gnome Applikation. Darin m&uuml;ssen Sie die Icons und
    Men&uuml;s l&ouml;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&auml;sst sich auch verschieben. Der linke Teil enth&auml;lt ein
    Baum Widget (<tt>GtkTree</tt>), in welchem die
    verschiedenen Abschnitte der &Uuml;bung angeordnet sind. Der
    rechte Teil ist leer und dort werden die &Uuml;bungen von dem
    Anwender dann ausgef&uuml;hrt.</p>

    <p>Glade kann das Widget Interface von <strong>Drill</strong> in
    Form eines hirarchischen Baumes darstellen. Das erleichtert das Verst&auml;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&auml;lt nur einen
    einzigen Widget, <tt>frame2</tt> (vom Typ <tt>GtkFrame</tt>),
    dieser befindet sich links. <tt>frame2</tt> enth&auml;lt den
    widget <tt>exerciceTree</tt>. Es ist vorteilhafter
    zun&auml;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 &Uuml;berschneidungen mit der
    Trennleiste verhindert.</p>

    <p>Zum Schlu&szlig; das Dialogfenster Gnome "&Agrave; 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 "&Agrave; 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&uuml;r diese Widgets, um
    diese schlie&szlig;lich unter diesen Namen unter Python zu
    ver&auml;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 &Uuml;bung
       :</b></dt>

      <dd><tt>hpanedTree</tt></dd>

      <dt><b>Baum der &Uuml;bungen  :</b></dt>

      <dd><tt>exerciceTree</tt></dd>

      <dt><b>Dialogfenster Gnome &Agrave;-propos :</b></dt>

      <dd><tt>about</tt></dd>
    </dl>

    <p>Diese widgets sind sichtbar auf der Abb. 2 bezeichnet</p>

    <p>Wir f&uuml;hren hier schnell die Bedienungsfunktionen auf.
    Falls Sie weitergehende Informationen zu diesem Thema
    ben&ouml;tigen, k&ouml;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&ouml;glich, die Geometrie der Widgets
    zu definieren. In unserem Fall k&ouml;nnen Sie die
    Gr&ouml;&szlig;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&szlig;end muss das Widget <tt>exerciceTree</tt>
    eingestellt werden, um nur eine Auswahl gleichzeitig zu
    erlauben. Nur eine &Uuml;bung
    gleichzeitig ausgew&auml;hlt werden. Von dem Fenster
    <tt>Eigenschaften</tt>, w&auml;hlt man
    <tt>Selection-&gt;Single</tt>. Die anderen Optionen von diesem
    Widget sind weniger wichtig</p>

    <p>Voil&agrave;! Was <strong>Drill</strong> betrifft, ist die Konfiguration
fertig.
    Jetzt fangen wir an, die &Uuml;bungen des
    Artikels auszuf&uuml;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&auml;ftigen.</p>

    <A NAME="224lfindex3">&nbsp;</A>
<H3>Der Code von Python</H3>


    <p>Der vollst&auml;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">&nbsp;</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">&nbsp;</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&uuml;hrt. Wir werden auf diesen
    Aspekt zur&uuml;ckkommen.</p>

    <p>Im Python Programm definieren wir die globalen Variablen
     :</p>

    <ul>
      <li><tt>currentExercice</tt>: Pointer auf das Widget, der die
      aktuelle &Uuml;bung darstellt. Dieser wird in der rechten
      Seite des Anwendungsfensterns <strong>Drill</strong>
      abgelegt. Die &Uuml;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 &Uuml;bung. Er wird auf der
      rechten Seite des Baumes gesetzt -- wo die &Uuml;bungen
      hingeh&ouml;ren -- und wir werden dort Namen
      der ausgew&auml;hlten &Uuml;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&ouml;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&auml;lfte stellt den Baum dar und die
    rechte H&auml;lfte die &Uuml;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> -- &uuml;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">&nbsp;</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&ouml;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
    &auml;hneln sich alle. Jede dieser Funktionen f&uuml;gt eine
    neue Unterkategorie (Unterbaum) ebenso wie die Titel der
    &Uuml;bung (die Items) hinzu:</p>

<p class="code">
def addMathExercices ():
<br>&nbsp;&nbsp;  subtree = addSubtree ("Math&eacute;matiques")
<br>&nbsp;&nbsp;  addExercice (subtree, "Exercice 1", "Math. Ex1")
<br>&nbsp;&nbsp;  addExercice (subtree, "Exercice 2", "Math. Ex2")
</p>

    <p><b>Der Unterbaum</b></p>

<p class="code">
def addSubtree (name):
<br>&nbsp;&nbsp;  global exerciceTree
<br>&nbsp;&nbsp;  subTree = GtkTree ()
<br>&nbsp;&nbsp;  item = GtkTreeItem (name)
<br>&nbsp;&nbsp;  exerciceTree.append (item)
<br>&nbsp;&nbsp;  item.set_subtree (subTree)
<br>&nbsp;&nbsp;  item.show ()
<br>&nbsp;&nbsp;  item.connect ("select", selectSubtree)
<br>&nbsp;&nbsp;  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&szlig;end ist das Element  an der Wurzel des Baumes
    hinzugef&uuml;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&szlig;lich ist der Event <tt>select</tt> an das
    Element anzuschlie&szlig;en. Damit wird die Funktion <tt>selectSubtree()</tt> aufgerufen
sobald ein Kathegorie ausgew&auml;hlte wird.</p>

    <p><b>GtkTreeItem</b></p>

<p class="code">
def addExercice (category, title, idValue):
<br>&nbsp;   item = GtkTreeItem (title)
<br>&nbsp;   item.set_data ("id", idValue)
<br>&nbsp;   category.append (item)
<br>&nbsp;   item.show ()
<br>&nbsp;   item.connect ("select", selectTreeItem)
<br>&nbsp;   item.connect ("deselect", deselectTreeItem)
</p>

    <p>Die Elemente tragen die gleichen Bezeichnungen wie die Namen
    der &Uuml;bungen, hier im allgemeinen nur <tt>&Uuml;bung
    1</tt>, <tt>&Uuml;bung 2</tt>, ... Bei jedem Element wird ein
    zus&auml;tzliches Attribut hinzugef&uuml;gt, <tt>id</tt>. GTK+
    bietet die M&ouml;glichkeit jedes Objekt vom Typ
    <tt>GtkObject</tt> hinzuzuf&uuml;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&uuml;ckzugreifen.
    Das Element wird anschlie&szlig;end zu seiner Kategorie
    hinzugef&uuml;gt -- einem Unterbaum. Die Methode
    <tt>show()</tt> wird aufgerufen um das element anzuzeigen.
    Anschlie&szlig;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&auml;hlt wird. Analog dazu wird die Methode
    <tt>deselectTreeItem()</tt> oder <tt>selectTreeItem()</tt> ausgef&uuml;hrt.
    </p>

    <A NAME="224lfindex7">&nbsp;</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">&nbsp;</A>
<H3>Schlusswort</H3>


    <p>Wir haben die Infrastruktur, in der wir die &Uuml;bungen
    durchf&uuml;hren, aufgebaut -- genauso wie die neu entdeckten
    Widgets. Wir haben uns haupts&auml;chlich mit dem Widget
    <tt>GtkTree</tt> besch&auml;ftigt und wie man Attribute zu den
    Widgets hinzuf&uuml;gen kann. Dieses Verfahren wird sehr oft
    benutzt, um in den Bedienungsfunktionen noch zus&auml;tzliche
    Informationen zu erhalten. Bis zum n&auml;chsten Artikel
    k&ouml;nnen Sie versuchen, das Spiel <strong>Couleur</strong>,
    womit wir uns im Teil I besch&auml;ftigt haben, als eine
    &Uuml;bung in <strong>Drill</strong> einzubauen.</p>

    <A NAME="224lfindex9">&nbsp;</A>
<H3>Anhang: Der vollst&auml;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>
    &nbsp;&nbsp;&nbsp;&nbsp;"display the about dialog"<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;about = GladeXML ("drill.glade",
    "about").get_widget ("about")<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;about.show ()<BR>
    <BR>
    def on_new_activate (obj):<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;global exerciceTree, currentExercice<BR>
    <BR>
    def selectTreeItem (item):<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;global label<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;label.set_text ("L'exercice " +<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    item.get_data ("id") + "est s&eacute;lectionn&eacute;.")<BR>
    <BR>
    def deselectTreeItem (item):<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;global label<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;label.set_text ("L'exercice " +<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    item.get_data ("id") + "est
    d&eacute;s&eacute;lectionn&eacute;.")<BR>
    <BR>
    def selectSubtree (subtree):<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;global label<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;label.set_text ("No selected exercise")<BR>
    <BR>
    def addSubtree (name):<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;global exerciceTree<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;subTree = GtkTree ()<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;item = GtkTreeItem (name)<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;exerciceTree.append (item)<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;item.set_subtree (subTree)<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;item.show ()<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;item.connect ("select", selectSubtree)<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;return subTree<BR>
    <BR>
    def addExercice (category, title, id):<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;item = GtkTreeItem (title)<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;item.set_data ("id", id)<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;category.append (item)<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;item.show ()<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;item.connect ("select", selectTreeItem)<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;item.connect ("deselect",
    deselectTreeItem)<BR>
    <BR>
    def addMathExercices ():<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;subtree = addSubtree
    ("Math&eacute;matiques")<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;addExercice (subtree, "Exercice 1", "Math.
    Ex1")<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;addExercice (subtree, "Exercice 2", "Math.
    Ex2")<BR>
    <BR>
    def addFrenchExercices ():<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;subtree = addSubtree
    ("Fran&ccedil;ais")<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;addExercice (subtree, "Exercice 1",
    "Fran&ccedil;ais Ex1")<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;addExercice (subtree, "Exercice 2",
    "Fran&ccedil;ais Ex2")<BR>
    <BR>
    def addHistoryExercices ():<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;subtree = addSubtree ("Histoire")<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;addExercice (subtree, "Exercice 1",
    "Histoire Ex1")<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;addExercice (subtree, "Exercice 2",
    "Histoire Ex2")<BR>
    <BR>
    def addGeographyExercices ():<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;subtree = addSubtree
    ("G&eacute;ographie")<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;addExercice (subtree, "Exercice 1",
    "G&eacute;ographie Ex1")<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;addExercice (subtree, "Exercice 2",
    "G&eacute;ographie Ex2")<BR>
    <BR>
    def initDrill ():<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;global exerciceTree, label<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;wTree = GladeXML ("drill.glade",
    "drillApp")<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;dic = {"on_about_activate":
    on_about_activate,<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"on_exit_activate":
    mainquit,<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"on_new_activate":
    on_new_activate}<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;wTree.signal_autoconnect (dic)<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;exerciceTree = wTree.get_widget
    ("exerciceTree")<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;# Temporary until we implement real
    exercice<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;paned = wTree.get_widget ("hpanedTree")<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;label = GtkLabel ("No selected
    exercise")<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;label.show ()<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;paned.pack2 (label)<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;# Free the GladeXML tree<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;wTree.destroy ()<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;# Add the exercices<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;addMathExercices ()<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;addFrenchExercices ()<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;addHistoryExercices ()<BR>
    &nbsp;&nbsp;&nbsp;&nbsp;addGeographyExercices ()<BR>
    <BR>
    initDrill ()<BR>
    mainloop ()</P>
  



<!-- 2pdaIgnoreStart -->
<A NAME="talkback">&nbsp;</a>
<h2>Talkback f&uuml;r diesen Artikel</h2>
Jeder Artikel hat seine eigene Seite f&uuml;r Kommentare und R&uuml;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&amp;lang=en"><b>&nbsp;Talkback Seite&nbsp;</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">&copy; 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&amp;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 &Uuml;bersetzer:</font>
<TABLE>
  <tr><td><font size="2">fr --&gt; -- : Hilaire Fernandes <small>&lt;hilaire(at)ofset.org&gt;</small></font></td></tr>
  <tr><td><font size="2">fr --&gt; de: G&uuml;nther Socher &lt;gsocher(at)web.de&gt;</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>