WSL2のUbuntu 20.04でPyGObjectを使う

2020年8月13日WSL 2Linux,Python,Ubuntu,Windows,WSL2

WSL2(Windows Subsystem for Linux)のUbuntu 20.04で、PyGObjectを動かしてみました。

PyGObjectは、GTK系のGUIを動かすためのPython用ライブラリです。

この記事では、PyGObjectと関連ライブラリのインストールと、うまく動かなかった場合のトラブルシューティングを紹介します。

前準備

この記事は、Windows 10にWSL2を入れて、GUIアプリが動かせる状態から説明します。ここまでの設定は、こちらの記事で紹介していますので、よければご覧ください。

PyGObjectのインストール

PyGObjectは、Pythonのpip3を使ってインストールします。ですが、先日pip3でインストール済みのライブラリを表示したところ、既に3.36.0がインストールされていたようです。インストール済みライブラリの確認は、こちらの記事で紹介しています。

もしインストールされていなかった場合は、次のコマンドでpip3を入れて、PyGObjectをインストールしてください。

$ sudo apt install python3-pip
$ python3 -m pip install PyGObject

必要ライブラリのインストール

続いて、PyGObjectを動かすのに必要なライブラリをインストールします。

$ sudo apt install python3-gi gobject-introspection gir1.2-gtk-3.0 xbitmaps
[sudo] password for username:
Reading package lists... Done
Building dependency tree
Reading state information... Done
python3-gi is already the newest version (3.36.0-1).
python3-gi set to manually installed.
The following additional packages will be installed:
  adwaita-icon-theme at-spi2-core fontconfig gir1.2-atk-1.0 gir1.2-freedesktop gir1.2-gdkpixbuf-2.0 gir1.2-pango-1.0
  gtk-update-icon-cache hicolor-icon-theme humanity-icon-theme libatk-bridge2.0-0 libatk1.0-0 libatk1.0-data
  libatspi2.0-0 libavahi-client3 libavahi-common-data libavahi-common3 libcairo-gobject2 libcairo2 libcolord2 libcups2
  libdatrie1 libepoxy0 libgdk-pixbuf2.0-0 libgdk-pixbuf2.0-bin libgdk-pixbuf2.0-common libgraphite2-3 libgtk-3-0
  libgtk-3-bin libgtk-3-common libharfbuzz0b libjbig0 libjpeg-turbo8 libjpeg8 liblcms2-2 libpango-1.0-0
  libpangocairo-1.0-0 libpangoft2-1.0-0 libpangoxft-1.0-0 librest-0.7-0 librsvg2-2 librsvg2-common libsoup-gnome2.4-1
  libthai-data libthai0 libtiff5 libwayland-cursor0 libwayland-egl1 libwebp6 libxcb-render0 libxcb-shm0 libxkbcommon0
  python3-mako python3-markdown python3-packaging python3-pygments python3-pyparsing ubuntu-mono
Suggested packages:
  colord cups-common gvfs liblcms2-utils librsvg2-bin python3-beaker python-mako-doc python-markdown-doc
  python-pygments-doc ttf-bitstream-vera python-pyparsing-doc
The following NEW packages will be installed:
  adwaita-icon-theme at-spi2-core fontconfig gir1.2-atk-1.0 gir1.2-freedesktop gir1.2-gdkpixbuf-2.0 gir1.2-gtk-3.0
  gir1.2-pango-1.0 gobject-introspection gtk-update-icon-cache hicolor-icon-theme humanity-icon-theme
  libatk-bridge2.0-0 libatk1.0-0 libatk1.0-data libatspi2.0-0 libavahi-client3 libavahi-common-data libavahi-common3
  libcairo-gobject2 libcairo2 libcolord2 libcups2 libdatrie1 libepoxy0 libgdk-pixbuf2.0-0 libgdk-pixbuf2.0-bin
  libgdk-pixbuf2.0-common libgraphite2-3 libgtk-3-0 libgtk-3-bin libgtk-3-common libharfbuzz0b libjbig0 libjpeg-turbo8
  libjpeg8 liblcms2-2 libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0 libpangoxft-1.0-0 librest-0.7-0 librsvg2-2
  librsvg2-common libsoup-gnome2.4-1 libthai-data libthai0 libtiff5 libwayland-cursor0 libwayland-egl1 libwebp6
  libxcb-render0 libxcb-shm0 libxkbcommon0 python3-mako python3-markdown python3-packaging python3-pygments
  python3-pyparsing ubuntu-mono
0 upgraded, 60 newly installed, 0 to remove and 0 not upgraded.
Need to get 14.9 MB of archives.
After this operation, 73.0 MB of additional disk space will be used.
Do you want to continue? [Y/n]

いろいろ関連ソフトもインストールされますので、少し時間がかかります。

これで準備完了です。テスト用のスクリプトを実行してみたいと思います。下記のスクリプトをどこかに保存します。今回はC:\ProgramFiles\wsl\scripts\PyGObject-test.pyに保存しました。(このスクリプトは、こちらのページのコードを元に、日本語に改変したものです)

#!python3
#参考サイト:https://python-gtk-3-tutorial.readthedocs.io/en/latest/introduction.html#extended-example

import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk


class MyWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title="ハロー ワールド")

        self.button = Gtk.Button(label="ここをクリックしてください")
        self.button.connect("clicked", self.on_button_clicked)
        self.add(self.button)

    def on_button_clicked(self, widget):
        print("クリックされました")


win = MyWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

WSLのUbuntu 20.04を開いて、上記スクリプトを実行してみます。

$ /mnt/c/ProgramFiles/wsl/scripts
$ python3 PyGObject-test.py

すると、下記のような小さいウィンドウが出てきます。文字化けせずに表示されて、ボタンクリックで端末上に文字が表示されたら、正常に動いています。これでインストール完了です。

トラブルシューティング

ValueError: Namespace Gtk not availableというエラーで動かない

GTK系のライブラリが入っていません。上記のapt installを行ってください。

libGL errorというエラーで動かない

libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast

というエラーで起動できない場合は、Windows側で動かしているVcXsrvの設定を確認してみてください。VcXsrvの追加パラメーターに「-nowgl」を追加すると、動くようになると思います。

日本語が文字化けする

WSL2側に日本語のフォントが入っていません。

こちらの記事で、WSL2で日本語を扱う場合の設定を紹介していますので、ご覧ください。

正しく表示されるが、端末上にConnection refusedというエラーが出てくる

正しくウィンドウは表示されるものの、端末上に

(PyGObject-test.py:20397): dbind-WARNING **: 19:30:17.527: Couldn't connect to accessibility bus: Failed to connect to socket /tmp/dbus-DEfAmtRMWy: Connection refused

というエラーが出てくる場合があります。

このエラーは無視しても差し支えないらしいですが、環境変数を設定すると、このエラーを非表示にできます。.bashrcに環境変数を追加するため、次のコマンドを実行します。

$ echo 'export NO_AT_BRIDGE=1' >> ~/.bashrc

これでbashを再起動すると、エラーがなくなると思います。

参考サイト

この記事は、これらのサイトを参考にさせていただきました。