Kios Raspberry Pi untuk GUI di Kivy

Halo, Habr!



Saya ingin berbagi pengalaman saya menyiapkan Raspberry Pi 3B + sebagai kios dengan GUI berdasarkan pustaka Kivy untuk Python 3. Mengapa Kivy? Hanya saja kami sudah memiliki produk yang dikembangkan dengan Python, kami ingin menambahkan antarmuka grafis ke dalamnya. Perlu dicatat bahwa sebelum Kivy, kami mencoba beberapa opsi, termasuk wxWidgets dan bahkan browser Chromium dengan aplikasi web. Semua alternatif ini terbukti tidak berdaya melawan Kivy, ringan dan cepat. Gambaran yang sangat bagus tentang perpustakaan ini sudah ada di Habré .



Lingkungan Hidup



Kami akan menggunakan Raspbian Lite dengan Python 3.7 dan proses Supervisor dan sistem manajemen layanan. Omong-omong, utilitas Raspberry Pi Imager sangat nyaman , yang dengannya Anda dapat menyiapkan kartu SD. Setelah mengunduh pertama RPi bayi kami, kami masuk menggunakan login pi standar dan kata sandi raspberry . Kemudian kami mengeksekusi:



$ sudo raspi-config


Kami memilih item kelima Interfacing Options , di menu yang muncul kami tertarik pada item kedua SSH , yang dengannya kami akan mengaktifkan akses jarak jauh untuk kenyamanan.

Jadi, bersandar dengan nyaman di kursi favorit Anda, kami akan terus mengkonfigurasi RPi melalui klien ssh yang nyaman.



Pengguna



Mari buat pengguna dengan nama yang nyaman bagi kita, izinkan dia menggunakan sudo dan reboot:



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


Setelah reboot, masuk melalui ssh dengan data baru untuk kivygui dan hapus akun pi standar :



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


Tidak akan berlebihan untuk menunjukkan bahwa kami menggunakan tata letak keyboard Amerika:



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


Uji aplikasi



Aplikasi uji kita akan berada di folder terpisah, mari kita buat:



$ mkdir /home/kivygui/helloworld


Sekarang, di editor teks nano , mari buat skrip untuk menjalankan aplikasi Python /home/kivygui/helloworld/run.sh dengan konten berikut:



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


Mari buat di nano dan contoh antarmuka sederhana di file /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()


Antarmuka pengguna grafis



Kami membutuhkan pip3 :



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


Saya juga menemukan fakta bahwa ketika menginstal nodm, semua paket yang diperlukan tidak selalu diunduh, jadi untuk berjaga-jaga, kami akan menginstalnya terlebih dahulu:



$ 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


Sekarang mari kita atur kotak korek api nodm dan 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


Sekarang Kivy ini giliran :



$ 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


Sekarang kami akan mengajarkan sistem kami untuk menunjukkan kepada kami antarmuka grafis alih-alih prompt konsol, menyembunyikan semua pesan diagnostik dan menampilkan layar boot sistem grafis:



$ 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


Jika diinginkan, konsol tty1 dapat dinonaktifkan sama sekali:



$ sudo systemctl disable getty@tty1


Pengawas d



Sekarang mari instal Supervisor :



$ sudo apt-get install -y supervisor


Mari buat folder untuk log:



$ mkdir /home/kivygui/logs


Sekarang, mari hentikan layanan Supervisor untuk sementara untuk mengkonfigurasi ulang:



$ sudo systemctl stop supervisor


Tambahkan berikut ini ke file konfigurasi /etc/supervisor/supervisord.conf menggunakan nano editor :



[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


Juga, mari berikan kivygui dan pengguna root beberapa opsi tambahan. Untuk melakukan ini, gunakan perintah:



$ sudo visudo


Mari kita bawa file ke bentuk berikut:



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


Sekarang kita bisa memulai layanan:



$ sudo systemctl start supervisor


Di monitor yang terhubung ke RPi, kita akan melihat salam yang disayangi. Yang tersisa hanyalah reboot untuk menguji layar boot grafis.



PS



Bahkan, nodm bisa menggantikan lightdm dengan autologin . Ini akan sangat mirip dengan solusi nodm . Selain itu, pengembang NODM sendiri merekomendasikan pendekatan ini.



All Articles