【问题标题】:Python Tkinter in Docker .TclError: couldn't connect to displayDocker .TclError 中的 Python Tkinter:无法连接到显示
【发布时间】:2017-01-19 13:55:48
【问题描述】:

我是 python 新手,正在尝试构建一个小应用程序。它需要是一个 GUI 应用程序,我想用 docker 将它容器化。我收到以下错误,找不到解决方案

No protocol specified
No protocol specified
Traceback (most recent call last):
  File "tkinker.py", line 7, in <module>
    tinker = Tk()
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1818, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: couldn't connect to display ":0.0"

它在本地启动,但不会在 docker 中启动。我的操作系统是 Xubuntu。

我已经创建了一个示例应用程序(如下),请参阅 run-test.sh https://github.com/jeremysells/test/tree/master/docker-tkinter

【问题讨论】:

  • 再一次,添加-e DISPLAY=$DISPLAY 是不够的。
  • 它可能是特定于操作系统的,但我不这么认为。有谁知道我是否必须在本地配置任何东西才能让它工作?
  • 对不起,我以为你在 Mac 上

标签: python ubuntu docker tkinter xfce


【解决方案1】:

如果你只是想让它在你当前的屏幕上运行,看起来 docker 内置了一些不错的 DNS 东西:

docker run -ti -e DISPLAY=host.docker.internal:0 appname

对于 launch.json 中的 vscode,请将其添加到配置的末尾。

"env": {
    "DISPLAY": "host.docker.internal:0"
}

那么,当然,如果你运行的是windows,你需要类似xming之类的东西来接收X11数据包。

【讨论】:

    【解决方案2】:

    源自the other answer here 并受到its such comment 的启发,我的探索最终得到了两个可行的解决方案。选择您喜欢的任何一个。

    • xhost local:root &amp;&amp; docker -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix your_image
    • xhost local:root &amp;&amp; docker -e DISPLAY=$DISPLAY --net=host your_image

    【讨论】:

      【解决方案3】:

      在您的终端中输入xhost +。那么

      docker run --rm \
          --network=host --privileged \
          -v /dev:/dev \
          -e DISPLAY=$DISPLAY \
          -v /tmp/.X11-unix:/tmp/.X11-unix \
          -v $HOME/.Xauthority:/root/.Xauthority \
          -it yourimage
      

      为我工作。 xhost + 禁用访问控制。之后,客户端可以从任何主机进行连接。

      【讨论】:

      • 这里的“连接”意味着能够运行屏幕截图和击键记录器之类的东西:您真的不希望“从任何主机”允许这种能力。
      • 那么,@DavidMaze 有什么更好的选择?
      【解决方案4】:

      作为described here,您需要一个 X11 图形层。
      但既然你已经在 '(X)Ubuntu 上,设置 DISPLAY 就足够了:

      export DISPLAY=127.0.0.1:0.0
      
      docker run -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix yourImage
      

      还要检查XAuthority

      【讨论】:

      【解决方案5】:

      您必须在容器中设置 DISPLAY。您可以将其作为参数添加到 docker run 命令中,如下所示:

      docker run -ti -e DISPLAY=$DISPLAY blah-image blah-command
      

      DISPLAY 应该在您运行命令的 Xubuntu shell 中设置。

      【讨论】:

      • 据说同样的问题 # docker run -ti -e DISPLAY=$DISPLAY tkinter-test:latest Traceback (last recent call last): File "tkinker.py", line 7, in tinker = Tk() 文件“/usr/lib/python2.7/lib-tk/Tkinter.py”,第 1818 行,在 init self.tk = _tkinter.create(screenName, baseName, className,交互式,wantobjects,useTk,同步,使用)_tkinter.TclError:无法连接到显示“:0.0”
      • 是否在您启动命令的外壳中设置了显示?你能在 docker 之外运行 GUI 吗?
      • 是的,显示已启用。当我运行#echo $DISPLAY 时,它返回“:0.0”。我想知道它是否与 xauth(stackoverflow.com/questions/16296753/…wiki.ros.org/docker/Tutorials/GUI)有关。我现在没有空闲时间,所以当我有空的时候必须回去测试一下
      • 使用您的 Linux/UNIX 系统(而不是 Docker 容器)的 IP 地址。例如,-e DISPLAY=10.0.0.1:0.0(将 10.0.0.1 替换为您的 Linux/UNIX 系统的 IP 地址)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 2020-09-14
      相关资源
      最近更新 更多