Die Button-Methode on_uptime() in den Zeilen ab 73 startet deshalb nur schnell einen Thread, der dann die eigentliche Arbeit asynchron in get_uptime() (ab Zeile 89) erledigt.
Wie bei allen grafischen Bibliotheken üblich darf aber nur der Hauptthread (also MainLoop()) die Oberfläche aktualisieren. Deshalb erzeugt und versendet der Thread am Ende ein selbst definiertes Event (ab Zeile 100). Dieser von uns SysCmdFinishEvent() genannte private Event enthält lediglich den anzuzeigenden Text, die Definition steht am Anfang des Listings.
Auch an dieses Event hat das Programm im Konstruktor von AppFrame eine Methode gebunden (Zeile 31), in der ein Update des Textfelds stattfindet (ab Zeile 80), und damit schließt sich der Kreis.
Möchten Sie automatisch ein Feld mit Statusinfos füllen, nutzen Sie dazu dasselbe Schema: Ein lang laufender Thread sendet einfach in festen Abständen ein Update-Event mit dem neuen Feldinhalt.
Integration
Unser Programm hat jetzt noch zwei Probleme: Startet es, solange der X-Server (noch) nicht läuft, dann stürzt es gleich wieder ab. Ebenso beendet es sich, sobald die X-Server-App nicht mehr läuft oder außer Reichweite ist.
Das erste Problem lösen Sie, indem Sie während des Programmstarts den X-Server testen und das Programm nur dann fortsetzen, wenn er reagiert (der Code fehlt in Listing 3 aus Platzgründen). Sobald die App startet, poppt auch schon die Oberfläche hoch. Das funktioniert nur dann problemlos, wenn Sie nicht mehrere RasPis an einem Smartphone verwenden.
Das zweite Problem löst der Systemd-Daemon für Sie: Sie starten das Programm über die Datei wxvlcd.service als Dienst (Listing 4). Dort setzen Sie auch die Variable DISPLAY. Das einzig Besondere an der Unit-Definition ist die Zeile 10 mit der Anweisung Restart=always. Sie stellt sicher, dass Systemd das Programm nach dessen Ende automatisch erneut startet. Details dazu und Alternativen zu always (etwa on-failure) finden Sie über das Kommando man systemd.service.
Listing 4
[Unit] Description=Virtual LCD service After=multi-user.target [Service] Type=simple User=pi ENVIRONMENT=DISPLAY=ip-x11-server:0 ExecStart=/usr/local/bin/WxVlcdApp.py Restart=always [Install] WantedBy=multi-user.target
Fazit
Dank X-Server und wxPython implementieren Sie mit wenig Aufwand einfache Steuer- und Info-Displays für Ihre RasPi-Projekte. Da die Kommunikation über WLAN läuft, funktioniert das Ganze sogar kabellos.
Besitzen Sie kein Android-Gerät oder möchten lieber eins der kleinen 3,2-Zoll-Displays direkt am Raspberry Pi einsetzen, können Sie ebenfalls wxPython nutzen. Da das Programm die Variable DISPLAY auswertet, kann die Programmausgabe je nach Konfiguration lokal oder über das Netz erfolgen.
Ein weiterer Vorteil ist der ausgereifte Entwicklungsstand von wxPython: Das Toolkit läuft äußerst stabil, und im Internet findet sich fast für jede Problemstellung ein Lösungsbeispiel. Auch wer noch nie eine grafische Oberfläche programmiert hat, kommt damit und mit dem Beispiel aus diesem Artikel schnell zu einer schicken GUI.
Der Autor
Bernhard Bablok (mailto:[email protected]) arbeitet bei der Allianz Technology SE als SAP-HR-Entwickler. Hört er nicht gerade Musik oder ist mit dem Rad oder zu Fuß unterwegs, beschäftigt er sich mit Themen rund um Linux, Programmierung und Kleincomputer.
Infos
- Projekt VA-Meter: https://github.com/bablokb/pi-vameter
- Pi-Zero-Messmodul: Bernhard Bablok, “Im Labor”, RPG 05-06/2018, S. 54, https://www.raspi-geek.de/40630
- Projekt Bluedot: https://www.stuffaboutcode.com/2017/04/bluedot-bluetooth-remote-for-raspberry.html
- Pi Control: https://pi-control.de
- Android-X-Server (App): https://play.google.com/store/apps/details?id=x.org.server&hl=de
- Android-X-Server (Projekt): https://github.com/pelya/xserver-xsdl
- Kivy: https://www.kivy.org
- Projektseite zum Artikel: https://github.com/bablokb/pi-vlcd





