Raspberry Pi Kiosk لـ GUI على Kivy

مرحبا هبر!



أود أن أشارك تجربتي في إعداد Raspberry Pi 3B + ككشك مع واجهة مستخدم رسومية تعتمد على مكتبة Kivy لـ Python 3. لماذا Kivy؟ كل ما في الأمر أن لدينا بالفعل منتجًا تم تطويره في Python ، ونود إضافة واجهة رسومية إليه. تجدر الإشارة إلى أنه قبل Kivy ، جربنا العديد من الخيارات ، بما في ذلك wxWidgets وحتى متصفح Chromium مع تطبيق ويب. أثبتت كل هذه البدائل أنها عاجزة أمام Kivy ، خفيفة وسريعة. لمحة عامة جيدة جدًا عن هذه المكتبة موجودة بالفعل على Habré .



بيئة



سنستخدم Raspbian Lite مع Python 3.7 وعملية المشرف ونظام إدارة الخدمة. بالمناسبة ، فإن الأداة المساعدة Raspberry Pi Imager مريحة للغاية ، حيث يمكنك تحضير بطاقة SD. بعد التنزيل الأول من معهد سياسة الطفل لدينا، وتسجيل الدخول باستخدام معيار بي تسجيل الدخول و التوت كلمة المرور . ثم ننفذ:



$ sudo raspi-config


نختار العنصر الخامس Interfacing Options ، في القائمة التي تظهر ، نحن مهتمون بالعنصر الثاني SSH ، والذي سنعمل به على تمكين الوصول عن بُعد للراحة.

لذلك ، عند الاستلقاء بشكل مريح على كرسيك المفضل ، سنواصل تكوين RPi من خلال أي عميل ssh مناسب.



المستعمل



لنقم بإنشاء مستخدم باسم مناسب لنا ، والسماح له باستخدام sudo وإعادة التشغيل:



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


بعد إعادة التشغيل ، قم بتسجيل الدخول عبر ssh بالبيانات الجديدة لـ kivygui وقم بإزالة حساب pi القياسي :



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


لن يكون من غير الضروري الإشارة إلى أننا نستخدم تخطيط لوحة المفاتيح الأمريكية:



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


تطبيق الاختبار



سيكون تطبيق الاختبار الخاص بنا في مجلد منفصل ، فلنقم بإنشائه:



$ mkdir /home/kivygui/helloworld


الآن ، في محرر نصوص nano ، لنقم بإنشاء برنامج نصي لتشغيل تطبيق Python /home/kivygui/helloworld/run.sh بالمحتوى التالي:



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


جعل دعونا في النانو ومثال على واجهة بسيطة في /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()


واجهة المستخدم الرسومية



نحتاج pip3 :



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


لقد صادفت أيضًا حقيقة أنه عند تثبيت nodm ، لم يتم تنزيل جميع الحزم الضرورية دائمًا ، لذلك فقط في حالة حدوث ذلك ، سنقوم بتثبيتها مسبقًا:



$ 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


الآن دعونا مجموعة nodm ومدير النوافذ علبة الثقاب :



$ 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


الآن حان 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


الآن سنعلم نظامنا أن يظهر لنا واجهة رسومية بدلاً من موجه وحدة التحكم ، وإخفاء جميع رسائل التشخيص وإظهار شاشة تمهيد نظام رسومية:



$ 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


إذا رغبت في ذلك ، يمكن تعطيل وحدة التحكم tty1 تمامًا:



$ sudo systemctl disable getty@tty1


مشرف



لنقم الآن بتثبيت Supervisor :



$ sudo apt-get install -y supervisor


لنقم بإنشاء مجلد للسجلات:



$ mkdir /home/kivygui/logs


الآن دعنا نوقف خدمة المشرف لفترة من الوقت لإعادة التكوين:



$ sudo systemctl stop supervisor


أضف ما يلي إلى ملف التكوين /etc/supervisor/supervisord.conf باستخدام محرر 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


أيضا، دعونا نعطي kivygui و الجذرية للمستخدمين بعض الخيارات الإضافية. للقيام بذلك ، استخدم الأمر:



$ sudo visudo


لنجلب الملف إلى النموذج التالي:



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


الآن يمكننا بدء الخدمة:



$ sudo systemctl start supervisor


على الشاشة المتصلة بـ RPi ، سنرى التحية العزيزة. كل ما تبقى هو إعادة التشغيل لاختبار شاشة التمهيد الرسومية.



ملاحظة



في الواقع، nodm يمكن أن تحل محل lightdm مع الدخول التلقائي . سيكون مشابهًا تمامًا لحل nodm . علاوة على ذلك ، يوصي مطور nodm نفسه بهذا النهج.



All Articles