Programmieren für das N900 – Teil 1 Vorbereitungen und erstes Programm

Das hier wird eine kleine Reihe, in der ich zeigen möchte, wie man speziell für das N900/Maemo programmieren kann. Die grobe Planung sieht folgende Teile vor:

  1. Vorbereitungen und erstes kleines Programm
  2. Der Qt-Designer
  3. Signals and Slots
  4. ???

Die verwendete Programmiersprache ist dabei Python mit der Oberflächenbibliothek Qt.

Diese Reihe wird keine Einführung in Python werden. Grundlegende Konzepte kann man aber im guten Tutorial der Python-Homepage nachlesen.

Vorweg:
Ich selbst bin kein professioneller Programmierer und habe mir die Dinge, über die ich hier schreibe, selbst angeeignet. Insofern behaupte ich auch nicht, dass dies die optimale und einzige Möglichkeit ist und erhebe auch keinen Anspruch auf Vollständigkeit. Verbesserungen und Kommentare von erfahrenen Programmierern sind erwünscht.

Ich verwende Ubuntu, so dass die Beschreibung auch Linux-spezifisch ist. Vieles lässt sich aber 1:1 auf  andere Distributionen übertragen. Alternative Programme für Windows, soweit mir bekannt, werde ich an passender Stelle erwähnen.

Man kann alles, was ich hier schreibe übrigens auch auf einem PC direkt ausprobieren, jedoch finde ich die Möglichkeit angenehm, direkt auf dem N900 zu entwickeln und dort direkt das Programm/Layout zu testen.

Ok, los geht’s!

Zunächst muss man sich die Möglichkeit schaffen auf dem N900 als root zu agieren und von außen auf das N900 zugreifen zu können. Dazu installiert man auf dem N900 die Pakete rootsh und openssh. Mit dem aktuellen PR sollten auch die PyQt4-Bibliotheken unterstützt sein, so dass man dort keine Hand mehr anlegen muss.
Bei der Installation von openssh muss ein Passwort vergeben werden, welches man sich gut merken sollte. Sind beide Programme installiert, kann man sich testweise auf dem N900 einloggen. Dazu öffnet man auf dem PC ein Terminal (unter Windows kann man das kostenlose Programm putty verwenden) und versucht sich mit der IP des N900 zu verbinden. Die aktuelle IP erhält man, indem man z.B. auf dem N900 ein Terminal öffnet und ifconfig eingibt.

Klappt die Verbindung kann man im Dateimanager Nautilus ein Lesezeichen anlegen um zukünftige Zugriffe zu vereinfachen:

Unter Windows kann man das Programm winscp verwenden, um auf das N900 via ssh zugreifen zu können.

Danach kann man sich über das Lesezeichen von seinem PC auf das N900 einloggen und mit dem Programmieren beginnen. Dazu reicht uns ein normaler Texteditor, bei Ubuntu ist das z.B. gEdit, der auch Syntax-Highlightning bietet.

Wir erstellen im Verzeichnis /home/user/ einen neuen Ordner mit Namen minimalbeispiel und erzeugen in diesem Ordner die Datei minimal.py mit folgendem Inhalt

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# Importe
import sys
from PyQt4.QtGui import QApplication, QMainWindow

# Klasse für das Hauptfenster, abgeleitet von QMainWindow und
class Minimalbeispiel(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)  

# Starten des Programms
if __name__ == "__main__":
    # Qt-Umgebung erzeugen
    app = QApplication(sys.argv)
    # ein Objekt mit dem Namen fenster aus unserer Klasse
    # Minimalbeispiel erzeugen
    fenster = Minimalbeispiel()
    fenster.show()
    # Programmstart
    sys.exit(app.exec_())

Die Datei kann als Vorlage verwendet werden und wird im weiteren Verlauf der Reihe erweitert.

Die erste Zeile des Programms ist die sogenannte Shebang, die beim Ausführen der Datei aufgerufen wird. Die zweite Zeile bestimmt das Coding, in dem die Zeichen der Textdatei codiert sind. In unserem Fall nehmen wir UTF-8.

Alle folgenden Zeilen, die mit einer Raute beginnen, sind Kommentare, die den Programmtext erläutern sollen.

Im Folgenden teilt sich das Programm in drei Teile:

Der erste Teil sind die Importe. Dort werden schon vorhanden Module und Klassen importiert, da wir ja das Rad nicht komplett neu erfinden wollen.

Von PyQt4 importieren wir zunächst aus dem Modul QtGui, das alle Qt-Oberflächenelemente beinhaltet, die Klassen QApplication und QMainWindow. QApplication erzeugt uns eine Qt-Umgebung, in der Programme, die auf Qt beruhen, ausgeführt werden können. QMainWindow ist neben QWidget die Standardklasse, um ein Fenster zu erzeugen.

Als nächstes erzeugen wir uns eine eigene Klasse Minimalbeispiel, die von der Klasse QMainWindow abgeleitet ist, d.h. unsere Klasse Minimalbeispiel hat alle Methoden und Attribute, die auch QMainWindow hat. Wir werden diese Klasse im weiteren Verlauf dann noch mit eigenen Methoden und Attributen versehen. In der Klasse definieren wir zunächst die __init__-Methode, die in jeder Klasse vorkommt. In dieser Methode wird all das aufgerufen, was beim Erzeugen eines Objektes dieser Klasse passieren soll. Sie initialisiert sozusagen das Objekt. Bei unserem ersten Programm passiert noch nicht soviel, wir rufen einfach die __init__-Methode der Klasse QMainWindow auf.

Der letzte Teil des Programms besteht nun darin, dass wir uns aus unserer Klasse Minimalbeispiel ein Objekt erzeugen und dieses mit der Methode show() anzeigen lassen.

Die letzte Zeile startet nun die sogenannte Mainloop, d.h. das Programm durchläuft eine Endlosschleife, in der auf (noch nicht vorhandene) Events reagiert werden kann.

Nun speichert man die Datei und kann das Programm ausprobieren. Dazu öffnet man entweder auf dem N900 ein Terminal oder loggt sich via ssh von seinem Desktop-PC ein, wechselt in das Verzeichnis /home/user/minimalbeispiel und führt dort das Programm mit dem Befehl

/home/user/minimalbeispiel# python minimal.py

aus. Es erscheint zunächst folgende zunächst langweilige Anwendung:

Um den ersten Teil abzuschließen, wollen wir noch einen Text anzeigen lassen. Dazu benötigen wir ein Objekt, das Text anzeigen kann (QLabel) sowie ein Objekt, um die Schrifgröße zu verändern (QFont). Diese beiden Klassen fügen wir bei unseren Importen ein und ergänzen in unserer Klasse Minimalbeispiel die init-Methode um folgende Zeilen:

font = QFont()
font.setPointSize(100)
label = QLabel(u"Hallo N900!",self)
label.setFont(font)
label.setGeometry(80, 120, 700, 150)
label.show()

Hier wir die Textgröße auf 100 geändert und ein Label mit dem Text „Hallo N900!“ erzeugt. Dieses Label wird dann noch an eine bestimmte Position (80,120) auf dem Fenster gesetzt und erhält eine neue Größe (700 breit, 150 hoch). Zum Schluss wird wieder über die Methode show() das  label angezeigt. Das „self“ beim Erzeugen des Labels ist wichtig, da es so an das MainWindow gebunden wird. Lässt man das self weg, wird zwar auch ein Label erzeugt, allerdings verschwindet es sofort wieder, da der sogenannte Garbage Collector das Objekt wieder löscht, da es von keinem anderen Objekt referenziert wird.

Führt man jetzt das Programm aus erscheint unsere Nachricht:

So, das war es erstmal für den ersten Teil, im nächsten Teil werde ich den Qt-Designer ein wenig vorstellen und eine Oberfläche für unser Programm zusammenstellen. Insofern sind wir nicht darauf angewiesen alle Oberflächenelemente per Hand anzuordnen und das Designen der Programmoberfläche geht schneller und flexibler.

Ich freue mich über Lob und Kritik. Wenn ihr Fragen habt, stellt sie bitte in den Kommentaren.

Wenn jemand eine Idee für ein kleines Programm hat, dass ich dann in dieser Reihe entwickle, möge er sie bitte auch in den Kommentaren posten!

7 Kommentare

  1. Pingback: RADLS::eck » Blog Archive » n900 Programmieren

  2. Super Tutorial, aber sag mal: warum verwendest du nicht das nokia qt sdk?! Is das nicht so flexibel oder hast du andrer gründe?! Finde so viele möglichkeiten online, apps zumachen für das n900, aber was is der königsweg?

    Aber bitte: weitermachen!!!! Top!!!

    • Das SDK von Nokia unterstützt soweit mir bekannt nur C++ und da ich mich in python verguckt habe, benötige ich das Qt SDK nicht. Den Qt-Designer kannst du ja auch mit Python nutzen.
      Den Königsweg gibt es da mMn nicht, das hängt auch immer von den eigenen Präferenzen ab.

      • Alles klaro, C++ kenn ich von früher noch, Python macht mein dad viel damit, denke mal ich machs wie du und schnupper mal in Python rein. Kann ja nie schaden.

        Was für ein Linus system is denn derzeit stabil und kompatibel für die sachen? Ubuntu 10.1 oder was hast du?

        Danke für die rasche Antwort! *daumen hoch*

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.