【问题标题】:How to run tkinter inside a docker container on MacBook Pro?如何在 MacBook Pro 的 docker 容器中运行 tkinter?
【发布时间】:2022-06-13 00:04:20
【问题描述】:

我正在尝试在我的 MacBook Pro 上的 docker 容器中运行一个使用 tkinter 模块的 Python GUI 应用程序。

所以我安装了XQuartz 并按照this tutorial 在 docker 容器中运行了一个简单的 tkinter 程序。

这是我收到的错误消息

Traceback (most recent call last):
  File "/app/tkinter_app.py", line 4, in <module>
    root_window = tk.Tk()
  File "/usr/local/lib/python3.8/tkinter/__init__.py", line 2270, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: couldn't connect to display "/private/tmp/com.apple.launchd.knFz0UzqxP/org.xquartz:0"

我的DISPLAY环境变量的值为/private/tmp/com.apple.launchd.knFz0UzqxP/org.xquartz:0

有人知道如何解决这个错误吗?

这是教程中的 Dockerfile

# Slim version of Python
FROM python:3.8.12-slim

# Download Package Information
RUN apt-get update -y

# Install Tkinter
RUN apt-get install tk -y

# Commands to run Tkinter application
CMD ["/app/tkinter_app.py"]
ENTRYPOINT ["python3"]

/app/tkinter_app.py 的第 4 行是 root_window = tk.Tk()

我的 MacOS 版本是11.6.1

【问题讨论】:

  • 最简单的方法几乎肯定是在 Docker 之外运行这个应用程序,也许是在 Python 虚拟环境中。您的 Dockerfile 似乎缺少将您的应用程序复制到映像中的 COPY 行,而 ENTRYPOINT 拆分很奇怪;这些事情中的任何一个都会导致问题吗?你是如何运行容器的?问题与您的应用程序源有关,还是只是运行应用程序试图将 MacOS X 服务器连接到隔离容器?
  • DISPLAY 环境变量好像不对,我没见过这种形式的DISPLAY。
  • @DavidMaze 我只想正确运行tutorial
  • @MarkSetchell,非常感谢。您的代码在我的机器上成功运行。

标签: python-3.x macos docker tkinter


【解决方案1】:

我制作了一个带有 xeyes 的小 docker 映像,以在我的 Mac 上使用 XQuartz X11 服务器测试 X11 客户端,并将其用作我的 Dockerfile

# Base Image
FROM alpine:latest

RUN apk update && \
    apk add --no-cache xeyes

# Set a working directory
WORKDIR /work

# Start a shell by default
CMD ["ash"]

然后我这样构建它:

docker build -t setchell/xeyes .

我用这个运行它:

# Prerequisites
#   brew cask install xquartz
    
# Set your Mac IP address
IP=$(/usr/sbin/ipconfig getifaddr en0)

# Allow connections from Mac to XQuartz
/opt/X11/bin/xhost + "$IP"

# Run container
docker run -it -e DISPLAY="${IP}:0" -v /tmp/.X11-unix:/tmp/.X11-unix setchell/xeyes

一旦进入容器,我就运行:

xeyes

结果如下:


请注意,我必须在我的 Mac 上启动 XQuartz,转到 "Preferences",然后转到 "Security" 并勾选(检查)这两个选项并重新启动我的 Mac上述程序。见图here

可能有更简单的方法,有些步骤可能是不必要的,如果有人知道更简单的方法,请联系我。我总是乐于学习。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2021-10-19
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多