Python Tkinter in Docker .Tcl错误:无法连接到显示器



我是新的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

如本文所述,您需要一个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

在终端输入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 +禁用访问控制。在此之后,客户端可以从任何主机连接。

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

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

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

从这里的另一个答案中得到启发,并受到其评论的启发,我的探索最终得到了两个可行的解决方案。选一个你喜欢的。

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

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

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

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

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

然后,当然,如果您运行的是windows,您需要像xming这样的东西来接收X11数据包。

最新更新