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

12/2017
Schräge Hacks

Diese Ausgabe als PDF kaufen

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

Stellenmarkt

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 RasPi und Co., sondern gleichzeitig auch die passenden Programme zu den Artikeln.

  • Digitaler Widerstand

  • 3, 2, 1 … los!

    Ein Countdown ist nicht nur in der Raumfahrt sinnvoll. Mit einem Raspberry Pi und etwas Elektronik zählen Sie die Zeit bis zu einem beliebigen Ereignis optisch eindrucksvoll herunter.

  • Blog out of the box

    Das bei Bloggern beliebte CMS Wordpress kommt besonders Einsteigern mit einer einfachen Oberfläche und aktiven Community entgegen. Mit Blog In A Box setzen Sie ein solches Komplettsystem im Handumdrehen auf einem RasPi auf.

  • Angetestet

    Barefootd 1.4.1 leitet Ports und Verbindungen weiter, schlanke OpenSSH-Alternative Dropbear 2017.75, Httpbench 0.2.2 erfasst Webserver-Reaktionszeiten, Mtr 0.92 kombiniert Traceroute und Ping.

  • Öfter mal was Neues?

    Mit dem neuen Raspbian-Release "Stretch" schlägt die Raspberry Pi Foundation überflüssige technische Kapriolen, die einer auf Bildung und Ausbildung fokussierten Organisation schlecht zu Gesicht stehen, findet Chefredakteur Jörg Luther.

  • Aufgeweckt

    Dank der Chat-Plattform Telegram und einem eigenen Chatbot kommunizieren Sie mit dem Mini-PC selbst durch eine Firewall hindurch.

  • Elektropuzzle

    Das Board PiXtend erweitert den RasPi zu einer leistungsfähigen Steuereinheit. Neben dem Komplett-Kit bietet der Hersteller die Platine als Bausatz an, die Lötprofis viel Spaß bereitet und Einsteigern bei den ersten Schritten in der Elektronik-Welt hilft.

  • Nerds only

    Der Nerd-Wecker weckt – und macht gleichzeitig jede Menge Spaß beim Bauen und Anpassen.

  • Hightech-Halloween

    Ein gestandener Bastler zelebriert Halloween mit allerlei technischem Hokuspokus. Der Raspberry Pi liefert dafür die ideale Ausgangsbasis.