Ich möchte meine Erfahrungen mit der Einrichtung des Raspberry Pi 3B + als Kiosk mit einer GUI teilen, die auf der Kivy- Bibliothek für Python 3 basiert . Warum Kivy? Es ist nur so, dass wir bereits ein Produkt in Python entwickelt haben, wir möchten ihm eine grafische Oberfläche hinzufügen. Es ist erwähnenswert, dass wir vor Kivy verschiedene Optionen ausprobiert haben, darunter wxWidgets und sogar einen Chromium-Browser mit einer Web-App. Alle diese Alternativen erwiesen sich gegen Kivy als machtlos, leicht und schnell. Ein sehr guter Überblick über diese Bibliothek ist bereits auf Habré .
Umgebung
Wir werden Raspbian Lite mit Python 3.7 und dem Supervisor-Prozess- und Service-Management-System verwenden. Das Dienstprogramm Raspberry Pi Imager ist übrigens sehr praktisch , mit dem Sie eine SD-Karte vorbereiten können. Nach dem ersten Download unseres Baby-RPi melden wir uns mit dem Standard- Pi- Login und dem Himbeer- Passwort an . Dann führen wir aus:
$ sudo raspi-config
Wir wählen den fünften Punkt Schnittstellenoptionen aus . In dem angezeigten Menü interessieren wir uns für den zweiten Punkt SSH , mit dem wir den Fernzugriff für den Komfort aktivieren.
Wenn Sie sich also bequem in Ihrem Lieblingsstuhl zurücklehnen, werden wir das RPi weiterhin über einen beliebigen praktischen SSH-Client konfigurieren.
Nutzer
Lassen Sie uns einen Benutzer mit einem für uns passenden Namen erstellen, ihm erlauben, sudo zu verwenden und neu zu starten:
$ sudo useradd -m kivygui -s /bin/bash
$ sudo passwd kivygui
$ sudo usermod -a -G sudo kivygui
$ sudo reboot
Melden Sie sich nach dem Neustart über ssh mit den neuen Daten für kivygui an und löschen Sie das Standard- Pi- Konto :
$ sudo userdel pi
$ sudo rm -r /home/pi/
Es wird nicht überflüssig sein, darauf hinzuweisen, dass wir das amerikanische Tastaturlayout verwenden:
$ sudo sed -i 's/XKBLAYOUT="gb"/XKBLAYOUT="us"/' /etc/default/keyboard
Anwendung testen
Unsere Testanwendung befindet sich in einem separaten Ordner. Erstellen wir sie:
$ mkdir /home/kivygui/helloworld
Jetzt erstellen wir im Nano- Texteditor ein Skript zum Ausführen der Python-Anwendung /home/kivygui/helloworld/run.sh mit folgendem Inhalt:
export DISPLAY=:0.0
xset s off -dpms
exec matchbox-window-manager &
while true; do
exec python3 start.py
done
Lassen Sie uns in Nano und einem Beispiel für eine einfache Schnittstelle in der Datei /home/kivygui/helloworld/start.py machen:
import kivy
kivy.require('1.11.0')
from kivy.app import App
from kivy.uix.label import Label
class MyApp(App):
def build(self):
return Label(text='Hello, world!')
if __name__ == '__main__':
MyApp().run()
Grafische Benutzeroberfläche
Wir brauchen pip3 :
$ sudo apt-get update -y
$ sudo apt-get install -y python3-pip
Ich bin auch auf die Tatsache gestoßen, dass bei der Installation von nodm nicht immer alle erforderlichen Pakete heruntergeladen wurden. Für alle Fälle werden wir sie im Voraus installieren:
$ sudo apt-get install -y desktop-base gtk2-engines-pixbuf libxklavier16 xserver-xorg xserver-xorg-input-all xserver-xorg-input-libinput xserver-xorg-input-wacom xserver-xorg-legacy xserver-xorg-video-all xserver-xorg-video-amdgpu xserver-xorg-video-ati xserver-xorg-video-fbdev xserver-xorg-video-nouveau xserver-xorg-video-radeon xserver-xorg-video-vesa
Jetzt setzen wir die Matchbox von nodm und window manager :
$ sudo DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true apt-get install -y x11-xserver-utils nodm matchbox-window-manager
$ echo "/usr/sbin/nodm" | sudo tee /etc/X11/default-display-manager
$ sudo sed -i -e "s/NODM_ENABLED=false/NODM_ENABLED=true/" -e "s/NODM_USER=root/NODM_USER=kivygui/" -e "s/NODM_X_OPTIONS='-nolisten tcp'/NODM_X_OPTIONS='-nolisten tcp -nocursor'/" /etc/default/nodm
Jetzt ist Kivy an der Reihe :
$ sudo apt-get install -y libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev pkg-config libgl1-mesa-dev libgles2-mesa-dev python-setuptools libgstreamer1.0-dev git-core gstreamer1.0-plugins-{bad,base,good,ugly} gstreamer1.0-{omx,alsa} python-dev libmtdev-dev xclip xsel libjpeg-dev
$ sudo python3 -m pip install --user kivy
Jetzt bringen wir unserem System bei, uns eine grafische Oberfläche anstelle einer Konsolenaufforderung anzuzeigen, alle Diagnosemeldungen auszublenden und einen grafischen Systemstartbildschirm anzuzeigen:
$ sudo rm /etc/systemd/system/default.target
$ sudo rm /etc/systemd/system/getty@tty1.service.d/autologin.conf
$ sudo ln -s /lib/systemd/system/graphical.target /etc/systemd/system/default.target
$ sudo sed -i '$ s/$/ quiet splash consoleblank=0 loglevel=0 logo.nologo plymouth.ignore-serial-consoles/' /boot/cmdline.txt
$ sudo sed -i 's/console=tty1/console=tty3/' /boot/cmdline.txt
Auf Wunsch kann die tty1-Konsole vollständig deaktiviert werden:
$ sudo systemctl disable getty@tty1
Supervisord
Jetzt installieren wir Supervisor :
$ sudo apt-get install -y supervisor
Erstellen wir einen Ordner für Protokolle:
$ mkdir /home/kivygui/logs
Beenden wir nun den Supervisor-Dienst für eine Weile, um ihn neu zu konfigurieren:
$ sudo systemctl stop supervisor
Fügen Sie der Konfigurationsdatei /etc/supervisor/supervisord.conf mit dem Nano- Editor Folgendes hinzu:
[program:rungui]
command=sh run.sh
directory=/home/kivygui/helloworld
user=root
autostart=true
autorestart=true
startsecs = 5
startretries=3
stderr_logfile=/home/kivygui/logs/rungui.err.log
stdout_logfile=/home/kivygui/logs/rungui.out.log
stderr_logfile_maxbytes=5MB
stdout_logfile_maxbytes=5MB
stopsignal=INT
stopwaitsecs=5
Lassen Sie uns auch Kivygui- und Root- Benutzern einige zusätzliche Optionen geben. Verwenden Sie dazu den folgenden Befehl:
$ sudo visudo
Bringen wir die Datei in das folgende Formular:
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
kivygui ALL=(ALL:ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
#includedir /etc/sudoers.d
kivygui ALL = NOPASSWD: /usr/bin/supervisorctl
kivygui ALL = NOPASSWD: /usr/bin/python3.7
kivygui ALL=(ALL) NOPASSWD: /bin/systemctl daemon-reload
kivygui ALL=(ALL) NOPASSWD: /usr/bin/supervisord
root ALL=(ALL) NOPASSWD: /bin/systemctl daemon-reload
root ALL = NOPASSWD: /usr/bin/supervisorctl
root ALL = NOPASSWD: /usr/bin/python3.7
root ALL=(ALL) NOPASSWD: /usr/bin/supervisord
Jetzt können wir den Dienst starten:
$ sudo systemctl start supervisor
Auf dem mit dem RPi verbundenen Monitor sehen wir die geschätzte Begrüßung. Sie müssen lediglich einen Neustart durchführen, um den grafischen Startbildschirm zu testen.
PS
Tatsächlich kann nodm lightdm durch Autologin ersetzen . Es wird der nodm- Lösung absolut ähnlich sein . Darüber hinaus empfiehlt der Nodm- Entwickler selbst diesen Ansatz.