Kivyで日本語入力を行う方法について（実行編）


2018年7月、Kivyの最新のバージョン（1.10.1）がリリースされました。こちらでは本記事の内容の
内容のプルリクが採用されており、IMEが動作して入力中の日本語が表示されるようになりました。

# 要約
PythonのGUIライブリKivyですが、日本であまり使用されていない大きな原因の一つに、日本語の入力中の文字（IME）が開かないという問題があります。
[以前の投稿](https://qiita.com/dario_okazaki/items/8c6953166b336e83e417)では問題の理由とプルリクのお話をしました。
今回はこの問題を解決するにはどうするかという内容になります。


# 注意
2017年現在、Windows,Macでは日本語入力ができることを確認しております。Linux(Ubuntu)では正常に表示されないことが報告されています。

# 実行結果

Windowsでの実行結果は以下の通りです。日本語が入力されると「Text editiing by IME」の左のグレイのラベルに入力中の文字が表示されます。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Kivyの日本語入力のテスト by Windows <a href="https://t.co/KzLFGM2UIW">pic.twitter.com/KzLFGM2UIW</a></p>&mdash; okazaki jun (@dario_okazaki) <a href="https://twitter.com/dario_okazaki/status/945280094120984576?ref_src=twsrc%5Etfw">2017年12月25日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

Macでの実行結果は以下の通りです。Macの場合だと、変換候補も表示されます。
情報を提供してくださったのは[@kouki](https://twitter.com/kouki_outstand)さんです。ありがとうございます。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">mac(high sierra) python3.6で試してみました <a href="https://t.co/PcVhJ0ZUZP">pic.twitter.com/PcVhJ0ZUZP</a></p>&mdash; kouki (@kouki_outstand) <a href="https://twitter.com/kouki_outstand/status/942403153273675776?ref_src=twsrc%5Etfw">2017年12月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 日本語入力の問題について
Kivyの日本語についての問題は2点あります。

１点目はKivyは日本語表示についてはデフォルトの文字コードがRoboto（欧文フォント）なのでそのままでは日本語は正しく表示されません。ただしこの問題は日本語フォントを表示することで表示することが可能です。

２点目はKivyはtextinputを用いて文字入力を行うのですが、日本語入力した場合にIMEが表示されないので入力した文字が確定するまで何が表示されないという問題があります。
例えば日本語で"こんにちは"と入力してもEnterキーが入力されるまで何も表示されません。
ひらがなだけならまだいいですがスペースキーをおして漢字変換を行った場合は変換候補はおろか、いま何の漢字が適用されたかわからないので致命的です。textinputはコピー＆ペーストは可能なのでKivyで日本語の文字入力をしたい場合は例えばメモ帳などで入力した文字をコピーしてtextinputにペーストするというような、Kivy以外のものと併用するという解決策以外は今までありませんでした。

この日本語入力中の問題はandroid以外のOS(windows,Mac,Linux,ios)で発生する問題で、この問題のためにKivyの使用をあきらめた方もいました。

## 日本語入力中の文字が表示されない理由
[以前の投稿](https://qiita.com/dario_okazaki/items/8c6953166b336e83e417)でも記載しましたが、「日本語入力中のイベントをSDL2では発行しているがKivy側ではキャッチできていない」が原因です。

# 日本語を表示する方法
SDLのText editのイベントをKivy側でキャッチするイベントの処理を追加します。

以前、提出された[プルリク]((https://github.com/kivy/kivy/pull/5109))が採用されていないので、ローカルPCでKivyの[本家のリポジトリ](https://github.com/kivy/kivy)にマージしたものをpipで入れる必要があります。

マージの手間を省くために本線にマージしたものをzipにして[github](https://github.com/okajun35/kivy)に上げました。

詳しい手順は以下の通りです。

## 日本語入力の方法
[Use development Kivy(Kivyの開発バージョンを使用する)](https://pyky.github.io/kivy-doc-ja/installation/installation-windows.html#use-development-kivy)のやり方を基本にしています。


１. [Visual C++ 2015 BuildTools](http://landinghub.visualstudio.com/visual-cpp-build-tools)をダウンロードしてインストールします。

２. 環境変数PathにインストールしたBuildToolsのパスを通します。例は以下
```
C:\Program Files\Microsoft VS Code\bin
```
３. コマンドプロンプト[cmd]を立ち上げます。

４. 環境変数を設定します

```
set USE_SDL2=1
set USE_GSTREAMER=1
```
※PowerShellだと以下になります　

```
$env:USE_SDL2 = 1
$env:USE_GSTREAMER = 1
```

５. PiPとwhileを最新にします

```
python -m pip install --upgrade pip wheel setuptools
```

６. 依存関係をインストールします

```
python -m pip install cython docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew kivy.deps.gstreamer kivy.deps.glew_dev kivy.deps.sdl2_dev kivy.deps.gstreamer_dev
```

７. Kivyのビルドをします。 

[Github](https://github.com/okajun35/kivy)からZIPをダウンロードします。
zipを展開して、kivy-masterの直下に移動してビルドします

```
python -m pip install .
```

8.Kivyを実行します
[kivy_textedit_sample](https://github.com/Adachinski/kivy_textedit_sample)を実行(main.py)して起動時のログを確認してください。

※TextとWindowのでProviderがSDL2になっていることを必ず確認してください。Pygameが表示されている場合は環境変数の設定がおかしいので見直してください。

```
[INFO   ] [Text        ] Provider: sdl2
[INFO   ] [OSC         ] using <thread> for socket
[INFO   ] [Window      ] Provider: sdl2

```

この状態で実行すると、TextinputIMEの隣のラベルに全角（日本語入力）で未確定の文字（Enterを入力する前）の文字が表示されます。

注意事項としては、スペースキーを押して変換はできますが変換候補の一覧は表示されません。また入力ですが一度に入力できる文字数は最大１５文字までです。


# Linuxでの動作について

Ubuntuでの動作ですが[@水戸う納豆斎](https://twitter.com/dive_into_py)さんが試してくださったのですがon_texteditイベントが発生しなかったようです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">実は私はまだ日本語入力に成功していなくて、今日あのプルリクの通りの修正をしてkivyをbuildしたのですが、やはり日本語入力はできませんでした。  <a href="https://twitter.com/dario_okazaki?ref_src=twsrc%5Etfw">@dario_okazaki</a> さんはlinuxでは成功していますか?</p>&mdash; 水戸う納豆斎 (@dive_into_py) <a href="https://twitter.com/dive_into_py/status/942454479537938432?ref_src=twsrc%5Etfw">2017年12月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">on_textinput, on_textedit, on_keyboard イベントを監視してみた所、半角全角を押した時にon_keyboardイベントが起こるのは確認できましたがIMEに変化は起こらず、常に直接入力の状態(Aキーを押すと即座にaが入力される)でon_texteditイベントが起こることはありませんでした。 この後も色々...</p>&mdash; 水戸う納豆斎 (@dive_into_py) <a href="https://twitter.com/dive_into_py/status/943085605562466304?ref_src=twsrc%5Etfw">2017年12月19日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 今後について

~~提出した[プルリク]((https://github.com/kivy/kivy/pull/5109))が採用されるように、再度プルリクを出そうかと思っていますが書き方を含めてアドバイスがありましたらていただきたいです。~~

2018年1月にプルリクがマージされました。
マージされた理由は中国の方（？）がマージしてほしいという強い要望をコメントしてくださったからです。やはり書きかたってあるんだなと思いました。

~~次の目標としてはSDLからのイベントはキャッチしたのでwindowSDLでイベントを追加するプルリクを出そうと思っています。~~
2018年5月19日まーじされました。Kivy1.10の次のバージョンからはIMEが動作して入力中の日本語が表示されます。


また、入力中の文字を別のラベルに表示するのでなくtextinputの中で、入力中の文字を[]を使って表示しようとコードを書いています。現在はこんな感じです。

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">ちなみにこの内容を改良して作成中のコードの内容はこちらです <a href="https://t.co/NTOb5lh9fx">pic.twitter.com/NTOb5lh9fx</a></p>&mdash; okazaki jun (@dario_okazaki) <a href="https://twitter.com/dario_okazaki/status/942386012751147008?ref_src=twsrc%5Etfw">2017年12月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


動画を見ると一見うまくできているように見えますが、バックスペースキーを押したり、実行中のwindowをから離れて再度入力しようとすると表示がおかしくなります。

# 補足
windowsの場合、拡張して日本語入力中の変換まで作った人がいたので共有します
https://qiita.com/nawonaototomousu/items/0a2a5e22aeb82535532a

DLLは以下にあります
https://github.com/Naotonosato/MilletPie

作った人の紹介：https://weekly.ascii.jp/elem/000/000/436/436756/