【Python】docker環境でtkinterのGUIアプリを実行する方法

当ページには広告が含まれています。

こんにちは、DXCEL WAVEの運営者(@dxcelwave)です!

こんな方におすすめ!
  • docker環境内でtkinterを用いたGUIアプリを実行したい!
目次

【事前準備】Xサーバーの準備

Xサーバーとは、X Window System(X11)の一部で、GUIアプリケーションが画面にウィンドウを表示したり、入力デバイスからの操作を受け取るための「橋渡し」を行うソフトウェアです。

docker環境でTkinterを用いたGUIアプリを起動する場合、Xサーバーの準備が必要になります。

以下、お手元のOSに対応したXサーバーを準備しましょう。

【MacOS】XQuartzのインストール

XQuartz概要

XQuartzとは、X11を使用したGUIアプリケーションをmacOS上で実行できるようにするためのソフトウェアです。これにより、macOS専用に設計されていない多くのクロスプラットフォームアプリケーションが動作可能になります。

インストール

MacOSをお使いの方は、XQuartzをダウンロードしましょう。

環境設定

Quartzをインストールした後に起動し、[Preferences] > [Security]に進みます。

「Allow connections from network clients(ネットワーククライアントからの接続を許可する)」オプションにチェックが入っていることを必ず確認してください。

【Windows】VcXsrvのインストール

VcXsrv概要

VcXsrvは、Windows向けのフリーでオープンソースのXサーバーです。これにより、Windows上でX11(X Window System)を利用したアプリケーションを実行し、そのGUIを表示することが可能になります。LinuxやUNIX環境で使われるX11アプリケーションを、Windows上で操作したり表示したりするための「橋渡し」の役割を果たします。

インストール

Windowsをお使いの方は、VcXsrvをダウンロードしましょう。

環境設定

VcXsrvの「Security」タブで、「Allow connections from network clients(ネットワーククライアントからの接続を許可する)」オプションをチェックすることが重要です。

これにより、リモートのX11クライアントがVcXsrvに接続できるようになります。

ソースコードの作成

Tkinterのサンプルコードを実行するために、以下のディレクトリ構成でファイルを作成していきます。

- main.py
|
- dockerfile
|
- requirements.txt

main.py

Tkinterのサンプルコードを用意します。

import tkinter as tk

def run_gui():
    root = tk.Tk()
    root.title("Tkinter Docker App")
    label = tk.Label(root, text="Hello, Tkinter!")
    label.pack()
    root.mainloop()

if __name__ == "__main__":
    run_gui()

dockerfile

dockerfileでは次のようなコードを利用します。

# Use an official Python runtime
FROM python:3.11

# Install Tkinter and X11 forwarding tools
RUN apt-get update && \
    apt-get install -y python3-tk && \
    apt-get clean && \
    apt-get install -y x11-apps

# Set the working directory in the container
WORKDIR /app

# Copy the current directory contents into the container
COPY . /app

# Upgrade pip and install the dependencies from requirements.txt
RUN pip install --upgrade pip && \
    pip install --no-cache-dir -r requirements.txt

# Run the Tkinter app when the container launches
CMD ["python", "main.py"]

requirements.txt

必要に応じてrequirements.txtを準備します。サンプルとして以下を入力しましょう。

requests

GUIを表示

GUIを表示するまでの流れを解説します。

dockerビルド

以下のコードをもとにdockerをビルドしましょう。

docker build -t tkinter_app .

作業PCのIPアドレスを取得

XサーバーからGUIアプリを起動するためのIPアドレスを取得しましょう。

MacOSの場合

IPアドレスを取得します。

IP=$(/usr/sbin/ipconfig getifaddr en0)

IPアドレスを出力します。

echo "IP: $IP"

上記のIPアドレスを用いてXQuartzに接続します。

/opt/X11/bin/xhost + "$IP"
Windowsの場合

IPアドレスを取得します。

IP=$(ipconfig | findstr "IPv4" | findstr /V "127.0.0.1" | for /F "tokens=14 delims= " %i in ('findstr "IPv4"') do echo %i)

IPアドレスを出力します。

echo "IP: $IP"

上記のIPアドレスを用いてVcXsrvに接続します。

/opt/X11/bin/xhost + "$IP"

コンテナ起動・GUIアプリ実行

最後に以下のコードを実行してコンテナを起動し、Tkinerアプリを実行します。

docker run -u=$(id -u $USER):$(id -g $USER) -e DISPLAY=$IP:0 -v /tmp/.X11-unix:/tmp/.X11-unix:rw --rm -it tkinter_app

最後に

この記事が気に入ったら
フォローしてね!

本記事をシェア!
目次