本記事は以下を目的としております。
WSL環境でGUIアプリを立ち上げようとした時に発生するエラーの解消方法を、Tkinterを例に紹介します。
PythonライブラリのTkinterを使用して、GUIアプリを作成しようとしたところ、
TclError: no display name and no $DISPLAY environment variableというエラーメッセージが表示され、詰まってしまいました。
今回はWSL1のPythonでTkinterを使用するためにしたことをまとめます。
環境
Windows 10 Home 2004
WSL1 Ubuntu 20.04 LTS
Pyenv 2.0.1-6-g5f751985
Python 3.8.2
VcXsrvをインストール
WSL1は標準ではコマンドライン操作しかできないので、GUIアプリを描画するためのXサーバー(Window X Server)を導入する必要があります。
今回は無償で使用できるVcXsrvを利用します。
インストールからスタートアップへの登録までの手順を記載します。
こちらからダウンロードをしてください。 ダウンロードが完了したらインストーラーを起動します。
インストール時のオプションはひとまず標準で進めます。
任意の場所にインストールします。
Multiple windowsを選択します。
Start no clientを選択します。
Disable access controlにチェックします。
Save configurationをクリックしてconfig.xlaunchを作成します。
VcXsrvのインストールは完了です。次にスタートアップに登録します。
先ほど作成したconfig.xlaunchをVcXsrvのインストール先のフォルダに移動します。
次にWindowsのスタートアップフォルダを開きます。
フォルダのパスに、
shell:startup
と入力するとスタートアップフォルダを開けます。
デスクトップに作成されたXLaunchのショートカットをスタートアップフォルダに移動します。
その後、ショートカットのプロパティを開き、ショートカットタブのリンク先の末尾に
-run config.xlaunchを追加し、適用、OKをクリックするとスタートアップへの登録が完了します。
環境変数DISPLAYを設定
環境変数DISPLAYを.bash_profileに設定します。
これを設定しないとGUIが描画されません。
.bash_profileに以下のコマンドを入力し保存します。
export DISPLAY=:0.0
以上で、設定は完了です。
動作チェック
表示できるかどうか、アプリを立ち上げて確認します。
from tkinter import * from tkinter import ttk root = Tk() root.title("Hello Tkinter") mainframe = ttk.Frame(root) mainframe.grid(column=0, row=0) ttk.Label(mainframe, text="Hello Tkinter").grid(column=0, row=0) root.mainloop()以上のコードをコードエディタ等でhello.pyとして保存します。
python hello.py保存した.pyを実行します。
画像の通りに表示されたら、問題無く動作します。お疲れさまでした。