messaggio di errore quando si esegue zenity sotto 16.04: Gtk-Message: GtkDialog mappato senza un genitore temporaneo. Questo è scoraggiato


19

Sotto Ubuntu 16.04 ricevo il seguente messaggio

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

quando apro zenity con il comando

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

Ciò non è avvenuto in 14.04. Presumo che la risposta sia correlata a questo post ma il post non spiega come implementare la soluzione proposta. Qualcuno potrebbe spiegare a quale file dovrei aggiungere le righe suggerite?

Risolvi questo avviso dando a GtkDialog un genitore a cui essere modale. Le funzioni rilevanti sono gtk_window_set_transient_for () (che imposta questa finestra in modo che sia sempre in primo piano o transitoria per un'altra) e facoltativamente gtk_window_set_modal () per renderla una finestra di dialogo modale. Questo è in definitiva ciò che fanno i vari costruttori di GtkDialog.


zenity --help-general--attach=WINDOW Set the parent window to attach toma non sono sicuro di come usarlo (che cos'è Window?), forse risolverà il tuo problema.
Al.G.

Grazie, @ Al.G. Sono stato in grado di recuperare l'id WINDOW con la riga WINDOW_ID=$(xprop -name echo $ TITLE` | grep WM_CLIENT_LEADER | cut -d "#" -f2 | cut -c2-20) `e poi ho provato zenity --attach=$WINDOW_ID --text-info --filename=<filename> ma purtroppo ho ancora ricevuto l'avvertimento. Peccato, ma un giorno potrebbe tornare utile sapere come ottenere l'ID della finestra!
Leo Simon,

In realtà se cerchi l'origine zenity per gtk_window_set_transient_per non otterrai risultati.
Al.G.

Sì. Se cerchi gtk_window_set_modal ottieni molti risultati, ma non so come impostarlo in modo da mettere a tacere il messaggio.
Leo Simon,

1
Secondo i documenti gli dai una finestra e una finestra padre. Suppongo che dovrebbe essere chiamato da qualche parte dopo la creazione della finestra con la finestra padre impostata su NULL. Tuttavia non make installsono riuscito a trovare zenità localmente (non sono riuscito a trovare documenti o qualcosa su come configurare l'installazione), quindi alla fine ho rinunciato. Dovrà usare lo sporco 2>/dev/null.
Al.G.

Risposte:


21

Ignoralo.

È un avvertimento , non un errore. L'applicazione funziona, non è codificata tenendo conto delle migliori pratiche, come sembra. Dovresti modificare zenityil codice sorgente per implementare la correzione descritta nella tua domanda collegata e quindi compilarlo tu stesso, ma ... funziona comunque, quindi perché dovresti preoccuparti?

Se desideri semplicemente eliminare l'output nel tuo terminale, puoi semplicemente reindirizzare STDERR (flusso di errori standard, è qui che viene stampato l'avviso) su /dev/null(dispositivo a caratteri virtuali che ingoia i dati) aggiungendo 2> /dev/nullalla fine del comando, come questo:

zenity --text-info --filename=<filename> 2> /dev/null

1
Grazie! Sfortunatamente per qualche motivo 2> /dev/nullnon ha l'effetto desiderato, l'avviso persiste ancora. So che è solo un fastidio, ma mi piacerebbe poter sopprimere gli avvisi in questo modo.
Leo Simon,

3

Sembra che gli sviluppatori di Gtk abbiano deciso di aggiungere questo avviso che riguarda diversi pacchetti. Non ci resta che attendere che lo sviluppatore Zenity raggiunga e aggiusti Zenity.

Con la shell bash (non conforme a Posix) è relativamente semplice sopprimere messaggi di errore specifici consentendo allo stesso tempo altri messaggi a stderr:

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

Questo non interferisce con stdout, quindi può essere convogliato o utilizzato normalmente come sostituzione dei comandi:

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

2

zenity ... 2>/dev/nullper me va bene. L'unico problema che vedo è che anche altri (importanti) messaggi di errore saranno soppressi, quindi è meglio creare la cattura degli errori in qualche modo nel tuo codice


2
In effetti, questa sembra una soluzione pericolosa. Meglio non usarlo.
Marc Vanhoomissen,

0

Basandoti sulla risposta di Dave Rove , se hai molti suggerimenti, puoi ripulirlo creando una funzione come

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

quindi usalo in questo modo:

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

Questo rende le cose un po 'più facili da leggere quando si combinano con altre logiche:

if [[ `zenityNoWarn --question --text "Are you sure?"; echo $?` -eq 0 ]]; then
    echo "Yes!"
else
    echo "No..."
fi
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.