🙄

macOS の matplotlib (MacPorts) で X11 を要求される問題を回避する

2022/07/13に公開

背景

matplotlib を使っているコードで、プロットを表示する際に X11 を要求するものがあった。具体的には、X11を起動していないと以下のようなメッセージ(couldn't connect to display ":0")が表示される。

% python pyplaut.py
Traceback (most recent call last):
  File "/Users/funa/Downloads/auto/07p/python/auto/graphics/pyplaut.py", line 605, in <module>
    runner = PyPlautInteractiveConsole(exportFunctions(), b, s)
  File "/Users/funa/Downloads/auto/07p/python/auto/graphics/pyplaut.py", line 26, in __init__
    root=Tkinter.Tk()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/tkinter/__init__.py", line 2299, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: couldn't connect to display ":0"

~/.matplotlib/matplotlibrc に以下を記述しても X11 を要求されてしまう。

backend: MacOSX

解決方法

X11.app を起動しておけば動くが、できれば macOS native なGUIで使いたい。stackoverflow のコメント が役に立った。

原因を調べてみたところ、matplotlib で

matplotlib.use('TkAgg')

の様に TkAgg 決め打ちで書かれているコードの場合、上記問題が発生していた。MacPorts の tkデフォルトで X11 を使用する ことになっていたので、 -x11 +quartz を付けてインストールし直せばよい(+x11+quartz は conflict するので同時に設定できない)。

% sudo port install tk -x11 +quartz

これで AUTO のプロットも macOS native なGUIで表示されるようになった。
tkinter

考察

tk +x11 が必要な portsを使う際には、以下の様なコマンドを実行して tk の variant を切り替えればよいか。

% sudo port deactivate tk @8.6.12_0+quartz
% sudo port   activate tk @8.6.12_0+x11

Discussion