普段、PythonをWSL2でUbuntu環境を作り、その上でPyenv + Pipenv環境を構築して使っているのですが、tkinter等のGUIプログラムを動かす必要があったので、どのように設定を行ったのかをまとめました。
ちなみに、WSL2環境でGUIプログラム (この場合tkinter)を動かそうとすると、_tkinter.TclError: no display name and no $DISPLAY environment variable
とエラーが出てしまいました。
(余談: WSL (WSL1)の場合、下記で紹介するXming Serverのインストール (Additional parametersの設定なし)と、Ubuntu等のWSL環境での環境変数の変更だけで対応できるようですが、WSL2の場合、仕様が異なるため、複雑な手順を踏まないといけないようです。)
Windows側の対応
GUIプログラムを動かすにあたって、Windows側にXming Serverなるものをインストールし、GUIの画面出力をできるようにします。
Xming Serverを自分の環境では使いましたが、VcXsrvの方が使いやすいかもです。 (機能は一緒)
インストールしたら、Xming Serverの場合はXLaunch、VcXsrvの場合はそのままアプリを立ち上げると設定画面のようなものが出ます。そのままなにも変更せずにNextを押し続けると以下のような画面が出てくると思うので、Additional parameters for Xmingに-ac
と入力て、そのままNextを押し続けて設定を完了させます。
すると、タスクバー (右側のバックグラウンドアプリの場所)にXming Serverのアプリが起動していると思うので、マウスオーバーして記されている文字列を確認します。下記の画像のように、:0.0
などの数字を確認しておいてください。 (あとで使います)
WSL2環境 (Ubuntu)の設定
今回はUbuntuを使用します。
GUIプログラムを動かすためにDISPLAYという環境変数を設定してあげる必要があります。
環境によって異なりますが、今回は.bash_profile
に環境変数を設定してあげます。
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0
これは、DISPLAYという環境変数にXming Serverを指定するものなのですが、通常はDISPLAY=:0.0
のような形式で設定できますが、WSL2のネットワークの仕様変更により (localhostでの接続ができなくなるため)Windows側のIPアドレスを指定する必要があるので、長いコマンドではありますが、このように設定してあげる必要があります。