Flexibel oder schnell

Zum Entwickeln von Software mit Python/Ncurses stehen unterschiedliche Wege offen; Zum einen haben Sie die Möglichkeit, die Bibliothek mit dem Python-Modul curses direkt anzusprechen. Deutlich bequemer geht das Programmieren aber mit den Python-Modulen Urwid [7] und Pythondialog [8]. Für letzteres heißt das Python-Modul dialog und stellt eine vollständige Klasse mit den benötigten Fensterwidgets bereit.

Für Oberflächen mit Newt steht zunächst das Paket python-newt bereit. Das eigentliche Modul heißt dann kurioserweise snack – nicht zu verwechseln mit dem Snack Sound Kit [9] zum Erstellen von Audioapplikationen.

Aufgrund der untschiedlichen Herangehensweisen der einzelnen Module stellt dieser Artikel zuerst das Curses-Modul und Urwid vor, die beiden sehr viel Flexibilität beim Programmieren bieten. der nächste Teil behandelt dann Python-dialog und Python-newt. Mit diesen erzielen Sie sehr schnell Ergebnisse aufgrund der vorgefertigten Elemente.

Python/Ncurses

Ncurses bietet Ihnen alle Freiheiten, um Informationen auf dem Textbildschirm an beliebiger Position auszugeben. Einfach ist es nicht, da es gilt, etliche Details beim Ansteuern des Terminals zu berücksichtigen. Einen generischen Rahmen für Python-Ncurses-Programme finden Sie in Listing 1.

Listing 1

import curses
win=curses.initscr()
curses.start_color()
curses.noecho()
curses.cbreak()
win.keypad(1)
# ... eigentliches Programm ...
win.keypad(0)
curses.echo()
curses.nocbreak()
curses.endwin()

Zunächst laden Sie in Zeile 1 das Modul und initialisieren es (Zeile 3). Über die darauf folgenden Zeilen bestimmen Sie die Terminalvariante und legen verschiedene, interne Datenstrukturen an. In der Variable win befindet sich ein Fensterobjekt, das den gesamten Terminalbildschirm repräsentiert. Alle Aktionen im Fenster – zum Beispiel das Ändern der Cursorposition, die Ausgabe oder das Löschen von Text – ermöglichen Funktionen, die zu diesem Objekt gehören.

Möchten Sie zusätzliche Farben zu verwenden, erfordert dies den Aufruf der Funktion curses.start_color() (Zeile 4). Die Funktion noecho() (Zeile 5) schaltet die direkte Ausgabe von Tastendrücken auf dem Bildschirm ab. Normalerweise werten Textprogramme die Tastendrücke erst aus und entscheiden dann, was sie auf dem Bildschirm ausgeben. Prominentes Beispiel dafür ist der Texteditor Vim, der über mehrere Aktionsmodi verfügt. Je nach aktiviertem Modus interpretiert die Software die Tasten anders.

Textterminals arbeiten normalerweise zeilenorientiert. Sie sammeln die Eingabe in einem Puffer und schicke sie erst bei Betätigen der Eingabe-Taste an die Anwendung. Um dieses Verhalten abzuschalten und alle Tastendrücke sofort zu erhalten, aktivieren Sie im Programm den Cbreak-Modus (Zeile 6).

Mit dem Einschalten des Keypad-Modus (Zeile 7) übermittelt das Modul für alle Sondertasten bereits vordefinierte Tastencodes, die das Auswerten der Tastendrücke vereinfachen, zum Beispiel curses.KEY_DOWN für die Pfeiltaste nach unten.

Um die Applikation zu beenden, genügt der Aufruf der Komplementärfunktionen (Zeilen 11 bis 13), in denen Sie auf den "buffered mode" umstellen und wieder dafür sorgen, dass das Terminal alle Zeichen direkt ausgibt. Abschließend erfolgt der Aufruf der Funktion curses.endwin() (Zeile 14), um das Terminal auf den Originalzustand zurückzusetzen (analog zur Funktion curses.initscr()).

Unsere Beispielapplikation (Abbildung 2) verfügt über eine farbige Titel- und Statuszeile und ein kleines, zweites Fenster zur Textausgabe. Auf Tastendruck ändern sich die Farbe des Textes und des Hintergrunds im kleinen Fenster.

Abbildung 2: Verschachtelte Fenster in einer Curses-Applikation.

Listing 2

# -*- coding: utf-8 -*-
import curses, traceback, string
try:    # curses initialisieren
        win=curses.initscr()
        curses.start_color()
        curses.noecho()
        curses.cbreak()
        win.keypad(1)
        # 5 Farbsets definieren
        curses.init_pair(1, curses.COLOR_WHITE, curses.COLOR_RED)
        curses.init_pair(2, curses.COLOR_WHITE, curses.COLOR_BLUE)
        curses.init_pair(3, curses.COLOR_WHITE, curses.COLOR_GREEN)
        curses.init_pair(4, curses.COLOR_WHITE, curses.COLOR_CYAN)
        curses.init_pair(5, curses.COLOR_BLACK, curses.COLOR_YELLOW)
        # Breite und Höhe des Fensters ermitteln
        (height, width) = win.getmaxyx()
        # oberste Zeile füllen: Text
        headline = " Fenster 1 (Hoehe %s, Breite %s)" % (height, width)
        headline = string.ljust(headline, width, ' ')
        win.addstr(0, 0, headline, curses.color_pair(1))
        running = 4
        while running:
                win.refresh()
                vwin = curses.newwin(7,25,5, (width - 25)/ 2)
                vwin.clear()
                # oberste Zeile von Fenster 2 füllen, Text mittig
                headline2 = string.center(" Fenster 2 ", 23, ' ')
                vwin.addstr(1, 1, headline2, curses.color_pair(5))
                vwin.addstr(3,1,"Etwas Text in einem\n separaten Fenster", curses.color_pair(running))
                vwin.box()
                vwin.refresh()
                # Statuszeile füllen, Text linksbündig
                bottomline = " Statuszeile | Durchlauf %s von %s " % (5 - running, 4)
                bottomline = string.ljust(bottomline, width, ' ')
                win.addstr(height - 5, 0, bottomline, curses.color_pair(2))
                # auf Tastendruck warten
                comm_ch = win.getch()
                running = running - 1
        win.clear()
        win.refresh()
        # Programm ohne Fehlermeldung beenden
        win.keypad(0)
        curses.echo()
        curses.nocbreak()
        curses.endwin()         # curses beenden
except:
        # Programm mit Fehlermeldung beenden
        win.keypad(0)
        curses.echo()
        curses.nocbreak()
        curses.endwin()
        traceback.print_exc()   # Fehlermeldung ausgeben

Als erstes ergänzen Sie den Programmrahmen um die Encoding-Deklaration (Zeile 1) sowie den Import der zusätzlich benötigten Python-Module traceback und string (Zeile 3). Traceback ist eine Art digitaler Hängematte – es dient zum vernünftigen Abfangen und Übermitteln auftretender Fehler im Programmablauf. Das String-Modul stellt die Funktionen für Zeichenketten bereit.

Die gesamte Applikation schließen Sie am besten in ein Try-Except-Konstrukt ein, um bei Fehlern zur Laufzeit ein möglichst sauberes Beenden des Programms zu gestatten (Zeilen 5 und 58). Die Hauptanweisungen des Programms liegen im Try-Zweig. Tritt dort ein Fehler auf, so springt das Programm in den Except-Zweig. Den Except-Zweig füllen Sie mit den gleichen Anweisungen wie zum regulären Beenden, jedoch ergänzt um die Ausgabe der Fehlermeldung (Zeile 64). Der Traceback-Aufruf zeigt uns die genaue Position im Python-Skript, an der der Fehler auftrat.

Curses biete die Möglichkeit, Farbwerte zu Paaren für den Vorder- und Hintergrund zu kombinieren. Die Zeilen 13 bis 17 definieren 5 Sets. Auf diese greifen Sie später noch zu. Jede Applikation braucht zudem Daten darüber, wie groß das Fenster ist, in dem sie agiert. Mit dem Funktionsaufruf in Zeile 20 ermitteln Sie die Breite und Höhe des Fensters, dass heißt, wieviele Zeilen und Spalten das Terminal bereitstellt.

Die Zeilen 23 und 24 sorgen dafür, dass der Text für die Titelzeile linksbündig ausgerichtet auf dem Bildschirm erscheint. Der Einfachheit halber enthält Text nur die Höhe und Breite des Fensters. Zeile 25 veranlasst das Hinzufügen des Textes zum ausgewählten Fenster, beginnend an der angegebenen Position. Die Werte 0, 0 bezeichnen die obere, linke Ecke des Fensters. Der vierte Parameter im Funktionsaufruf wählt das erste, von uns bereits vorher definierte Farbset aus (weiße Schrift auf rotem Hintergrund).

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

Kommentare

Infos zur Publikation

LU 12/2017: Perfekte Videos

Digitale Ausgabe: Preis € 5,95
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Stellenmarkt

Aktuelle Fragen

Huawei
Pit Hampelmann, 13.12.2017 11:35, 2 Antworten
Welches Smartphone ist für euch momentan das beste? Sehe ja die Huawei gerade ganz weit vorne. Bi...
Fernstudium Informatik
Joe Cole, 12.12.2017 10:36, 2 Antworten
Hallo! habe früher als ich 13 Jahre angefangen mit HTML und später Java zu programmieren. Weit...
Installation Linux mint auf stick
Reiner Schulz, 10.12.2017 17:34, 3 Antworten
Hallo, ich hab ein ISO-image mit Linux Mint auf einem Stick untergebracht Jetzt kann ich auch...
Canon Maxify 2750 oder ähnlicher Drucker
Hannes Richert, 05.12.2017 20:14, 4 Antworten
Hallo, leider hat Canon mich weiterverwiesen, weil sie Linux nicht supporten.. deshalb hier die...
Ubuntu Server
Steffen Seidler, 05.12.2017 12:10, 1 Antworten
Hallo! Hat jemand eine gute Anleitung für mich, wie ich Ubuntu Server einrichte? Habe bisher...