Python+Kivy入門

Kivyで日本語を表示する4つの方法(システムフォント変更できます)

この記事は約14分で読めます。

Kivyアプリの標準仕様では日本語を使うことができません。なので日本語が使えるようにする必要があります。Kivyシステムの標準フォントを変更する方法はあるんですが少しややこしいため他の方法も併せて説明します。

この記事は前回のインストール方法の別ページになります

kivyで日本語を使えるようにするには

標準ではKivyのアプリケーションを作ると下図のように文字化けします。

Kivyアプリケーションの文字化け

アプリケーションを作る時には、標準でインストールされていないフォントを使いたい場合は、個別にフォントファイルを準備する必要があります。フォントファイルはその種類毎に1つのファイルです。例えば明朝体とゴシック体を使いたければ2つのフォントファイルが必要になります。

Kivyにはシステムの標準フォントを変更する方法があるんですが、ちょっとややこしいです。公式サイトの説明には詳しく載っていないため浸透していないみたいですね。システムの標準フォントを変更する以外にも方法があって日本語化するには以下の4つの方法があります。

  1. 日本語ライブラリをインストールする
  2. kivyシステムのデフォルトフォントを変更する。(定義したアプリ内のみ有効)
  3. UIのプロパティでフォントファイルを指定する
  4. kivyシステムの標準フォントを変更する。(システム設定自体を変更する)

①の方法では、コードの中でこのライブラリをimportする必要があります。
②の方法では、コードの中で標準フォントを変更する定義を書きます。(定義したアプリ内のみ有効)
③の方法では、コードの中でクラスのプロパティで指定のフォントファイルが使えるように定義します。
④の方法は最初に設定してしまえば、kivy標準フォントを使う限りコードに影響を与えません。ただし、kivyのバージョンを変更した場合毎回この設定を行う必要があります。

①~③の方法は毎回コードに記述しなくてはいけないので面倒です。それでも簡単で安全に使いたい場合は①をお勧めします。アプリごとにフォントを変えたい場合は②と③をお勧めします。毎回コードに記述するのが面倒な場合は④をお勧めします。モバイルアプリを作成する場合は②の方法をお勧めします。

japanize-kivyライブラリのインストール

japanize-kivyライブラリはIPAexゴシックフォントのみ使えますがテストするには十分かと思います。

IPAexを使う場合、ライセンス規約に同意する必要があります。またkivyアプリケーションを配布する場合にはIPAexライセンス規約を記載する必要があります。ライセンス規約に同意する場合のみインストールしてください。

仮想環境を有効にした状態で行って下さい。

①pipコマンドでjapanize-kivyをインストールする。

pip install japanize-kivy

➁pythonコードでjapanize_kivyをインポートします

# .pyファイル
import japanize_kivy

kivyシステムの標準フォントを変更する(アプリ内のみ有効)

LabelBase.register()でシステムが使う標準フォントのデフォルト値を指定のフォントファイルに変更します。こちらは定義したアプリ内のみ有効です。

日本語フォントのファイルを用意します。

OSのフォントフォルダーから取ってくる場合は必ずファイルのコピーをしてください。ファイルの移動をしないでください。

①日本語フォントファイルを用意し、任意のフォルダ内に保存します。ここではプロジェクトフォルダー(PythonWork)直下に「fonts」フォルダーを作成し、その中にフォントファイルを置いています。

日本語化するフォントファイルをフォルダーに置く

②コードの中で下記を記述します。謎の呪文だと思ってアプリ毎に定義してください。

from kivy.core.text import LabelBase, DEFAULT_FONT
import os

font_path = os.path.join(os.path.dirname(__file__), 'fonts','NotoSansJP-Regular.ttf')
LabelBase.register(DEFAULT_FONT,font_path)

サンプルコード

set_jp_font1.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.core.text import LabelBase, DEFAULT_FONT # 追記する
import os # 追記する

# 追記する
font_path = os.path.join(os.path.dirname(__file__), 'fonts','NotoSansJP-Regular.ttf')
LabelBase.register(DEFAULT_FONT,font_path)

class RootWidget(BoxLayout):    
    pass
        
class SetJpFont1(App):
    def build(self):
        return RootWidget()

if __name__ == '__main__':
    SetJpFont1().run()

setjpfont1.kv

<RootWidget>:
    orientation: 'vertical'
    
    Label:
        text: "fontを変えたよ"
    Button:
        text: "日本語になったよ"

kvファイルを使用した場合でも、kvファイルの方で再度フォントを指定する必要はありません。ウィジェットに対してフォントを指定してるのではなくシステムのデフォルトフォントを指定しているためです。

os.path.dirnameでコードが置いてあるフォルダを取得しています。os.path.joinで対象のファイル迄のパスを引数に指定します。

project folder  
 ∟app folder  これより上の階層をos.path.dirnameで取得
  ∟fonts folder  これより下の階層をos.path.joinの引数にパスを指定
   ∟font_file.ttf
  ∟main.py
  ∟app.kv

UIクラスのプロパティでフォントファイルを指定する

日本語フォントのファイルを用意します。

OSのフォントフォルダーから取ってくる場合は必ずファイルのコピーをしてください。ファイルの移動をしないでください。

①日本語フォントファイルを用意し、任意のフォルダ内に保存します。ここではプロジェクトフォルダー(PythonWork)直下に「fonts」フォルダーを作成し、その中にフォントファイルを置いています。

日本語化するフォントファイルをフォルダーに置く

②ウィジェットのfont_nameプロパティに、用意した日本語フォントのパスを指定します。ここではLabelウィジェットにfont_nameプロパティを記述しています。

font_name = "ここにフォントファイルのパスを書く(拡張子も入れて下さい)"

※Pangoライブラリを使用してfont_familyプロパティを使う方法もあります。

サンプルコード1

SetJpFont2.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
import os # 追記する

class RootWidget(BoxLayout):    
    pass
        
class SetJpFont2(App):
    # 追記する
    font_path = os.path.join(os.path.dirname(__file__), 'fonts','meiryo.ttc')

    def build(self):
        return RootWidget()

if __name__ == '__main__':
    SetJpFont2().run()

SetJpFont2.kv

<RootWidget>:
    orientation: 'horizontal'
    
    Label:
        text: "meiryoを使うよ"
        font_name: app.font_path 
    Button:
        text: "fontを指定してないよ"

このコードを実行すると下図のように表示されます。コードではLabelにはフォントを指定していますが、Buttonにはフォントを指定していません。

font_nameプロパティを指定した場合と指定していない例

このようにUIに対して1つずつフォントを指定しなくてはいけないのでかなり面倒です。本来の用途としては一部の文字列のフォントを変更したい時に使います。しかし、kvファイルを使用した場合は一括でフォントを変更する事ができます。(それでも面倒かもしれません)

サンプルコード2

set_jp_font3.py

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
import os # 追記する

class RootWidget(BoxLayout):   
    pass
        
class SetJpFont3(App):
     # 追記する
    font_path = os.path.join(os.path.dirname(__file__), 'fonts','NotoSansJP-Regular.ttf')

    def build(self):
        return RootWidget()

if __name__ == '__main__':
    SetJpFont3().run()

setjpfont3.kv

<CustomLabel@Label>:
    font_name: app.font_path
<CustomButton@Button>:
    font_name: app.font_path

<RootWidget>:
    orientation: 'vertical'
    
    CustomLabel:
        text: app.font_path
    CustomButton:
        text: '一括font指定したよ'

ダイナミッククラスを使ってLabelやButtonを継承して、独自の構成を定義することでそのアプリに使われているLabelやButton全てに同じプロパティが反映されます。

kivyシステムの標準フォントを変更する(システム設定自体を変更する)

この章を見てわからない場合は行わないでください。自己責任でお願いします!


日本人ならいつでも日本語使いたいですよね。毎回同じことを書くのは非常に面倒です。筆者にとってはかなり苦痛なので色々奮闘してみました。

では本題に入ります。kivyのシステム設定を変更するには2つの方法があります

  1. 設定ファイルを直接変更する
  2. pyファイルから設定ファイルを変更するConfig.set()を定義する

設定ファイルは「configファイル」や「iniファイル」と呼ばれています。

➁の場合はConfig.set()で値を変更したら設定ファイルを変更してくれるメソッドです。どちらの方法を選択しても設定ファイルを変更する事になります。②で値の記述を間違えてしまった場合、結局設定ファイル自体を変更することになるので、①の方法で説明します。

Kivyのシステムではregular、italic、bold、bolditalicの4つのフォントファイルを使用しています。アプリ内のテキストスタイルに斜体や太字を設定したい場合このフォントファイルを使用しています。日本語ではitalic単体のファイルはおそらく無いので斜体は使用できません。regularとboldの単体のフォントファイルは有ると思うので両方あるフォントを使用することをお勧めします。regular以外は必要ないという方は問題ありません。

値の記述を間違えるとkivyアプリを起動しようとすると、エラーが発生して起動できません。設定ファイルは必ずバックアップを取ってください。

これを行う場合は仮想環境で行ってください

①日本語フォントのファイルを用意します。

OSのフォントフォルダーから取ってくる場合は必ずファイルのコピーをしてください。ファイルの移動をしないでください。

➁任意のフォルダーにフォントファイルを置きます。ここではkivyのシステムフォントが置いてあるフォルダーにしました。またフォントは標準フォントに「UDDigiKyokashoN-R.ttc」、太字フォントに「UDDigiKyokashoN-B.ttc」を使用します。kivyのシステムフォントの場所は下記になります。

[(仮想フォルダー)\Lib\site-packages\kivy\data\fonts]

Kivyシステムフォントの場所

③設定ファイルは下記の場所にあります。下記の場所になければ「.kivy」もしくは「config.ini」でエクスプローラーで検索してみてください。Linuxの場合は多分、一度起動しないと「.kivy」フォルダーが作成されません。

Windowsの場合:[C:\Users\ユーザー名\.kivy\config.ini]
Macの場合:[/Users/ユーザー名/.kivy/config.ini]
Linuxの場合:[/home/ユーザー名/.kivy/config.ini]

[config.ini]ファイルをコピペしてバックアップを取ります。

Kivyのconfigファイルの場所

④configファイルをメモ帳などで開いて下記の値を編集します。

[kivy]セクションの[default_font]項目

これの2番目の要素に用意した標準フォントファイルのパスを変更します。拡張子まで入れて下さい。(ttfやttcなど色々あります)ここでは「UDDigiKyokashoN-R.ttc」フォントファイルに変更します。(別のフォルダーにした場合はパスも変更してください)

同じように太字のフォントファイルも変更します。太字は4番目の要素を変更します。ここでは「UDDigiKyokashoN-B.ttc」フォントファイルに変更します。

;「;(セミコロン)」でコメントできます。
;default_font = ['Roboto', 'data/fonts/Roboto-Regular.ttf', 'data/fonts/Roboto-Italic.ttf', 'data/fonts/Roboto-Bold.ttf', 'data/fonts/Roboto-BoldItalic.ttf']
;               ↓         ↓
default_font = ['Roboto', 'data/fonts/UDDigiKyokashoN-R.ttc', 'data/fonts/Roboto-Italic.ttf', 'data/fonts/UDDigiKyokashoN-B.ttc', 'data/fonts/Roboto-BoldItalic.ttf']

⑤1番目の要素は名前をつけているだけです。任意の名前を入力してください。変更しなくても影響はありません。多分。

default_font = ['Kyokasho', 'data/fonts/UDDigiKyokashoN-B.ttf', 'data/fonts/Roboto-Italic.ttf', 'data/fonts/Roboto-Bold.ttf', 'data/fonts/Roboto-BoldItalic.ttf']

⑥上書き保存します。アプリを起動すると日本語になってます。

下図はこの章の方法で日本語化して、Windowsアプリケーションのexeファイルに変換したアプリです。フォントファイルを含めなくても日本語になってました。

Kivyシステムを日本語化してexeン変換

モバイルアプリの場合は残念なことにコード内にフォントを指定して、フォントファイルを含める必要があります。

Androidに変換したアプリ

kivyの標準フォントの仕様

何故2番目の要素なのか?を説明します。設定ファイルの[default_font]は5つの要素がありますが、これを読み込んでいるLabelBase.register()の引数が5つになってます。なので追記するとエラーになります。1番目の要素は名前で使われているので、フォントファイルは4つまでストック可能ということです。

Kivyのregisterメソッドの抜粋
  1. 要素1:name → name
  2. 要素2:FONT_REGULAR → fn_regular
  3. 要素3:FONT_ITALIC → fn_italic
  4. 要素4:FONT_BOLD → fn_bold
  5. 要素5:FONT_BOLDITALIC → fn_bolditalic

そして要素2~5までは[0]~[3]の配列に格納されていて、default_fontの初期値は[0]のFONT_REGULARになっています。なので2番目の要素を変更しました。

kivyのバージョンを変更した場合、毎回この設定を行う必要がありますので注意してください。

Androidでのテキスト入力の日本語対応

AndroidアプリのTextInput入力ですが、筆者はずっとAndroidでの日本語入力はできないものだと思ってたんですが、標準のGbordキーボードでは相変わらず入力できませんが、Simejiキーボードでは入力可能です。Androidバージョン15、Simeji21.4で確認しました。絵文字や環境依存文字は直接は入力できません。難有りですが一応日本語対応はされたようです。個人用なら何とか使えそうです。

Kivy-androidアプリ日本語入力を実機で確認

Comment

タイトルとURLをコピーしました