Python
python3
Kivy
pythonDay 25

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

要約

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

注意

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

実行結果

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

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

日本語入力の問題について

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

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

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

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

日本語入力中の文字が表示されない理由

以前の投稿でも記載しましたが、「日本語入力中のイベントをSDL2では発行しているがKivy側ではキャッチできていない」が原因です。

日本語を表示する方法

SDLのText editのイベントをKivy側でキャッチするイベントの処理を追加します。

以前、提出されたプルリクが採用されていないので、ローカルPCでKivyの本家のリポジトリにマージしたものをpipで入れる必要があります。

マージの手間を省くために本線にマージしたものをzipにしてgithubに上げました。

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

日本語入力の方法

Use development Kivy(Kivyの開発バージョンを使用する)のやり方を基本にしています。

1. Visual C++ 2015 BuildToolsをダウンロードしてインストールします。

2. 環境変数PathにインストールしたBuildToolsのパスを通します。例は以下

C:\Program Files\Microsoft VS Code\bin

3. コマンドプロンプト[cmd]を立ち上げます。

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

set USE_SDL2=1
set USE_GSTREAMER=1

※PowerShellだと以下になります 

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

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

python -m pip install --upgrade pip wheel setuptools

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

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

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

GithubからZIPをダウンロードします。
zipを展開して、kivy-masterの直下に移動してビルドします

python -m pip install .

8.Kivyを実行します
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を入力する前)の文字が表示されます。

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

Linuxでの動作について

Ubuntuでの動作ですが@水戸う納豆斎さんが試してくださったのですがon_texteditイベントが発生しなかったようです。

今後について

提出したプルリクが採用されるように、再度プルリクを出そうかと思っていますが書き方を含めてアドバイスがありましたらていただきたいです。

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

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

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

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