KivyのGUI用のRaspberryPiキオスク

こんにちは、Habr!



Raspberry Pi 3B +をPython3Kivyライブラリに基づくGUIを備えたキオスクとして設定した経験を共有したいと思います。なぜKivyなのですか?Pythonで開発された製品がすでにあるというだけで、グラフィカルインターフェイスを追加したいと思います。Kivyの前に、wxWidgetsやWebアプリを備えたChromiumブラウザーなど、いくつかのオプションを試したことは注目に値します。これらすべての選択肢は、Kivyに対して無力で、軽くて速いことが証明されました。このライブラリの非常に優れた概要は、すでにHabréにあります。



環境



RaspbianLiteとPython3.7、およびスーパーバイザープロセスとサービス管理システムを使用します。ちなみに、Raspberry Pi Imagerユーティリティは非常に便利で、SDカードを準備することができます。ベビーRPiを最初にダウンロードした後、標準のpiログインラズベリーパスワードを使用してログインします次に、以下を実行します。



$ sudo raspi-config


5番目の項目[インターフェイスオプション]を選択します。表示されるメニューで、2番目の項目SSHに関心があります。これを使用すると、便宜上リモートアクセスが有効になります。

そのため、お気に入りの椅子にもたれかかって、便利なsshクライアントを介してRPiの構成を継続します。



ユーザー



わかりやすい名前のユーザーを作成し、sudoを使用して再起動できるようにします



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


再起動後、kivyguiの新しいデータを使用してssh経由でログインし、標準の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


nanoとファイル/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


次に、Supervisorサービスをしばらく停止して、再構成します。



$ sudo systemctl stop supervisor


nano エディターを使用して、構成ファイル/etc/supervisor/supervisord.confに以下を追加します。



[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


また、kivyguirootユーザーにいくつかの追加オプションを与えましょうこれを行うには、次のコマンドを使用します。



$ 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に接続されたモニターに、大切な挨拶が表示されます。残っているのは、再起動してグラフィカルな起動画面をテストすることだけです。



PS



実際、nodmautologin使用してlightdmに置き換えることができますこれは、nodmソリューションと完全に似てます。さらに、nodm開発者自身がこのアプローチを推奨しています。



All Articles