PiMenu: Bedienoberfläche für LCD-Touchscreens

© Sarah Holmlund, 123RF

Neues Gesicht

Mit PiMenu erstellen Sie im Handumdrehen eine menügeführte Benutzeroberfläche, die sich ideal für kleinformatige LCD-Touchscreens eignet.

README

Wenn Sie einen RasPi mit Touchscreen ihr Eigen nennen, kann Ihnen PiMenu in vieler Hinsicht das Leben leichter machen. Damit erstellen Sie mit wenigen Handgriffen eine schicke, auf Kacheln basierende Menüführung für beliebige Einsatzzwecke.

Den Raspberry Pi mit einem kleinen Touchscreen zu kombinieren drängt sich auf den ersten Blick geradezu auf – bis man dann in der Praxis feststellt, dass die Desktops der typischen RasPi-Distributionen sich nur sehr bedingt für solch kleine Bildschirme eignen. Aufruf und Bedienung der Programme und insbesondere Eingaben geraten auf den zwergenhaften Displays zum Geduldsspiel. Andererseits erscheint es als Overkill, ein eigenes maßgeschneidertes grafisches Interface für den Touch-Bildschirm aufzusetzen.

Hier kommt PiMenu [1] ins Spiel: Die in Python und TkInter geschriebene Lösung erlaubt, mit minimalem Aufwand kachelbasierte Bildschirmmenüs zu definieren. Sie stammt aus der Feder des deutschen Programmierers Andreas Gohr, der auch das bekannte DokuWiki entwickelt hat. Ursprünglich für Gohrs Projekt Paper Backup [2] konzipiert, lässt sich die vielseitige Software recht einfach auch für andere Projekte adaptieren, die eine einfach zu bedienende grafische Benutzerschnittstelle benötigen.

Noch besser: PiMenu basiert auf Komponenten, die Raspbian großteils bereits vorinstalliert mitbringt. Sie müssen lediglich mit den ersten beiden Zeilen aus Listing 1 noch das Paket python-yaml nachziehen, um PiMenu auf dem RasPi zum Laufen zu bringen. Dann laden Sie die aktuelle Version von PiMenu aus dem Github-Repository des Projekts herunter, entweder als ZIP-Archiv oder – sofern Git auf dem RasPi eingerichtet ist – über das Kommando aus der letzten Zeile von Listing 1.

Listing 1

 

$ sudo apt-get update
$ sudo apt-get install python-yaml
$ git clone https://github.com/splitbrain/pimenu.git

Touchscreens für den Raspberry Pi

Der Zubehörmarkt offeriert eine ganze Reihe von LCD-Touchscreens, die sich für den Raspberry Pi eignen. Zu den speziell für den RasPi entwickelten Modellen zählt beispielsweise das PiTFT-Panel [3] von Adafruit, für das in Form des PiTFT Pibow [4] auch ein schickes Gehäuse zur Verfügung steht. Eine umfangreiche (allerdings englischsprachige) Dokumentation dazu findet sich auf der Hersteller-Webseite [5].

Einen guten Kandidaten gibt außerdem das RPI-Display von Watterott [6] ab, für das der Hersteller auch ein Tek-Berry-Gehäuse mit passendem Ausschnitt offeriert [7]. Für die Software zum RPi-Display – dazu zählt auch ein vorbereitetes SD-Card-Images – gibt es ein eigenes GitHub-Repository [8].

Alternativ können Sie auch auf Ebay nach entsprechenden Displays Ausschau halten – achten Sie aber darauf, dass für diese eine geeignete Software zur Verfügung steht.

PiMenu umfasst drei Schlüsselkomponenten: Das Python-Skript pimenu.py zeichnet das grafische Interface, die Konfigurationsdatei pimenu.yaml definiert die Menüpunkte dazu. Das Bash-Skript pimenu.sh schließlich setzt die vom Python-Skript zurückgegebenen Benutzereingaben in Aktionen um.

Für jeden in der Konfigurationsdatei vorgegebenen Menüpunkt zeichnet PiMenu eine Kachel, die das Hauptskript dann in das Anzeigefenster einpasst. Das Ergebnis sieht zwar ein wenig nach Windows 8 aus, funktioniert dafür aber auf einem RasPi-Touchscreen bestens, selbst für Benutzer mit Wurstfingern. Hinsichtlich der Komplexität der Benutzerführung setzt Ihnen PiMenu kaum Grenzen, denn in pimenu.yaml dürfen Sie mehrere Ebenen von Menüpunkten und damit recht komplexe Strukturen definieren.

PiMenu im Einsatz

Der Autor ist des Öfteren unterwegs und fotografiert auf Reisen viel. So entstand die Idee zu einer RasPi-basierten Backup-Box für die entstandenen Schnappschüsse. Hier erwies sich PiMenu als idealer Baustein, um das Gedankenspiel in die Praxis umzusetzen. Die Pi-Backup-Box soll Fotos direkt von der Kamera oder von einem Kartenleser holen und sie dann auf ein USB-Speichermedium übertragen.

Als ersten Schritt zur Umsetzung gilt es, zunächst einmal die benötigten Menüpunkte in die Konfigurationsdatei pimenu.yaml zu integrieren (Listing 2). Jeder Menüpunkt darin hat vier Eigenschaften: eine Bezeichnung (name) und ein Label (label) sowie optional eine Kachelfarbe (color) und ein Icon (icon). Der Name des Letzteren verweist auf ein gleichnamiges GIF im Verzeichnis ico, in unserem Beispiel also ico: "menu", also auf das Bild ico/menu.gif.

Über die zusätzliche Eigenschaft items verweisen Sie gegebenenfalls auf Punkte in Untermenüs. In unserem Beispiel enthält Menu die drei Unterpunkte Camera, USB und Backup. Achten Sie darauf, die Punkte in den Menüs und Untermenüs sorgfältig über Leerzeichen einzurücken – Tabulatoren funktionieren hier nicht – und durch ein Minuszeichen als Separator zu trennen.

Listing 2

 

# Menu configuration
---
-
    name: "Menu"
    label: "Menu"
    color: "#FF851B"
    icon: "menu"
    items:
    -
        name : "Camera"
        label: "Camera"
        color: "#3D9970"
        icon : "camera"
    -
        name : "USB"
        label: "USB"
        color: "#39CCCC"
        icon : "usb"
    -
        name : "Backup"
        label: "Backup"
        color: "#7FDBFF"
        icon : "backup"
-
    name: "Exit"
    label: "Exit"
    color: "#85144B"
    icon: "exit"

Das Python-Skript pimenu.py bringt zum einen anhand der Strukturinformationen aus pimenu.yaml die Menükacheln auf den Bildschirm. Zum anderen registriert es das Antippen der Kacheln und ruft dann das Shell-Skript pimenu.sh auf, in dem Sie anhand des Namens der gewählten Kachel die zugehörigen Aktionen festlegen. Dazu richten Sie das Shell-Skript so ein, dass es diesen Namen über eine Case-Anweisung auswertet.

Dazu lesen Sie den Namen mittels des Befehls echo "$*" ein. Der liefert allerdings den kompletten Menüpfad als Zeichenkette zurück, wenn die angetippte Kachel am Ende einer Menüstruktur steht. Drücken Sie beispielsweise in unserem Fall die Kachel Backup, erhalten Sie als Ergebnis die Zeichenkette Menu Backup. Da Sie zur Auswertung nur den Namen der Kachel benötigen, extrahieren Sie diesen mithilfe des Tools Awk aus dem Rückgabestring und weisen ihn dann der Variablen key zu:

key=$(echo "$*" | awk 'NF>1{print $NF}')

Anschließend werten Sie dann mit der Case-Anweisung den Inhalt dieser Variablen aus, wie Listing 3 es für unser Beispiel zeigt.

Listing 3

 

#!/bin/bash
key=$(echo "$*" | awk 'NF>1{print $NF}')
case $key in
  Camera)
    ps aux | grep -ie gphoto2 | awk '{print $2}' | xargs kill -9
    cd
    if [ ! -d "FOTOS" ]; then
      mkdir FOTOS
    fi
    cd FOTOS
    gphoto2 --get-all-files --new --filename "%Y%m%d-%H%M%S.%C"
    ;;
  USB)
    cd
    if [ ! -d "FOTOS" ]; then
      mkdir FOTOS
    fi
    USB_MOUNT_POINT=$(find /media/ -mindepth 1 -maxdepth 1 -not -empty -type d | sed 's/ /\\ /g')
    exiftool -r -d /home/pi/FOTOS/%Y%m%d-%H%M%S.%%e '-FileName<DateTimeOriginal' $USB_MOUNT_POINT >> /home/pi/transfer.log
    ;;
  Backup)
    cd
    if [ ! -d "FOTOS" ]; then
      exit 1
    fi
    USB_MOUNT_POINT=$(find /media/ -mindepth 1 -maxdepth 1 -type d | sed 's/ /\\ /g')
    eval rsync -avhz /home/pi/FOTOS/ $USB_MOUNT_POINT/ --log-file=/home/pi/backup.log
    ;;
  '')
    ps aux | grep -ie pimenu | awk '{print $2}' | xargs kill -9
    ;;
esac
sleep 3

Backup-Box im Detail

Im Folgenden sehen wir uns nun einmal genauer an, was in den einzelnen Abschnitten der Case-Anweisung eigentlich genau passiert. Sobald Sie die Kachel Camera antippen, beendet das Skript zunächst einmal alle noch laufenden Prozesse von Gphoto2:

ps aux | grep -ie gphoto2 | awk '{print $2}' | xargs kill -9

Dies stellt sicher, dass keine noch laufenden Gphoto2-Prozesse die Kamera blockieren und dadurch möglicherweise den Transfer der Fotos verhindern (Listing 3, Zeile 5). Der Ordnung halber speichert das Skript alle von der Kamera heruntergeladenen Bilder im Ordner FOTOS im Home-Verzeichnis ab. Falls dieses noch nicht existiert, legt das Skript es dazu an (Zeilen 7 bis 9). Schließlich lädt es mit dem folgenden Befehl die Bilder von der Kamera herunter, wobei es sie gemäß Datum und Uhrzeit umbenennt:

gphoto2 --get-all-files --new --filename "%Y%m%d-%H%M%S.%C"

Der Abschnitt, der Bilder vom angeschlossenen USB-Gerät zurück auf den RasPi holt (Zeilen 13 bis 20), geht davon aus, dass lediglich ein solches Gerät oder ein einzelner Card-Reader am Mini-Rechner hängt. Zunächst ermittelt folgendes Kommando den Einhängepunkt des USB-Massenspeichers:

USB_MOUNT_POINT=$(find /media/ -mindepth 1 -maxdepth 1 -not-empty -type d | sed 's/ /\\ /g')

Dazu durchsucht find das Verzeichnis /media nach Ordnern, die nicht leer sind. Mittels des Stream-Editors Sed sorgt der zweite Teil des Kommandos für ein sauberes Escaping von eventuellen Leerzeichen im Verzeichnisnamen. So wird aus /media/NIKON D90/DCIM/100NCD90/ beispielsweise /media/NIKON\ D90/DCIM/100NCD90/.

Auch für das Sichern der von der Kamera übertragenen Fotos (Zeilen 21 bis 28) ermittelt das Skript zunächst einmal den Einhängepunkt des fraglichen Massenspeichers. Anschließend kopiert es die Dateien mithilfe des Befehls rsync auf den USB-Datenträger.

Tippen Sie eine Kachel an, für die es keine Untermenüpunkte gibt, wie in unserem Beispiel Exit, bleiben der an pimenu.sh zurückgelieferte String und damit auch $key leer. Daher schließt die entsprechende Case-Verzweigung in diesem Fall alle noch laufenden PiMenu-Prozesse (Zeilen 29 bis 31).

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Raspberry Pi Geek kaufen

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

Deutschland

Ähnliche Artikel

Aktuelle Ausgabe

10/2017
Addon-Boards

Diese Ausgabe als PDF kaufen

Preis € 7,99
(inkl. 19% MwSt.)

Neuigkeiten

  • Neues auf der Heft-DVD

    Nur mit dem optimalen System und der richtigen Software nutzen Sie das volle Potenzial eines Mini-PC. Mit der Heft-DVD erhalten Sie nicht nur die neusten Distributionen für den Raspberry Pi und Konsorten, sondern gleichzeitig auch die passenden Programme zu den Artikeln.

  • Aufgewacht!

    Der Raspberry Pi fährt auf Kommando herunter, doch zum Aufwachen fehlt ihm eine Echtzeituhr. Mit einer RTC und ein paar Schaltungen steuern Sie den Schlaf- und Wachrhythmus des Mini-Rechners.

  • Schneller Wechsel

    Mit dem Messkopf ExpEYES Junior erfassen Sie auf einfache Weise die Flimmerfrequenz von verschiedenen Lichtquellen.

  • Knirps

    Der 3,2 Zoll kleine Monitor von Joy-it, zusammen mit dem RasPi kaum größer als eine Packung Zündhölzer, bietet eine interessante Alternative zu einer reinen Headless-Konfiguration. Er erleichtert das Überwachen des Boot-Vorgangs und das Verfolgen von Ausgaben, die nur ein Paar Zeichen oder Zeilen umfassen.

  • Minimalistisch

    Die Raspberry-Pi-Familie bekommt regelmäßig Zuwachs, doch einige Familienmitglieder fristen ein Schattendasein, wie das Compute Module. Das kompakte Board eignet sich bestens für Embedded-Lösungen.

  • Meisencam

    Mit einem RasPi, einer NoIR-Pi-Cam und etwas Elektronik bauen Sie für unter 100 Euro ein digitales Auge, mit dem Sie behutsam Singvögel in der Natur beim Brüten beobachten.

  • Mit einfachen Mitteln

    YunoHost bietet eine große Anzahl von Diensten auf einer bewährten Debian-Server-Plattform, die Sie selbst hosten können.

  • An einem Tisch

    Gemeinsames Arbeiten auf einer mobilen Plattform im lokalen Netzwerk – dazu brauchen Sie nicht mehr als einen SBC und die Software Etherpad Lite.

  • Netz aufspannen

    Ein WLAN-Access-Point bietet einen zusätzlichen Einstieg ins LAN und erlaubt im Zusammenhang mit dem RasPi vielfältige Einsatzszenarien.

  • Diätkost

    Für ältere Modelle des RasPi erweist sich Raspbian mittlerweile als zu schwergewichtig. Mit dem schlanken DietPi helfen Sie diesen Modellen wieder auf die Sprünge.