mensagem de erro ao executar o zenity em 16.04: Gtk-Message: GtkDialog mapeado sem um pai temporário. Isso é desencorajado

19

No ubuntu 16.04, recebo a seguinte mensagem

 Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged

quando abro o zenity com o comando

  zenity --text-info --filename=<filename>

Isso não aconteceu sob 14.04. Presumo que a resposta esteja relacionada a este post, mas o post não explica como implementar a solução proposta. Alguém poderia explicar em qual arquivo devo adicionar as linhas sugeridas?

Você corrige esse aviso dando ao GtkDialog um pai para o qual ele é modal. As funções relevantes são gtk_window_set_transient_for () (que define essa janela para estar sempre em cima ou transitória de outra) e, opcionalmente, gtk_window_set_modal () para torná-la uma caixa de diálogo modal. Isso é o que os vários construtores GtkDialog fazem.

Leo Simon
fonte
zenity --help-generaldá, --attach=WINDOW Set the parent window to attach tomas não tenho certeza de como usá-lo (o que é o Windows?), talvez isso resolva seu problema.
Al.G.
Obrigado, @ Al.G. Consegui recuperar o id da JANELA com a linha WINDOW_ID=$(xprop -name echo $ TITLE` | grep WM_CLIENT_LEADER | corte -d "#" -f2 | cut -c2-20) `e tentei, zenity --attach=$WINDOW_ID --text-info --filename=<filename> mas infelizmente ainda recebi o aviso. Pena, mas pode ser útil um dia saber como obter o ID da janela!
Leo Simon
Na verdade, se você pesquisar gtk_window_set_transient_forge na fonte do zenity, não obterá resultados.
Al.G.
Sim. Se você procurar gtk_window_set_modal, obtém muitos resultados, mas não sei como defini-lo de uma maneira que silencia a mensagem.
Leo Simon
1
De acordo com os documentos, você fornece uma janela e uma janela pai. Suponho que deve ser chamado em algum lugar após a criação da janela com a janela pai definida como NULL. No entanto, não consegui make installzenity localmente (não consegui encontrar documentos ou algo sobre como configurar a instalação), então finalmente desisti. Terá que usar o sujo 2>/dev/null.
Al.G.

Respostas:

21

Ignore isto.

É um aviso , não um erro. O aplicativo funciona, mas não é codificado com as melhores práticas em mente, ao que parece. Você precisaria modificar zenityo código fonte para implementar a correção descrita na sua pergunta vinculada e compilar você mesmo, mas ... funciona mesmo assim, então por que você deveria se preocupar?

Se você quiser apenas se livrar da saída do seu terminal, basta redirecionar o STDERR (fluxo de erro padrão, para onde o aviso é impresso) para /dev/null(dispositivo de caractere virtual que engole dados) anexando 2> /dev/nullao final do comando, como isso:

zenity --text-info --filename=<filename> 2> /dev/null
Byte Commander
fonte
1
Obrigado! Infelizmente, por algum motivo 2> /dev/null, não tem o efeito desejado, o aviso ainda persiste. Eu sei que é apenas um incômodo, mas eu adoraria poder suprimir avisos como este.
Leo Simon
3

Parece que os desenvolvedores do Gtk decidiram adicionar este aviso que afeta vários pacotes. Nós apenas temos que esperar que o desenvolvedor do Zenity o atualize e conserte.

Com o shell bash (isso não é compatível com Posix), é relativamente simples suprimir mensagens de erro específicas enquanto permite que outras mensagens sejam armazenadas no stderr:

zenity --info --text "hello" 2> >(grep -v 'GtkDialog' >&2)

Isso não interfere no stdout, de modo que pode ser canalizado ou usado na substituição de comandos normalmente:

echo message: $(zenity --entry  2> >(grep -v 'GtkDialog' >&2) )
Dave Rove
fonte
2

zenity ... 2>/dev/nullfunciona para mim. O único problema que vejo é que outras mensagens de erro (importantes) também serão suprimidas, para melhor criar a captura de erros de alguma forma no seu código

splaisan
fonte
2
Na verdade, isso parece uma solução perigosa. Melhor não usá-lo.
Marc Vanhoomissen
0

Com base na resposta de Dave Rove , se você tiver muitos avisos, poderá limpar isso criando uma função como

function zenityNoWarn() {
    zenity "$@" 2> >(grep -v 'GtkDialog' >&2)
}

use-o assim:

zenityNoWarn --question --text "Are you sure?"

Isso torna as coisas um pouco mais fáceis de ler ao combinar com outra lógica:

if [[ `zenityNoWarn --question --text "Are you sure?"; echo $?` -eq 0 ]]; then
    echo "Yes!"
else
    echo "No..."
fi
EmpireJones
fonte