[resolvido] tkinter.TclError: no display name and no $DISPLAY environment variable


[resolvido] tkinter.TclError: no display name and no $DISPLAY environment variable

Estudando Python encontrei um erro para executar o tkinter em um container Docker, a janela / front não é exibida. Sofri para entender o problema e conseguir configurar o container para executar interfaces gráficas (GUI) via Docker.

É necessário configurar o container para relacionar o monitor do computador com o monitor do container, semelhante ao que fazemos com os volumes e portas.

A configuração se aplica a qualquer aplicação com interface gráfica, inclusive programas Linux executados nos containers.

Muitas soluções disponíveis na internet dizem respeito a ambientes Linux. Um dos problemas que encontrei foi aplicar soluções válidas apenas para o Linux no Windows. Para facilitar, segue a solução para os dois sistemas, mas só testei no Windows.

Windows: configurar display com VcXsrv

Existem diversas soluções para configurar a propriedade display no Docker. A que me pareceu mais simples é a seguinte:

  1. Instalar o VcXsrv Windows X Server

    Trata-se de um servidor para a execução de interfaces gráficas (GUI) de programas Linux executados em ambiente Windows. Fiz o download do instalador e concluí a instalação:
    https://sourceforge.net/projects/vcxsrv/

  2. Configurar o VcXsrv

    Executar o programa Xlaunch para configurar o VcXsrv. Mantive todas as opções padrão já preenchidas, com exceção da última tela de configuração [extra settings] no qual deve ser selecionada a caixa “disable access control”

  3. Salve a configuração antes de finalizar

    Ao salvar o arquivo de configuração, por exemplo, na área de trabalho, nas próximas execuções do servidor VcXsrv basta clicar no arquivo salvo para iniciar o servidor.

  4. Execute o servidor VcXsrv

    O ícone do servidor será exibido na barra de tarefas

  5. Altere o docker-compose

    É possível construir novamente o container via linha de comando, mas prefiro utilizar o docker-compose. Somente 1 linha precisa ser acrescentada no arquivo:
    environment:
          - DISPLAY=host.docker.internal:0.0

  6. Rebuild o container

    Execute novamente o container para processar a alteração no docker-compose.

    Com isso será possível exibir as telas do Tkinter e outros programas com interface gráfica direto do container Docker de sua preferência.

Linux: configurar display

No caso do Linux, é necessário acrescentar as seguintes linhas no docker-compose:

volumes:      
      - '/tmp/.X11-unix:/tmp/.X11-unix'

 environment:
      - DISPLAY=unix$DISPLAY

No prompt do Linux, autorizar que todos os usuários tenham acesso ao x11:

$ sudo apt-get install x11-xserver-utils

$ xhost +

Por fim, efetuar o rebuild do container.

Saiba +

  1. Robin Kretzschmar. Run GUI app in linux docker container on windows host
  2. Kasper Schøn Henriksen. Empowering Docker using Tkinter GUI
  3. Somatório.org. Rodando aplicações GUI em Docker
  4. Stack overflow: docker _tkinter.TclError: couldn’t connect to display