Raspberry Pi 3B +をPython3用のKivyライブラリに基づく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
また、kivyguiとrootユーザーにいくつかの追加オプションを与えましょう。これを行うには、次のコマンドを使用します。
$ 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
実際、nodmはautologinを使用してlightdmに置き換えることができます。これは、nodmソリューションと完全に似ています。さらに、nodm開発者自身がこのアプローチを推奨しています。