アプリケーションの設定画面 - 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文字列にしても無駄ですね。
- https://github.com/kivy/kivy/issues/1084
- https://github.com/kivy/kivy/pull/1228
- https://github.com/kivy/kivy/commit/fbc183e4f27d26d027735efa2f1bc31f118eca34#diff-6036ff420039ce09a895556d11f5e9db
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をどうぞ。