Quiosco de Raspberry Pi para GUI en Kivy

¡Hola, Habr!



Me gustaría compartir mi experiencia al configurar Raspberry Pi 3B + como un quiosco con una GUI basada en la biblioteca Kivy para Python 3. ¿Por qué Kivy? Es solo que ya tenemos un producto desarrollado en Python, nos gustaría agregarle una interfaz gráfica. Vale la pena señalar que antes de Kivy, probamos varias opciones, incluidos wxWidgets e incluso un navegador Chromium con una aplicación web. Todas estas alternativas demostraron ser impotentes contra Kivy, ligeras y rápidas. Ya hay una muy buena descripción de esta biblioteca en Habré .



Medio ambiente



Usaremos Raspbian Lite con Python 3.7 y el proceso Supervisor y el sistema de gestión de servicios. Por cierto, la utilidad Raspberry Pi Imager es muy conveniente , con la que puedes preparar una tarjeta SD. Después de la primera descarga de nuestro bebé RPi, iniciamos sesión con el inicio de sesión pi estándar y la contraseña de frambuesa . Luego ejecutamos:



$ sudo raspi-config


Seleccionamos el quinto elemento Opciones de Interfaz , en el menú que aparece nos interesa el segundo elemento SSH , con el que habilitaremos el acceso remoto para mayor comodidad.

Entonces, recostándonos cómodamente en su silla favorita, continuaremos configurando el RPi a través de cualquier cliente ssh conveniente.



Usuario



Creemos un usuario con un nombre conveniente para nosotros, permítale usar sudo y reiniciar:



$ sudo useradd -m kivygui -s /bin/bash
$ sudo passwd kivygui
$ sudo usermod -a -G sudo kivygui
$ sudo reboot


Después de reiniciar, inicie sesión a través de ssh con los nuevos datos de kivygui y elimine la cuenta pi estándar :



$ sudo userdel pi
$ sudo rm -r /home/pi/


No será superfluo señalar que estamos usando la distribución de teclado estadounidense:



$ sudo sed -i 's/XKBLAYOUT="gb"/XKBLAYOUT="us"/' /etc/default/keyboard


Aplicación de prueba



Nuestra aplicación de prueba estará en una carpeta separada, vamos a crearla:



$ mkdir /home/kivygui/helloworld


Ahora, en el editor de texto nano , creemos un script para ejecutar la aplicación Python /home/kivygui/helloworld/run.sh con el siguiente contenido:



export DISPLAY=:0.0
xset s off -dpms
exec matchbox-window-manager &
while true; do
  exec python3 start.py
done


Hagamos en nano un ejemplo de una interfaz simple en el archivo /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()


Interfaz gráfica del usuario



Necesitamos pip3 :



$ sudo apt-get update -y
$ sudo apt-get install -y python3-pip


También me encontré con el hecho de que al instalar nodm, no siempre se descargaban todos los paquetes necesarios, así que por si acaso, los instalaremos con anticipación:



$ 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


Ahora configuremos nodm y la caja de cerillas del administrador de ventanas :



$ 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


Ahora es el turno 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


Ahora le enseñaremos a nuestro sistema a mostrarnos una interfaz gráfica en lugar de un indicador de consola, ocultar todos los mensajes de diagnóstico y mostrar una pantalla gráfica de inicio del sistema:



$ 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 lo desea, la consola tty1 se puede desactivar por completo:



$ sudo systemctl disable getty@tty1


Supervisor



Ahora instalemos Supervisor :



$ sudo apt-get install -y supervisor


Creemos una carpeta para registros:



$ mkdir /home/kivygui/logs


Ahora, detengamos el servicio Supervisor por un tiempo para reconfigurarlo:



$ sudo systemctl stop supervisor


Agregue lo siguiente al archivo de configuración /etc/supervisor/supervisord.conf usando el editor 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


Además, demos a kivygui y a los usuarios root algunas opciones adicionales. Para hacer esto, use el comando:



$ sudo visudo


Llevemos el archivo a la siguiente forma:



#
# 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


Ahora podemos iniciar el servicio:



$ sudo systemctl start supervisor


En el monitor conectado al RPi, veremos el preciado saludo. Todo lo que queda es reiniciar para probar la pantalla gráfica de inicio.



PD



De hecho, nodm puede reemplazar lightdm con autologin . Será absolutamente similar a la solución nodm . Además, el propio desarrollador de nodm recomienda este enfoque.



All Articles