数日困ってた。
Contents
kivyLauncherアプリケーションのprintf「的」デバッグ
前置き
- あたりまえだがほんとに printf を使うわけではない。
- 本格式な「デバッグ環境をバッチシ整え」ることなくカジュアルにデバッグしたいのだ、ってオハナシ
- kivyLauncherアプリケーションとは、kivyアプリケーションと nearly equal である
- ので、ここで書くことは通常の kivy アプリケーションに通ずるかもしれないぜベイベー
kivyLauncher を初めて使うと、何かコトが起こった場合に「何もいわずに黙って終了する」だけなので、ほんとうに困る。android 実機以外(Windows とか)でも動作する状態、つまり android 固有機能に依存してないうちはいいんだけど、GPS だとかコンパスのような実機でしか動作しないものを作ってると、原因解析手段がなんにもない。と思って探っていました、つー話。
たぶんどうしようもないパターン
これが解決するといいんだけどね…。どうも、スクリプトファイルの文法エラー系は、kivyLauncher はなんにも情報を残さないように思える。何か見つけたら追記しようと思うけど、今のところ何も見つけれていない。
となれば、実機に持っていく前に静的解析ツールをかけるとかするしかないだろうな、ひとまずは。
トーストを使う(1)
正規の android API、つまり java では toast を気軽に使えるから、開発中の実機デバッグではよく使うのであろう、きっと。
kivy に toast がないかなぁと思ったら、「こっそり」あった。ちとわかりにくい:
1 from plyer.platforms.android import activity
2 # ...
3 def func():
4 activity.toastError("message")
トーストを使う(2)
ほんの少しだけ activity.toastError より柔軟な。jnius を使って本物の toast API にアクセスする。
1 # -*- coding: utf-8 -*-
2 from jnius import autoclass, PythonJavaClass, java_method, cast
3 from android.runnable import run_on_ui_thread
4
5 Toast = autoclass('android.widget.Toast')
6 context = autoclass('org.renpy.android.PythonActivity').mActivity
7
8 @run_on_ui_thread
9 def toast(text, length_long=False):
10 duration = Toast.LENGTH_LONG if length_long else Toast.LENGTH_SHORT
11 String = autoclass('java.lang.String')
12 c = cast('java.lang.CharSequence', String(text))
13 t = Toast.makeText(context, c, duration)
14 t.show()
kivy.loggerを使う
の前に…、ログファイル、どこ?
ファイルシステムブラウザとしてES ファイルエクスプローラーを使っている、ワタシは。ので、その絵で説明。
アプリケーションフォルダの下に .kivy フォルダが「ある」:
ただし、この手のブラウザは隠しファイル・フォルダをデフォルトで表示しないので、設定で見えるようにしとくこと。
.kivy フォルダの中:
をっと、logs フォルダがあるねぇ。その中:
中身を覗いて見る:
よしよし。
気を取り直して、kivy.loggerを使う
標準 Python のロガーだと設定をごにょごにょせねばならんが?
さっき見つけたログに混ざりこんでいいなら、結論から言えばこれだけ:
1 from kivy.logger import Logger
2 from kivy.config import Config
3 Config.set('kivy', 'log_level', 'debug') # デフォルトで debug になってないので
4 Config.set('kivy', 'log_enable', 1)
5 #Config.set('kivy', 'log_dir', 'logs') # 変更しなければ上でみた通り
6 #Config.set('kivy', 'log_name', 'kivy_%y-%m-%d_%_.txt') # 変更しなければ上でみた通り
7
8 #...
9 Logger.debug("hoge!")
上の Config は設定ファイルにも書ける。公式ドキュメントのこことここ参照。説明は通常の kivy アプリケーション向けみたい。kivyLauncher の場合は先のスクリーンキャプチャで見えていた config.ini。
config.ini ファイルは、最初に起動する際に自動で作成される、のね。これ、予め作っとくのはキツイ気がするなぁ。中身はこんななの:
1 [kivy]
2 keyboard_repeat_delay = 300
3 keyboard_repeat_rate = 30
4 log_dir = logs
5 log_enable = 1
6 log_level = info
7 log_name = kivy_%y-%m-%d_%_.txt
8 window_icon =
9 keyboard_mode =
10 keyboard_layout = qwerty
11 desktop = 0
12 exit_on_escape = 1
13 pause_on_minimize = 0
14 config_version = 14
15
16 [graphics]
17 display = -1
18 fullscreen = 0
19 height = 600
20 left = 0
21 maxfps = 60
22 multisamples = 2
23 position = auto
24 rotation = 0
25 show_cursor = 1
26 top = 0
27 width = 800
28 resizable = 1
29 borderless = 0
30 window_state = visible
31 minimum_width = 0
32 minimum_height = 0
33
34 [input]
35 mouse = mouse
36
37 [postproc]
38 double_tap_distance = 20
39 double_tap_time = 250
40 ignore = []
41 jitter_distance = 0
42 jitter_ignore_devices = mouse,mactouch,
43 retain_distance = 50
44 retain_time = 0
45 triple_tap_distance = 20
46 triple_tap_time = 375
47
48 [widgets]
49 scroll_timeout = 250
50 scroll_distance = 20
51 scroll_friction = 1.
52 scroll_stoptime = 300
53 scroll_moves = 5
54
55 [modules]
kivy.logger 自体は使い方はたぶん標準 Python ロガーと一緒なんじゃないかと思う。まだ使いこなせてないし調べ切れてもいないけれど。