WSL+pyenv環境でtkinterモジュールを使うときに詰まったこと

環境

OS:Ubuntu 18.04.4 LTS (Bionic Beaver) (WSL)

Python:3.8.2

pyenv: 1.2.17-2-ga8ca63fc

 

最初に起こったこと:tkinterモジュールが見つからない

(venv) yukyan@Yukyan-PC:~/workspace/project/python/drawing_chat$ python3 -m tkinter
Traceback (most recent call last):
File "/mnt/d/linux_home/.pyenv/versions/3.8.2/lib/python3.8/runpy.py", line 184, in _run_module_as_main
mod_name, mod_spec, code = _get_module_details(mod_name, _Error)
File "/mnt/d/linux_home/.pyenv/versions/3.8.2/lib/python3.8/runpy.py", line 143, in _get_module_details
return _get_module_details(pkg_main_name, error)
File "/mnt/d/linux_home/.pyenv/versions/3.8.2/lib/python3.8/runpy.py", line 110, in _get_module_details
__import__(pkg_name)
File "/mnt/d/linux_home/.pyenv/versions/3.8.2/lib/python3.8/tkinter/__init__.py", line 36, in <module>
import _tkinter # If this fails your Python may not be configured for Tk
ModuleNotFoundError: No module named '_tkinter'

 

tkinterモジュールが見つからないと出る。

これはpyenvでPythonをインストールする際に tk-dev が無いのが原因なので、tk-devをインストールした上で再度インストールする。

 

$ pyenv uninstall インストールしたいPython

$ sudo apt install tk-dev

$ pyenv install インストールしたいPython

 

 

これで実行が出来るようになる。

 

次に起こったこと:ウィンドウ上の日本語が文字化けする

import tkinter
from tkinter import ttk

main_window = tkinter.Tk()
main_window.title('test')
main_window.geometry('100x100')

main_frame = ttk.Frame(main_window)
main_frame.grid(column=0, row=0, sticky=tkinter.NSEW, padx=5, pady=10)

label = ttk.Label(main_frame, text="テスト")
label.grid(column=0, row=0, pady=0, padx=0)

main_window.mainloop()

 

「テスト」というラベルを表示させるプログラム(上記)を書いたが、実際に実行すると以下のように表示されてしまう。

 

f:id:nexem:20200718222538p:plain

 

これはUbuntu上に日本語が表示できるフォントが入っていないことが原因である。Windows10とWSL上のフォントは同期されていないのだ。

fc-listコマンドでWSL上にインストールされているフォント一覧を確認できる。

 

f:id:nexem:20200718222807p:plain

fc-listの実行結果

 

Windows10のフォントをWSL上で使えるようにするには 、/etc/fonts/local.conf というファイルを作成し、以下のように書き込む。ルートユーザーでしか書き込めないので、sudoを使う。

 

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<dir>/mnt/c/Windows/Fonts</dir>
</fontconfig>

 

こうすることによって、Windows10上のフォント(C:\Windows\Fonts)も読み込まれるようになり、再度プログラムを実行すると

 

f:id:nexem:20200718223334p:plain

 

日本語が表示されるようになった。

 

参考:

https://github.com/pyenv/pyenv/issues/94

https://www.atmarkit.co.jp/ait/articles/1812/27/news033.html