Kivyで文字入力と日本語対応を実装|Pythonでデスクトップアプリ開発

2019-07-11

引き続きKivyのドキュメントを中心に勉強して、実装力を上げていきます。
今回は、KivyのTextInputを使って文字入力を受け取るところまで。

Kivyはデフォルトでは日本語フォントが入っておらず、日本語を表示できません。
そのあたりの解決法も合わせてまとめておきます。

今回のゴールはこちら。

もくじ

  1. ソースコード
  2. TextInputオブジェクトをつくる
  3. 日本語を表示させる
  4. 入力された文字列を受け取る
  5. まとめ
  6. 参考

ソースコード

まずは上記の動画の画面を作るコードを貼っておきます。

基本はドキュメントとか、下のリンク先の記事を参考にして作ってます。

Text Input

Kivyの1行入力ボックスの作成方法

  #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のドキュメントの翻訳を手がけている激強エンジニアの方から、「日本語フォントをインストールすればいけるよ」というアドバイスをいただくことができました。

そこで紹介してもらったこのサイトを参考にしたところ、あっさり解決することができました。

完全に余談なんですが、やっぱりメンターって大事ですね。
個人的には独学は独学でしか身につかないことがあるのでおすすめなのですが、やっぱり成長が遅いのと、正しい知識を得られないというデメリットは大きいと思います。

誰か指導料払うので、僕のメンターになってくれる方いないですかね?
ゆるぼしておきます笑

入力された文字列を受け取る

さて、実は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を作成

なんだかんだスマホアプリはチャレンジしたい分野なので楽しみですね。

参考

Text Input

Kivyの1行入力ボックスの作成方法

Kivyアプリに日本語を表示させる

IPAフォント ダウンロードページ

KivyアプリケーションをGoole Play Storeで公開する為に #2 APKを作成