Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
6
Help us understand the problem. What is going on with this article?
@cclef

Mac上のdockerでPythonのtkinterを使えるようにする

More than 1 year has passed since last update.

背景

Pythonの勉強用に構築したdocker環境でtkinterを使ったGUIプログラムを作ったところ、うまく動作しませんでした。検索してもなんとなく同様の問題を記載されているページはあったものの、そのものズバリなページにヒットしなかったため自分で備忘録的記事を書いてみることにしました。

動作に失敗した状況

  • ホストOS: MacOS High Sierra 10.13.5
  • Docker community edition 18.03.1-ce-mac65 (24312)
  • dockerイメージ: conda/minicondaから派生させたPython学習用環境 (過去の記事に記載)
  • 動作させたPythonコード
tk.py
#tkinterの練習プログラム

import tkinter as tk

base = tk.Tk()
base.mainloop()

実行結果

$ python ./tk.py
Traceback (most recent call last):
  File "./tk.py", line 3, in <module>
    import tkinter as tk
  File "/usr/local/lib/python3.6/tkinter/__init__.py", line 36, in <module>
    import _tkinter # If this fails your Python may not be configured for Tk
ImportError: libX11.so.6: cannot open shared object file: No such file or directory

このエラーから考えられることとして、
* docker上のPythonのtkinterはXベースで動作するもののようである
* docker上にXのクライアント動作環境を構築する必要がある
* ホストのMacOS上にXサーバを構築する必要がある

ということが分かりました。

今回行ったこと

  1. MacOS上でのXサーバのセットアップ
  2. docker上でのXクライアントライブラリのインストール
  3. docker上でのXサーバの指定

以上の3ステップでMacOS上のdockerからtkinterを使ったGUIプログラムを動作させることができました。以下、1ステップごとに経過を記載します。

MacOS上でのXサーバのセットアップ

以前はMacOS上に標準でXサーバが用意されていたのですが、現在は標準からは削除されているようです。このことについてはApple社のページに記載されています。これに従って、XQuartzプロジェクトからXサーバを入手します。執筆時点ではXQuartz-2.7.11.dmgがダウンロード可能でした。
インストールについては特に問題なく、.dmgファイルをマウント→.pkgファイルをダブルクリック→あとは流れで大丈夫でした。
ここで一度ログアウト/再起動を求められます。
再起動後、LaunchPadには一見何も追加されていないのでちょっと「?」と思いましたが、ターミナルから

$ xeyes &
[1] 881

とすると、無事xeyesが立ち上がり、Xサーバのインストールが上手くいっていることが確認できました。xeyes、懐かしいですね。このお目々見たの何年ぶりでしょうか。
(後々、よく見るとApplications->ユーティリティの中にXQuartzが作成されていました)

スクリーンショット 2018-06-03 時刻 22.43.54.png

また、dockerからネットワーク越しにXサーバを利用するので、メニューバーの
XQuartz->環境設定 の
「セキュリティ」タブで
「接続を認証」のチェックを外し、「ネットワーク・クライアントからの接続を許可」のチェックを付けます。それからXQuartzを再起動します。
(セキュリティ的には「接続を認証」はオンのままの方がよいのですが、docker側でXauthorityの設定が必要になりますので、今回は複雑さを避けるため触れないことにします。この記事を参考にされる方がもしいらっしゃれば、Xauthorityの設定も合わせてされることをおすすめします。)

スクリーンショット 2018-06-04 時刻 0.23.20.png

docker上でのXクライアントライブラリのインストール

docker上で動いているLinux(特にminicondaコンテナの場合)がどのようなdistributionをベースにしているのかわからなかったので確認してみました。

# uname -a
Linux 232d98f2d2c2 4.9.87-linuxkit-aufs #1 SMP Wed Mar 14 15:12:16 UTC 2018 x86_64 GNU/Linux

で、特にdistributionの名前は記載されていなかったのですが、幸い

# apt-get check
Reading package lists... Done
Building dependency tree       
Reading state information... Done

でapt-getは入っているようなので、Debian系をベースにしていると考えてよいのでしょう。
というわけで、以下の2つのコマンドでlibx11-devをインストールします。

# apt-get update
Ign:1 http://deb.debian.org/debian stretch InRelease
Get:2 http://deb.debian.org/debian stretch-updates InRelease [91.0 kB]
Get:3 http://security.debian.org stretch/updates InRelease [94.3 kB]
Get:4 http://deb.debian.org/debian stretch Release [118 kB]                     
Get:5 http://deb.debian.org/debian stretch Release.gpg [2434 B]
Get:6 http://deb.debian.org/debian stretch-updates/main amd64 Packages [12.1 kB]
Get:7 http://security.debian.org stretch/updates/main amd64 Packages [442 kB]
Get:8 http://deb.debian.org/debian stretch/main amd64 Packages [9530 kB]       
Fetched 10.3 MB in 5s (1912 kB/s)                                  
Reading package lists... Done

# apt-get install libx11-dev
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libbsd0 libpthread-stubs0-dev libx11-6 libx11-data libx11-doc libxau-dev libxau6 libxcb1 libxcb1-dev
  libxdmcp-dev libxdmcp6 x11proto-core-dev x11proto-input-dev x11proto-kb-dev xorg-sgml-doctools
  xtrans-dev
Suggested packages:
  libxcb-doc
The following NEW packages will be installed:
  libbsd0 libpthread-stubs0-dev libx11-6 libx11-data libx11-dev libx11-doc libxau-dev libxau6 libxcb1
  libxcb1-dev libxdmcp-dev libxdmcp6 x11proto-core-dev x11proto-input-dev x11proto-kb-dev
  xorg-sgml-doctools xtrans-dev
0 upgraded, 17 newly installed, 0 to remove and 31 not upgraded.
Need to get 5798 kB of archives.
After this operation, 22.2 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://deb.debian.org/debian stretch/main amd64 libxau6 amd64 1:1.0.8-1 [20.7 kB]
Get:2 http://deb.debian.org/debian stretch/main amd64 libbsd0 amd64 0.8.3-1 [83.0 kB]
Get:3 http://deb.debian.org/debian stretch/main amd64 libpthread-stubs0-dev amd64 0.3-4 [3866 B]
Get:4 http://deb.debian.org/debian stretch/main amd64 libxdmcp6 amd64 1:1.1.2-3 [26.3 kB]
Get:5 http://deb.debian.org/debian stretch/main amd64 libxcb1 amd64 1.12-1 [133 kB]
Get:6 http://deb.debian.org/debian stretch/main amd64 libx11-data all 2:1.6.4-3 [290 kB]
Get:7 http://deb.debian.org/debian stretch/main amd64 libx11-6 amd64 2:1.6.4-3 [747 kB]
Get:8 http://deb.debian.org/debian stretch/main amd64 xorg-sgml-doctools all 1:1.11-1 [21.9 kB]
Get:9 http://deb.debian.org/debian stretch/main amd64 x11proto-core-dev all 7.0.31-1 [728 kB]
Get:10 http://deb.debian.org/debian stretch/main amd64 libxau-dev amd64 1:1.0.8-1 [23.6 kB]
Get:11 http://deb.debian.org/debian stretch/main amd64 libxdmcp-dev amd64 1:1.1.2-3 [42.2 kB]
Get:12 http://deb.debian.org/debian stretch/main amd64 x11proto-input-dev all 2.3.2-1 [158 kB]
Get:13 http://deb.debian.org/debian stretch/main amd64 x11proto-kb-dev all 1.0.7-1 [233 kB]
Get:14 http://deb.debian.org/debian stretch/main amd64 xtrans-dev all 1.3.5-1 [100 kB]
Get:15 http://deb.debian.org/debian stretch/main amd64 libxcb1-dev amd64 1.12-1 [169 kB]
Get:16 http://deb.debian.org/debian stretch/main amd64 libx11-dev amd64 2:1.6.4-3 [815 kB]
Get:17 http://deb.debian.org/debian stretch/main amd64 libx11-doc all 2:1.6.4-3 [2201 kB]
Fetched 5798 kB in 2s (2219 kB/s) 
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package libxau6:amd64.
(Reading database ... 6502 files and directories currently installed.)
Preparing to unpack .../00-libxau6_1%3a1.0.8-1_amd64.deb ...
Unpacking libxau6:amd64 (1:1.0.8-1) ...
Selecting previously unselected package libbsd0:amd64.
Preparing to unpack .../01-libbsd0_0.8.3-1_amd64.deb ...
Unpacking libbsd0:amd64 (0.8.3-1) ...
Selecting previously unselected package libpthread-stubs0-dev:amd64.
Preparing to unpack .../02-libpthread-stubs0-dev_0.3-4_amd64.deb ...
Unpacking libpthread-stubs0-dev:amd64 (0.3-4) ...
Selecting previously unselected package libxdmcp6:amd64.
Preparing to unpack .../03-libxdmcp6_1%3a1.1.2-3_amd64.deb ...
Unpacking libxdmcp6:amd64 (1:1.1.2-3) ...
Selecting previously unselected package libxcb1:amd64.
Preparing to unpack .../04-libxcb1_1.12-1_amd64.deb ...
Unpacking libxcb1:amd64 (1.12-1) ...
Selecting previously unselected package libx11-data.
Preparing to unpack .../05-libx11-data_2%3a1.6.4-3_all.deb ...
Unpacking libx11-data (2:1.6.4-3) ...
Selecting previously unselected package libx11-6:amd64.
Preparing to unpack .../06-libx11-6_2%3a1.6.4-3_amd64.deb ...
Unpacking libx11-6:amd64 (2:1.6.4-3) ...
Selecting previously unselected package xorg-sgml-doctools.
Preparing to unpack .../07-xorg-sgml-doctools_1%3a1.11-1_all.deb ...
Unpacking xorg-sgml-doctools (1:1.11-1) ...
Selecting previously unselected package x11proto-core-dev.
Preparing to unpack .../08-x11proto-core-dev_7.0.31-1_all.deb ...
Unpacking x11proto-core-dev (7.0.31-1) ...
Selecting previously unselected package libxau-dev:amd64.
Preparing to unpack .../09-libxau-dev_1%3a1.0.8-1_amd64.deb ...
Unpacking libxau-dev:amd64 (1:1.0.8-1) ...
Selecting previously unselected package libxdmcp-dev:amd64.
Preparing to unpack .../10-libxdmcp-dev_1%3a1.1.2-3_amd64.deb ...
Unpacking libxdmcp-dev:amd64 (1:1.1.2-3) ...
Selecting previously unselected package x11proto-input-dev.
Preparing to unpack .../11-x11proto-input-dev_2.3.2-1_all.deb ...
Unpacking x11proto-input-dev (2.3.2-1) ...
Selecting previously unselected package x11proto-kb-dev.
Preparing to unpack .../12-x11proto-kb-dev_1.0.7-1_all.deb ...
Unpacking x11proto-kb-dev (1.0.7-1) ...
Selecting previously unselected package xtrans-dev.
Preparing to unpack .../13-xtrans-dev_1.3.5-1_all.deb ...
Unpacking xtrans-dev (1.3.5-1) ...
Selecting previously unselected package libxcb1-dev:amd64.
Preparing to unpack .../14-libxcb1-dev_1.12-1_amd64.deb ...
Unpacking libxcb1-dev:amd64 (1.12-1) ...
Selecting previously unselected package libx11-dev:amd64.
Preparing to unpack .../15-libx11-dev_2%3a1.6.4-3_amd64.deb ...
Unpacking libx11-dev:amd64 (2:1.6.4-3) ...
Selecting previously unselected package libx11-doc.
Preparing to unpack .../16-libx11-doc_2%3a1.6.4-3_all.deb ...
Unpacking libx11-doc (2:1.6.4-3) ...
Setting up libpthread-stubs0-dev:amd64 (0.3-4) ...
Setting up xorg-sgml-doctools (1:1.11-1) ...
Setting up x11proto-kb-dev (1.0.7-1) ...
Setting up libbsd0:amd64 (0.8.3-1) ...
Setting up xtrans-dev (1.3.5-1) ...
Processing triggers for libc-bin (2.24-11+deb9u1) ...
Setting up libx11-doc (2:1.6.4-3) ...
Setting up libxdmcp6:amd64 (1:1.1.2-3) ...
Setting up libx11-data (2:1.6.4-3) ...
Setting up libxau6:amd64 (1:1.0.8-1) ...
Setting up x11proto-core-dev (7.0.31-1) ...
Setting up libxau-dev:amd64 (1:1.0.8-1) ...
Setting up libxdmcp-dev:amd64 (1:1.1.2-3) ...
Setting up libxcb1:amd64 (1.12-1) ...
Setting up x11proto-input-dev (2.3.2-1) ...
Setting up libx11-6:amd64 (2:1.6.4-3) ...
Setting up libxcb1-dev:amd64 (1.12-1) ...
Setting up libx11-dev:amd64 (2:1.6.4-3) ...
Processing triggers for libc-bin (2.24-11+deb9u1) ...

長いインストールメッセージが出ましたが、インストールできたようです。

docker上でのXサーバの指定

# export DISPLAY=(ホストのMacOSのIPアドレス):0.0
# python ./tk.py

これで起動できました。

スクリーンショット 2018-06-04 時刻 0.18.55.png

6
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
cclef
病院勤めの趣味プログラマ C++, Javaを主に書いてきたが、現在人工知能を使うためPythonを勉強中。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
6
Help us understand the problem. What is going on with this article?