Je souhaite partager mon expérience de configuration du Raspberry Pi 3B + en tant que kiosque avec une interface graphique basée sur la bibliothèque Kivy pour Python 3. Pourquoi Kivy? C'est juste que nous avons déjà un produit développé en Python, nous aimerions y ajouter une interface graphique. Il est à noter qu'avant Kivy, nous avons essayé plusieurs options, notamment wxWidgets et même un navigateur Chromium avec une application Web. Toutes ces alternatives se sont avérées impuissantes face à Kivy, légères et rapides. Un très bon aperçu de cette bibliothèque est déjà sur Habré .
Environnement
Nous utiliserons Raspbian Lite avec Python 3.7 et le système de gestion des processus et des services du superviseur. À propos, l'utilitaire Raspberry Pi Imager est très pratique , avec lequel vous pouvez préparer une carte SD. Après le premier téléchargement de notre baby RPi, nous nous connectons en utilisant le login pi standard et le mot de passe framboise . Ensuite, nous exécutons:
$ sudo raspi-config
Nous sélectionnons le cinquième élément Options d'interfaçage , dans le menu qui apparaît, nous sommes intéressés par le deuxième élément SSH , avec lequel nous activerons l'accès à distance pour plus de commodité.
Ainsi, en vous penchant confortablement en arrière dans votre fauteuil préféré, nous continuerons à configurer le RPi via n'importe quel client ssh pratique.
Utilisateur
Créons un utilisateur avec un nom qui nous convient, permettez-lui d'utiliser sudo et redémarrez:
$ sudo useradd -m kivygui -s /bin/bash
$ sudo passwd kivygui
$ sudo usermod -a -G sudo kivygui
$ sudo reboot
Après le redémarrage, connectez-vous via ssh avec les nouvelles données pour kivygui et supprimez le compte pi standard :
$ sudo userdel pi
$ sudo rm -r /home/pi/
Il ne sera pas superflu de souligner que nous utilisons la disposition du clavier américain:
$ sudo sed -i 's/XKBLAYOUT="gb"/XKBLAYOUT="us"/' /etc/default/keyboard
Application de test
Notre application de test sera dans un dossier séparé, créons-la:
$ mkdir /home/kivygui/helloworld
Maintenant, dans l'éditeur de texte nano , créons un script pour exécuter l'application Python /home/kivygui/helloworld/run.sh avec le contenu suivant:
export DISPLAY=:0.0
xset s off -dpms
exec matchbox-window-manager &
while true; do
exec python3 start.py
done
Faisons en nano et un exemple d'interface simple dans le fichier /home/kivygui/helloworld/start.py:
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()
Interface utilisateur graphique
Nous avons besoin de pip3 :
$ sudo apt-get update -y
$ sudo apt-get install -y python3-pip
Je suis également tombé sur le fait que lors de l'installation de nodm, tous les packages nécessaires n'étaient pas toujours téléchargés, donc au cas où nous les installerions à l'avance:
$ 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
Maintenant , nous allons ensemble nodm et gestionnaire de fenêtres Matchbox :
$ 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
C'est maintenant au tour de Kivy :
$ 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
Nous allons maintenant apprendre à notre système à nous montrer une interface graphique au lieu d'une invite de console, à masquer tous les messages de diagnostic et à afficher un écran de démarrage graphique du système:
$ 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
Si vous le souhaitez, la console tty1 peut être complètement désactivée:
$ sudo systemctl disable getty@tty1
Superviseur
Maintenant, installons Supervisor :
$ sudo apt-get install -y supervisor
Créons un dossier pour les journaux:
$ mkdir /home/kivygui/logs
Arrêtons maintenant le service Supervisor pendant un moment pour reconfigurer:
$ sudo systemctl stop supervisor
Ajoutez ce qui suit au fichier de configuration /etc/supervisor/supervisord.conf à l'aide de l'éditeur nano :
[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
Aussi, donnons aux utilisateurs kivygui et root des options supplémentaires. Pour ce faire, utilisez la commande:
$ sudo visudo
Amenons le fichier sous la forme suivante:
#
# 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
Maintenant, nous pouvons démarrer le service:
$ sudo systemctl start supervisor
Sur le moniteur connecté au RPi, nous verrons le message d'accueil chéri. Il ne reste plus qu'à redémarrer pour tester l'écran de démarrage graphique.
PS
En fait, nodm peut remplacer lightdm par autologin . Ce sera absolument similaire à la solution nodm . De plus, le développeur nodm lui-même recommande cette approche.