如何在 MacBook Pro 上的 Docker 容器内运行 tkinter?

2024-05-18

我正在尝试运行一个使用以下命令的 python GUI 应用程序tkinter我的 MacBook Pro 上的 docker 容器内的模块。

所以我安装了XQuartz https://www.xquartz.org/并跟随本教程 https://towardsdatascience.com/empowering-docker-using-tkinter-gui-bf076d9e4974在 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"]

4号线/app/tkinter_app.py is root_window = tk.Tk().

我的 MacOS 版本是11.6.1.


我做了一个小 docker 镜像xeyes在我的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,请转至“优先”进而“安全”并勾选(选中)两个选项并在执行上述过程之前重新启动我的 Mac。见图here https://stackoverflow.com/a/72593701/2836621.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 MacBook Pro 上的 Docker 容器内运行 tkinter? 的相关文章

随机推荐