アプリケーションの設定画面 - Kivy Advent Calendar 2013

Kivyでアプリケーションを起動した後、F1キーやメニューボタン等の操作をすると設定画面が表示されます。これはKivy自体の設定画面で、エラーログのオンオフ、ダブルタップのタイミングなどの調整ができます。

この設定画面は、アプリケーション用にカスタマイズすることができます。しかも設定ファイルは自動で読み込まれ保存されるので、いろいろと考える必要ありません。プログラムからはself.config.get()、self.config.getint()で参照できます。
必要なのは「初回起動時にデフォルト値を用意すること」と「パネルを用意して設定画面に追加すること」だけです。

config 設定オブジェクト
use_kivy_settings FalseにするとKivyの設定パネルが無効になる
build_config(config) 初回起動時に呼び出す ... デフォルト値をconfigにセット
build_settings(settings) 起動時に呼び出す ... 設定画面にパネルを追加
settings_cls パネルの切替方法 (1.8.0以降)

(/sdcard/kivy/settings/)

android.txt Androidでは必要
main.py スクリプト本体
plane.ini 初回デフォルト値
plane.json パネルの項目

(/sdcard/)

.plane.ini 保存された設定情報

アプリケーションクラスが「PlainApp」だと、Androidでは「/sdcard/.plain.ini」という設定ファイルが作られて自動的に保存されます。

(android.txt)

title=setting
author=cheeseshop
orientation=landscape

(main.py)

from kivy.app import App
from kivy.config import ConfigParser
from kivy.uix.label import Label

class PlainApp(App):

    use_kivy_settings = False

    def build_config(self, config):
        config.read('%s.ini' % self.get_application_name())

    def build_settings(self, settings):
        settings.add_json_panel(
            'Setting Panel',
            self.config,
            filename='%s.json' % self.get_application_name())

    def build(self):
        root = Label(text='This is PlainApp')
        return root

if __name__ == '__main__':
    PlainApp().run()

(plain.ini)

[section1]
setting_bool = on
setting_numeric = 123
setting_options = A
setting_string = test
setting_path = /storage/emulated/legacy/kivy/settings/main.py

(plain.json)

[
  {"title":"Plain Setting", "type":"title"},
  {"title":"Setting Bool", "section":"section1", "key":"setting_bool",
   "type":"bool", "values":["off","on"]},
  {"title":"Setting Numeric", "section":"section1", "key":"setting_numeric",
   "type":"numeric"},
  {"title":"Setting Pptions", "section":"section1", "key":"setting_options",
   "type":"options", "options":["A","B","C"]},
  {"title":"Setting String", "section":"section1", "key":"setting_string",
   "type":"string"},
  {"title":"Setting Path", "section":"section1", "key":"setting_path",
   "type":"path"}
]

このJSONで指定したとおりに、アプリケーションの設定画面が作られます。
通常はこの設定画面とKivyの設定画面を左のサイドバーで切り替えることができます。ここでは「use_kivy_settings = False」としているのでアプリケーションの設定画面だけが表示され、Kivyの設定にはアクセスできない状態となっています。

数値や文字列はポップアップが開き、

ファイルパスについてはファイル選択ダイアログが開いて入力できます。


おまけ (2013年12月現在)

実は、設定項目のタイトルや説明文を日本語にするとUnicodeエラーになってしまいます。

[INFO              ] Logger: Record log in /storage/emulated/0/kivy/settings/.kivy/logs/kivy_13-12-04_8.txt
[INFO              ] Kivy v1.7.2
....
[WARNING           ] stderr: kivy.lang.BuilderException: Parser: File "/data/data/org.kivy.pygame/files/lib/python2.7/site-packages/kivy/data/style.kv", line 556:
[WARNING           ] stderr: ...
[WARNING           ] stderr:     554:            id: labellayout
[WARNING           ] stderr:     555:            markup: True
[WARNING           ] stderr: >>  556:            text: '{0}\n[size=13sp][color=999999]{1}[/color][/size]'.format(root.title or '', root.desc or '')
[WARNING           ] stderr:     557:            font_size: '15sp'
[WARNING           ] stderr:     558:            text_size: self.width - 32, None
[WARNING           ] stderr: ...
[WARNING           ] stderr: 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128)

これテンプレートにバイト文字列を使っちゃってるんで、JSONをバイト文字列にしてもUnicode文字列にしても無駄ですね。

2013年6月ごろ直したみたいですが、KivyLauncher 1.7.2には反映されてません。

556 | text: '{0}\n[size=13sp][color=999999]{1}[/color][/size]'.format(root.title or '', root.desc or '')
712 | text: u'{0}\n[size=13sp][color=999999]{1}[/color][/size]'.format(root.title or '', root.desc or '')

masterブランチには反映されているので、おそらく1.8.0は直ってると思います。お急ぎの人はbuildをどうぞ。