KDE-Hintergrund mit SuperKaramba und Python aufwerten

Aus LinuxUser 03/2004

KDE-Hintergrund mit SuperKaramba und Python aufwerten

Die Schlange macht Karamba

SuperKaramba sorgt dafür, dass sogar der KDE-Hintergrund etwas Nützliches tut. Was das ist, können Sie selbst programmieren – mit Python.

Wenn Ihr KDE-Hintergrund dank SuperKaramba [2] bereits als Uhr und MP3-Spieler fungiert [1], kommt schnell der Wunsch nach mehr auf: Tatsächlich lassen sich SuperKaramba-Themes mit Hilfe der Programmiersprache Python [3] um weitreichende interaktive Features aufwerten. So gibt es die Möglichkeit, Menüs zu erzeugen, Texte dynamisch zu ändern und die Themes sogar mit “Drag & Drop”-Unterstützung auszustatten.

Die grundlegende Idee dahinter: Wenn in KDE Ereignisse auftreten (z. B. die Maus bewegt, ein neues Programm gestartet oder ein Menüpunkt ausgewählt wird), sendet das entsprechende Programm Signale aus, auf die speziell ausgestattete Funktionen reagieren und so dafür sorgen, dass etwas geschieht. Auch SuperKaramba bekommt derartige “events” mit. Die möglichen Reaktionen definiert die SuperKaramba-Python-API, deren Funktionen [5] detailliert erläutert.

Tabelle 1: SuperKarambas Signalfühler

Funktion Wann ausgeführt?
initWidget(widget) Beim Erzeugen des SuperKaramba-Widgets.
widgetUpdated(widget) Wenn das Theme aktualisiert wird. Das Aktualisierungsintervall legt die .theme-Datei fest.
widgetClicked(widget, x, y, button) Bei einem Mausklick innerhalb des Themes. x und y geben an, auf welche Koordinaten (relativ zum Theme) geklickt wurde. button verrät die benutzte Maustaste.
widgetMouseMoved(widget, x, y, button) Bei Mausbewegung innerhalb des Themes. x und y bezeichnen die aktuellen Koordinaten (relativ zum Theme); button enthält die Nummer des gegebenenfalls gedrückt gehaltenen Mausknopfs.
menuItemClicked(widget, menu, id) Beim Anklicken eines Menüpunkts. Übergeben wird das Handle des Menüs (siehe Text) sowie das des angeklickten Menüpunkts (id).
menuOptionChanged(widget, key, value) Beim Aufrufen eines Punkts im Theme-Konfigurationsmenü. key enthält das Handle des Menüpunkts und value den neuen Wert (true oder false, also ja oder nein).
meterClicked(widget, meter, button) Beim Anklicken eines Anzeigegeräts. meter enthält dessen Handle, button die Nummer des benutzten Mausknopfs.
commandOutput(widget, pid, output) Bei Programmaufrufen mittels executeInteractive(), sofern dabei etwas auf stdout geschrieben wurde. pid ist die Prozess-ID des Programms, output enthält dessen Ausgabetext.
itemDropped(widget, dropText) Wenn Objekte (z. B. Icons) bei “Drag & Drop”-Aktionen auf das Theme “fallen”. dropText enthält einen Text zu diesem Objekt (z. B. dessen URL, siehe Abschnitt “Ziehen und fallen lassen”).
startupAdded(widget, startup) Wenn KDE eine neue Applikation startet. Ist das Startprozedere beendet, folgt das Signal startupRemoved(), dem seinerseits taskAdded() folgt.
startupRemoved(widget, startup) Siehe startupAdded().
taskAdded(widget, task) Siehe startupAdded().
taskRemoved(widget, task) Wenn ein Programm beendet wurde.
activeTaskChanged(widget, task) Wenn eine andere Applikation in den Vordergrund geholt wird.

Schlangenbändiger

Um bestehende Themes wie das in [1] erzeugte mit Python durch weitere Funktionalität aufzuwerten, müssen wir keine Änderungen am bisherigen Code vornehmen, sondern ergänzen das Theme einfach um eine zusätzliche Datei im Theme-Verzeichnis, die denselben Namen wie das Theme trägt und auf die Endung .py endet. Die SuperKaramba-Entwickler empfehlen, mit einer Vorlage [6] zu beginnen und diese anzupassen. Eine Version mit deutsche Kommentaren steht unter [7] zum Download bereit, das Beispiel-Theme unter [4].

Entpacken Sie letzteres mit

tar -C ~/.superkaramba -xjvf small_text_xmms.tar.bz2

im (ggf. neu anzulegenden) Verzeichnis ~/.superkaramba. Dabei entsteht das Theme-Verzeichnis small_text_xmms, in das Sie die Vorlage template_deutsch.py (bzw. template.py, wenn Sie das englische Original bevorzugen) hineinkopieren. Dabei muss sie noch den richtigen Namen bekommen:

cp template_deutsch.py ~/.superkaramba/small_text_xmms/small_text_xmms.py

Öffnet man die Theme-Datei small_text_xmms.theme nun über den Open…-Dialog im SuperKaramba-Hauptfenster, wird der Python-Quellcode automatisch in Python-Bytecode (siehe Kasten 1) übersetzt. (Sollte der Dateiauswahldialog das versteckte Verzeichnis .superkaramba nicht anzeigen, drücken Sie [F8].) Da dieser Kompiliervorgang Fehler- und Debug-Informationen auf dem Standardausgabekanal ausgibt, empfiehlt es sich, SuperKaramba manuell mit dem Befehl superkaramba (ggf. mit zusätzlicher Pfadangabe) in einem X-Terminal (z. B. konsole) zu starten.

Beispielsweise signalisiert der Hinweis Meine Python-Erweiterung wurde soeben geladen!, den der print-Befehl

print "Meine Python-Erweiterung wurde soeben geladen!"

in der letzten Zeile der Vorlage erzeugt, dass die Python-Datei korrekt übersetzt wurde.

Leider klappte dies bei der vom Autor verwendeten Suse-9-Installation nicht von vornherein: Offensichtlich setzt die Distribution einige von Python verwendete Umgebungsvariablen nicht korrekt. Abhilfe schaffen hier die beiden folgenden Befehle in der konsole, aus der SuperKaramba gestartet werden soll:

export PYTHONPATH=/usr/lib/python2.3/
export PYTHONHOME=/usr/lib/python2.3/

Ziehen und fallen lassen

Als erste Erweiterung soll das in [1] beschriebene Beispiel-Theme Drag & Drop für .mp3-Dateien hinzubekommen, damit man sie aus dem Konqueror mit der Maus auf den integrierten MP3-Player ziehen kann. Augenblicklich soll XMMS sie abspielen.

Die Lösung dieser Aufgabe zeigt Listing 1, das sich in Gestalt der Datei dragdrop.py auch auf der Heft-CD befindet. Wer sie nicht selbst aus der Vorlagedatei entwickeln will, überschreibt small_text_xmms.py einfach damit.

Damit SuperKaramba-Themes Drag & Drop unterstützen, bedarf es entsprechender Initialisierung. Das geschieht am besten beim Erzeugen des SuperKaramba-Widgets. Dabei wird ein entsprechendes Signal ausgesendet, auf das SuperKaramba mit einem “Fühler”, der sogenannten Callback-Funktion initWidget(), reagiert. Mit

def initWidget(widget):

sagen wir, das wir in der Zeile darunter definieren wollen, was zu tun ist, wenn das Theme auf dem Desktop-Hintergrund erscheint:

karamba.acceptDrops(widget)

Das Widget soll Drop-Ereignisse akzeptieren.

Auf ein solches reagiert SuperKaramba mit itemDropped(). Diese Funktion erhält vom Drop-Signal, wie Tabelle 1 zeigt, zwei Informationen: einen Zeiger auf das betroffende Widget und – im Falle von Dateien – eine mehrzeilige Liste der betroffenen Dateinamen in der Variablen dropText, eine Datei pro Zeile.

Leider steht vor diesen Dateinamen jeweils noch das Stichwort file:. Da XMMS nicht mit ganzen URLs vom Typ file:/pfad/zu/datei.mp3, sondern nur mit Filenamen wie /pfad/zu/datei.mp3 hantiert, müssen wir den Inhalt von dropText etwas verändern, bevor wir ihn an den Mediaplayer übergeben können.

Umbauaktion

Die dazu nötigen Manipulationsfunktionen für Zeichenketten [8] holen wir uns mit import string hinzu. Mit xmms_dateinamen="" definieren wir zunächst eine leere Variable, in der wir später die korrigierte Dateinamensliste ablegen. Dann zerlegen wir die URL-Liste aus dropText mit der Funktion string.split() in einzelne URLs:

string.split(string.rstrip(str(dropText)),"\n")

Als Trennzeichen dient dabei der Zeilenumbruch \n (“newline”). Die innerste Funktion str() sorgt dafür, dass der Inhalt von dropText als Zeichenkette behandelt wird, während string.rstrip() vorsichtshalber Sonderzeichen am rechten Ende entfernt.

Nun, da wir es mit einzelnen URLs zu tun haben, können wir sie in einer for-Schleife vom Präfix file: befreien. Eine nach der anderen schreiben wir in die Variable dateiname und entfernen mit

string.split(dateiname, "file:", 1)

jeweils das führende file: vor dem Dateinamen. Genaugenommen teilen wir den Inhalt von dateiname beim ersten (1) Vorkommen des Trennworts file: in zwei Teile. Ohne diese Einschränkung würden MP3-Dateien, deren Dateiname den String file: enthält, weiter zerhackt. Das Ergebnis ist eine Liste aus zwei Einträgen. die wir in einer anderen Hilfsvariablen namens temp ablegen. Deren erstes Element, temp[0], enthält nach der Aufsplittaktion nur eine leere Zeichenkette.

Bei jedem Schleifendurchlauf hängen wir den so erhaltenen Dateinamen an den alten Inhalt der Variablen xmms_dateinamen an. Da er als zweites Element in der Liste temp steht, greifen wir ihn uns mit temp[1] heraus:

xmms_dateinamen=xmms_dateinamen + " \"" + string.rstrip(temp[1]) + "\""

Damit XMMS MP3s mit Leerzeichen im Dateinamen abspielt, müssen diese in Hochkommata eingeschlossen werden. Weil <CI>” auch in Python die Sonderbedeutung hat, Zeichenketten zu begrenzen, kommt die recht komplizierte Schreibweise “\”” zum Einsatz: Beim tatsächlich in xmms_dateinamen abzulegenden Hochkomma sagt das vorangestellte \: In diesem Fall ist ” buchstäblich gemeint.

Steht die Dateiliste in xmms_dateinamen, sorgt

karamba.execute("xmms" + xmms_dateinamen)

dafür, dass XMMS mitsamt den Dateinamen der “gedroppten” MP3-Dateien aufgerufen wird.

Listing 1

Das Theme unterstützt Drag & Drop

import karamba
import string
def initWidget(widget):
    karamba.acceptDrops(widget)
def itemDropped(widget, dropText):
    xmms_dateinamen=""
    for dateiname in string.split(string.rstrip(str(dropText)),"\n"):
        temp=string.split(dateiname, "file:", 1)
        xmms_dateinamen=xmms_dateinamen + " \"" + string.rstrip(temp[1]) + "\""
    karamba.execute("xmms" + xmms_dateinamen)
print "Meine Python-Erweiterung wurde soeben geladen!"

Bitte das Menü!

Eine andere Möglichkeit, ein Theme aufzuwerten, besteht darin, ihm über das generische Kontextmenü der rechten Maustaste hinaus ein weiteres Menü mitzugeben. So zum Beispiel ein “Startmenü”, das sich auf Doppelklick des linken oder mittleren Mausbuttons öffnet und den Start externer Applikationen ermöglicht. Da wir hierfür nicht endlos viele anklickbare Bereiche in der .theme-Datei definieren wollen, benutzen wir die Python-API.

Zum schnellen Ausprobieren ersetzen Sie den Inhalt der Datei ~/.superkaramba/small_text_xmms/small_text_xmms.py durch den aus Listing 2 (menus.py auf der Heft-CD). Professionelle Programmierer mögen den Kunstgriff mit den beiden globalen Variablenauswahlmenu und mein_menu verzeihen, der hier der Einfachheit halber zum Zuge kommt.

auswahlmenu, vorerst mit 0 initialisiert, wird später die Objekt-ID des Menüs repräsentieren; mein_menu=[[],[]] erzeugt eine Speicherstruktur, in der mehrere zwei-elementige Listen Platz finden. Sie dient später dazu, die Menüpunkte innerhalb des Python-Programms und die ihnen zugewiesenen IDs einander zuzuordnen.

Als Reaktion darauf, dass sich das Theme-Fenster öffnet, stattet initWidget() das Theme mit einem Menü aus:

auswahlmenu=karamba.createMenu(widget)

Dessen vom System vergebene, interne Nummer nimmt die globale Variable auswahlmenu auf. Man spricht hierbei von einem Handle, da diese Zahl zur internen Identifikation des Menüs benutzt wird. Das folgende, etwas längere Konstrukt legt in mein_menu ein Menü mit zwei Menüpunkten ab. Der erste …

karamba.addMenuItem(widget, auswahlmenu, "konqueror", "konqueror.png")

… erzeugt einen Eintrag mit der Bezeichnung konqueror im auswahlmenu. Das Icon konqueror.png, welches sich ebenfalls im Theme-Verzeichnis befinden muss, ergänzt den Menüpunkt. Der zweite addMenuItem()-Aufruf tut dasselbe für einen Eintrag mit der Aufschrift opera:

karamba.addMenuItem(widget, auswahlmenu, "opera", "opera.png")

Noch versteckt sich dahinter keine Funktionalität. Damit sich die dem jeweils passenden Menüpunkt zuordnen lässt, brauchen wir eine Unterscheidungsmöglichkeit für jeden Punkt. Diese (konqueror bzw. opera) legen wir zusammen mit dem beim addMenuItem()-Aufruf erzeugten Handle in mein_menu ab. Der Inhalt der Variablen sieht anschließend je nach vergebenen Handles folgendermaßen aus:

(['konqueror', -22], ['opera', -23])

Damit ist das Menü zwar da, wird aber – natürlich – nicht gleich angezeigt, sondern erst, wenn der User innerhalb des SuperKaramba-Themes doppelt mit der Maus klickt; anders ausgedrückt: wenn ein auf widgetClicked(widget, x, y, button) passendes Signal “ertönt”.

Dann werten wir die xy-Koordinaten und die Mausknopfnummer in button zwar nicht weiter aus, doch wenn wir es täten, könnten wir unterschiedliche Bereiche innerhalb des Themes unterschiedlich behandeln oder aber zwischen linker und mittlerer Maustaste unterscheiden. Die rechte Maustaste lässt sich zwar auch belegen, doch da ein Rechtsklick auf ein SuperKaramba-Theme das SuperKaramba-Menü öffnet, besteht diese Möglichkeit nur theoretisch.

Zu beachten gilt es zudem, dass Mausklicks immer auch die in der .theme-Datei angegebenen Aktivitäten auslösen. In unserem Fall heißt das, dass ein Klick auf die Uhr sowohl das Uhrzeiteinstellungstool als auch das Menü öffnet (Abbildung 1).

Damit letzteres auf dem Bildschirm erscheint, benötigen wir das entsprechende Handle, welches in der Variable auswahlmenu lagert. Diese holen wir uns mittels global auswahlmenu aus dem globalen Datenraum. Anschließend sorgt die Funktion karamba.popupMenu(widget, auswahlmenu, x, y) dafür, dass das Menü an derselben Stelle (x, y) geöffnet wird, an der der Klick erfolgte. Fehlt diese Koordinatenangabe, öffnet sich das Menü in der linken oberen Ecke (0,0) des Themes.

Abbildung 1: Python sorgt für Menüs.

Abbildung 1: Python sorgt für Menüs.

Wählt der User einen Menüpunkt aus, reagiert SuperKaramba mit menuItemClicked(widget, menu, id). Diese Funktion verrät mit id nicht nur das Handle des Menüeintrags, sondern mit menu auch das passende Menü. Da das System die Handles nach “Gutdünken” vergibt, lassen sie sich schlecht erraten, doch wir haben vorgesorgt und sie in der globalen Variable mein_menu (für die Menüpunkte) und auswahlmenü (für’s Menü) gesichert. Da wir nur ein Menü haben, müssen wir uns diesbezüglich um Unterscheidung nicht kümmern. Folglich brauchen wir nur main_menu aus dem globalen Datenraum.

Mit for index in mein_menu: durchlaufen wir alle Elemente der Variablen mein_menu und weisen die darin enthaltenen Listen der Reihe nach der Laufvariablen index zu. Bei jedem Schleifendurchgang prüfen wir, ob das vom Signal übergebene Menüpunkt-Handle dem Zahlenwert entspricht, der jeweils an zweiter Stelle in index steht:

if index[1] == id:

Haben wir dasjenige Duo aus mein_menu gefunden, das den angeklickten Menüpunkt repräsentiert, prüfen wir, zu welchem Browser-Eintrag er gehört. Ist es der Konqueror …

if index[0] == 'konqueror':

…, startet dieser mit karamba.execute("konqueror"); stimmt das nicht, schauen wir mit

elif index[0] == 'opera':

nach, ob Opera angeklickt wurde.

Listing 2

Interaktion über Menüs

import karamba
auswahlmenu=0
mein_menu=[[],[]]
def initWidget(widget):
    global auswahlmenu
    global mein_menu
    auswahlmenu=karamba.createMenu(widget)
    mein_menu=[
    "konqueror", karamba.addMenuItem(widget, auswahlmenu, "konqueror", "konqueror.png")],
    ["opera", karamba.addMenuItem(widget, auswahlmenu, "opera", "opera.png")]
def widgetClicked(widget, x, y, button):
    global auswahlmenu
    karamba.popupMenu(widget, auswahlmenu, x, y)
def menuItemClicked(widget, menu, id):
    global mein_menu
    for index in mein_menu:
        if index[1] == id:
            if index[0] == 'konqueror':
                karamba.execute("konqueror")
            elif index[0] == 'opera':
                karamba.execute("opera")
print "Meine Python-Erweiterung wurde soeben geladen!"
            @KE:

Beim Zusammenfügen der Funktionalität aus Listing 1 und 2 zu einer gemeinsamen Datei fallen ein paar Zeilen weg: So braucht man selbstverständlich nur ein import karamba am Anfang und eine print-Zeile am Ende. Zudem gilt es, die Inhalte der beiden “def initWidget(widget):“-Blöcke zu einem zusammenzufassen. Fehlt nach dem anschließenden Neuladen des Themes trotzdem eine der beiden Funktionalitäten, löschen Sie die automatisch angelegte .pyc-Datei im Theme-Verzeichnis. Die komplette Python-Datei small_text_xmms.py finden Sie auf der Heft-CD.

Die Grenzen des Schlangenreviers

So sehr die Einfachheit begeistert, mit der sich komplexe Aufgaben wie Drag & Drop in SuperKaramba lösen lassen – die Python-API weist neben zahlreichen weiteren Funktionen, die [5] dokumentiert, auch einige Unzulänglichkeiten auf. Das wohl größte Manko: Sensoren (siehe [1]) lassen sich nicht dynamisch erzeugen. Wollten wir in unser Theme ein Feature zum Umschalten zwischen verschiedenen Sensoren einbauen, könnten wir zwar Texte per Mausklick mit neuem Inhalt füllen, die dazugehörige Sensoranzeige jedoch nicht austauschen.

Dabei tritt ein weiteres Problem auf: Python vermag nur auf Elemente zuzugreifen, die auch mit Python erzeugt wurden. Soll ein Textelement als Umschalter dienen, muss es daher mit der Python-Funktion createText() erstellt worden sein. Texte, die die .theme-Datei definiert, kann die Python-API nicht manipulieren.

Kasten 1: Was ist Python?

Wer andere Programmiersprachen bevorzugt, mag sich darüber ärgern, extra für SuperKaramba eine weitere neu lernen zu sollen. Doch für Programmiernovizen hat Python als universell einsetzbare Sprache durchaus seinen Reiz. Dies liegt nicht zuletzt daran, dass Python drei wesentliche Programmierparadigmen in sich vereinigt: Python lässt sich objektorientiert einsetzen wie C++ oder Java, prozedural wie Pascal oder C und ist gleichzeitig eine Skriptsprache wie PHP oder Perl, die auf einen separaten, vom User extra anzustoßenden Kompiliervorgang verzichtet. Sie unterstützt u. a. Mehrfachvererbung, kann mit Datenbanken gekoppelt werden, auf Netz-Protokolle zugreifen und multithreaded programmiert werden.

Ähnlich wie Java wird Python-Quellcode zuerst mittels eines Compilers in sogenannten Bytecode überführt, den man im SuperKaramba-Theme-Verzeichnis in einer automatisch erzeugten Datei mit der Namensendung .pyc vorfindet. Diesen führt eine virtuelle Maschine dann aus. Verglichen mit Java-Bytecode geht das bei Python aber wesentlich schneller.

Wenn man von einer anderen Programmiersprache zu Python wechselt, muss man sich zunächst an eines gewöhnen: an die Definition zusammenhängender Blöcke. Einen solchen Block bilden zum Beispiel Anweisungen, die ausgeführt werden, wenn eine Bedingung erfüllt ist. In C setzt man diese in geschweifte Klammern, bei der Shell-Programmierung mit der Bash endet der Anweisungsblock einer if-then-Anweisung mit fi, und in Pascal kommen die Stichwörter begin und end zum Einsatz. Python nutzt überhaupt nichts davon: an Stelle einer separaten Markierung rückt man zu einem Block gehörende Anweisungen gemeinsam ein.

Zwei aufeinanderfolgende Zeilen mit derselben Einrückungstiefe gehören also zu einem Block; beginnt hingegen die zweite Zeile einige Leerzeichen weiter links als die erste, gehört sie nicht mehr dazu. Eine neue Ebene beginnt jeweils nach einem Doppelpunkt, wie die Listings zeigen: Alle gleich weit eingerückten Anweisungen im Anschluss an eine def-Zeile gehören zur Definition dieser Funktion.

Dummerweise fordert Python wenigstens eine Funktion pro Ebene. Daher steht in der Vorlagedatei an Stelle eines “leeren” Blocks die Funktion pass. Sie macht bei der Ausführung des Programms einfach nichts und dient lediglich als Platzhalter, damit die entsprechende Ebene in der richtigen Einrücktiefe besetzt ist.

Der Trick mit den Einrückungen sorgt einerseits dafür, dass Python-Code immer gut strukturiert aussieht und somit – im Gegensatz zu diversem Code in anderen Programmiersprachen – übersichtlich und leicht lesbar ist. Er kann aber gerade bei den ersten Schritten zu Verzweiflung führen, weil eine Funktion durch falsche Einrückungstiefe plötzlich nicht mehr zum gewünschten Block gehört. Achten Sie daher beim Nachprogrammieren der Beispiele und beim Entwerfen eigener Erweiterungen stets darauf, dass Sie Ihre Anweisungen korrekt einrücken!

Der Autor

Hagen Höpfner ist wissenschaftlicher Mitarbeiter am Institut für Technische und Betriebliche Informationssysteme der Fakultät für Informatik an der Otto-von-Guericke-Universität Magdeburg. Was er dort so alles treibt, kann http://wwwiti.cs.uni-magdeburg.de/~hoepfner/ entnommen werden. In seiner Freizeit spielt der begeisterte Vater Gitarre in der Rockband “Gute Frage” (http://www.gutefrage.de/).

Glossar

API

Eine Anwendungsprogrammschnittstelle (engl.: Application Programming Interface) definiert eine Menge von Funktionen innerhalb einer Software, die von anderen, in einer vorgegebenen Programmiersprache geschriebenen Programmen aufgerufen werden können. In unserem Fall dürfen in Python geschriebene Applikationen Funktionen benutzen, die in SuperKaramba implementiert sind.

stdout

Der Standardausgabe-Kanal legt fest, wo Linux-Applikationen ihre Textausgabe hinsenden. Typischerweise geht die auf dem Bildschirm. Man kann sie aber beispielsweise auch in eine Datei umleiten oder einem Drucker übergeben. Linux bietet neben Stdout noch einen Stderror-Kanal für die Fehlerausgabe, der ebenfalls mit dem Bildschirm gekoppelt ist, und den Stdin-Kanal für die Eingabe, der diese standardmäßig über die Tastatur entgegennimmt.

Widget

Sammelbegriff für alle Bedienelemente einer grafischen Oberfläche. Umfasst u. a. Fenster, Knöpfe, Menüs, Checklisten und Karteireiter.

globalen Variablen

Im objektorientierten Programmierparadigma werden Funktionen und Variablen klassischerweise in Objekten gekapselt. Fasst man beispielsweise die Eigenschaft “Farbe eines Knopfes” als Variable auf, so kann man auf diese Weise recht einfach mehrere Knöpfe mit unterschiedlichen Farben erzeugen, da die Variable direkt im Objekt “Knopf” gespeichert wird. Globale Variablen gelten hingegen programmweit. Legt man die Knopffarbe global mit Grün fest, sind alle anschließend erzeugten Knöpfe grün.

multithreaded

Normalerweise kann ein Programm immer nur eine Aufgabe zur Zeit lösen. Muss es beispielsweise darauf warten, dass eine Datei geöffnet wird, kann es nichts anderes tun. Threads (englisch für “Fäden”) erlauben es, mehrere Aufgaben nebeneinander abzuarbeiten. Statt auf die zu öffnende Datei tatenlos zu warten, arbeitet multithreaded programmierte Software in der Zeit an einem anderen Thread weiter.

Infos

[1] SuperKaramba-Einführung: Hagen Höpfner, “Karamba auf dem Desktop”, Linux User 12/2003, S. 56 ff., http://www.linux-user.de/ausgabe/2003/12/056-superkaramba/

[2] SuperKaramba: http://netdragon.sourceforge.net/

[3] Erste Schritte mit Python: http://www.python.org/doc/Intros.html

[4] Beispiel-Theme: http://wwwiti.cs.uni-magdeburg.de/~hoepfner/download.html

[5] SuperKaramba-Python-API-Dokumentation: http://netdragon.sourceforge.net/api.html

[6] SuperKaramba-Python-Vorlage: http://netdragon.sourceforge.net/template.py

[7] Deutsche SuperKaramba-Python-Vorlage: http://wwwiti.cs.uni-magdeburg.de/~hoepfner/download/template_deutsch.py

[8] Python-Funktionen zur Bearbeitung von Zeichenketten: http://www.python.org/doc/2.3.3/lib/module-string.html

[9] Schleifen und Bedingungen in Python: http://www.python.org/doc/2.3.3/ref/compound.html

[10] Python Library Reference: http://www.python.org/doc/2.3.3/lib/lib.html

LinuxUser 03/2004 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben