引き続きKivyのドキュメントを中心に勉強して、実装力を上げていきます。
今回は、KivyのTextInputを使って文字入力を受け取るところまで。
Kivyはデフォルトでは日本語フォントが入っておらず、日本語を表示できません。
そのあたりの解決法も合わせてまとめておきます。
今回のゴールはこちら。
日本語表示と、入力された文字列の受け取りまでできたー。
日本語だと入力中の文字がフォームに表示されないのは若干使いづらいけど、解消するのは結構手間がかかりそうなのでとりあえず放置!#Python #Kivy
pic.twitter.com/VoJTADiCz7— カシワバユキ (@yuki_kashiwaba) 2019年1月11日
もくじ
ソースコード
まずは上記の動画の画面を作るコードを貼っておきます。
基本はドキュメントとか、下のリンク先の記事を参考にして作ってます。
#test.py # -*- coding: utf-8 -*- from kivy.config import Config Config.set("graphics", "resizable", False) Config.set("graphics", "width", 600) Config.set("graphics", "height", 200) from kivy.app import App from kivy.uix.floatlayout import FloatLayout from kivy.uix.textinput import TextInput class testApp(App): def build(self): layout = FloatLayout() ti = TextInput(text='', multiline=False, font_name='IPAfont00303/ipag.ttf') ti.bind(on_text_validate=self.on_enter) layout.add_widget(ti) return layout def on_enter(self, ti): print("on_enter[%s]" % (ti.text)) if __name__ == "__main__": testApp().run()
#test.kv #File name: test.py size_hint: 0.5, 0.03 size_hint: (1.8, 10) pos_hint: {"x": 0.1,"top":23}
では、中身を見ていきましょう。
TextInputオブジェクトをつくる
今回の肝は、なんといってもこの一文でしょう。
ti = TextInput(text=”, multiline=False, font_name=’IPAfont00303/ipag.ttf’)
割とこの一文に今日学んだことのすべてが詰まっています。
Kivyで、文字入力フォームを作る方法の一つに、TextInputオブジェクトを使う方法があります。
今回このインスタンスに渡している引数は3つです。
text:初期表示の文字列を指定。今回は空白。
multiline:真偽値で、行数を指定。今回は一行のみ。Trueにすると複数行入力が可能。
font_name:使用するフォントを指定。今回はIPAフォント ダウンロードページからダウンロードしてきたttfファイルを指定している。
このTextInputオブジェクトをFloatLayoutで表示させることで画面を作っています。
ある意味HTMLよりシンプルかも。
日本語を表示させる
やったー!テキストボックスができたぞ!
と思ったのも束の間。
衝撃的な壁にぶつかりました。
なんと、Kivyはデフォルトでは日本語表示に対応していないのです。
そのあたりの事情も、Kivyが日本で普及していない理由の一つなんだとか。
Kivyで入力モジュール作ってたら、日本語入力に対応していないという壁にぶつかってしまった。
厳密には、日本語は受け取れるけど、画面上では文字化けしてしまう感じ。
ほかのGUIライブラリにするか、無理やり日本語使えるようにするか迷いどころだ。—
カシワバユキ (@yuki_kashiwaba) 2019年1月10日
しばらく途方にくれていたのですが、上のツイートをしたところ、Kivyのドキュメントの翻訳を手がけている激強エンジニアの方から、「日本語フォントをインストールすればいけるよ」というアドバイスをいただくことができました。
そこで紹介してもらったこのサイトを参考にしたところ、あっさり解決することができました。
Kivyで日本語の表示ができず困っていたのですが、Kivyのドキュメントの翻訳もされてる激強エンジニアの方(@dario_okazaki)にアドバイスもらえたおかげであっさり解決しました!!
ほんとにありがたい。。ちなみに日本語フォント導入で解決しました。 https://t.co/9yJ8mYpPRe#Python
#Kivy pic.twitter.com/q90k6ufxgr—
カシワバユキ (@yuki_kashiwaba) 2019年1月11日
完全に余談なんですが、やっぱりメンターって大事ですね。
個人的には独学は独学でしか身につかないことがあるのでおすすめなのですが、やっぱり成長が遅いのと、正しい知識を得られないというデメリットは大きいと思います。
誰か指導料払うので、僕のメンターになってくれる方いないですかね?
ゆるぼしておきます笑
入力された文字列を受け取る
さて、実はTextInputオブジェクトを作って、日本語表示させただけでは、まだユーザーの入力を受け取ることができません。
まずは、入力された文字列を取得するためのクラスメソッドを作ります。
def on_enter(self, ti): print("on_enter[%s]" % (ti.text))
シンプルですね。
あとはこの一文を書けばOKです。
ti.bind(on_text_validate=self.on_enter)
bindメソッドを使って、Enterキーをトリガーに入力された文字列を取得するメソッドを起動してます。
bindメソッドは、ユーザがGUIに対して行った入力操作をトリガーにして、何らかの処理を行うよう定義するメソッドです。
イベントリスナーみたいなものでしょうか。
まとめ
さて、これで一通りポイントはまとめ終わりました。
画面実装のKivy言語などはまだ慣れないですが、Kivy自体は使いやすく、学習コストはそこまで高くないかもなぁと言うのがKivy3日目の感想です。
少なくとも初めてHTML学んだときの方がはるかに苦戦した気がします笑
Kivyをいじってるのはとても楽しいのですが、日本語対応しかり、あと一歩物足りない感じがあります。
このもやもやの原因は何なのでしょうか?
とはいえ、どうやらKivyでAndroidアプリ開発ができると聞いてテンションが上がっています。
KivyアプリケーションをGoole Play Storeで公開する為に #2 APKを作成
なんだかんだスマホアプリはチャレンジしたい分野なので楽しみですね。