Fehlermeldung beim Ausführen von zenity unter 16.04: Gtk-Nachricht: GtkDialog ohne transientes übergeordnetes Element zugeordnet. Dies wird abgeraten

19

Unter Ubuntu 16.04 erhalte ich folgende Meldung

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

wenn ich zenity mit dem befehl öffne

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

Dies geschah nicht unter 14.04. Ich gehe davon aus, dass sich die Antwort auf diesen Beitrag bezieht, aber der Beitrag erklärt nicht, wie die vorgeschlagene Lösung umgesetzt werden soll. Könnte jemand erklären, zu welcher Datei ich die vorgeschlagenen Zeilen hinzufügen soll?

Sie beheben diese Warnung, indem Sie dem GtkDialog ein übergeordnetes Element zuweisen, für das Modalität besteht. Die relevanten Funktionen sind gtk_window_set_transient_for () (wodurch dieses Fenster immer über oder vorübergehend für ein anderes Fenster angezeigt wird) und optional gtk_window_set_modal (), um es zu einem modalen Dialogfeld zu machen. Dies ist letztendlich die Aufgabe der verschiedenen GtkDialog-Konstruktoren.

Leo Simon
quelle
zenity --help-generalEs gibt, --attach=WINDOW Set the parent window to attach toaber ich bin nicht sicher, wie man es benutzt (was ist Windows?), vielleicht wird es Ihr Problem lösen.
Al.G.
Vielen Dank, @ Al.G. Ich konnte die WINDOW-ID mit der Zeile WINDOW_ID=$(xprop -name echo $ TITLE` | wiederherstellen grep WM_CLIENT_LEADER | schneiden Sie -d "#" -f2 | cut -c2-20) `und ich habe dann versucht, zenity --attach=$WINDOW_ID --text-info --filename=<filename> aber leider habe ich immer noch die Warnung. Schade, aber eines Tages kann es nützlich sein, zu wissen, wie man die Fenster-ID erhält!
Leo Simon
Wenn Sie die Quelle von zenity nach gtk_window_set_transient_for durchsuchen, werden Sie keine Ergebnisse erhalten.
Al.G.
Jep. Wenn Sie nach gtk_window_set_modal suchen, erhalten Sie viele Ergebnisse, aber ich kann es nicht so einstellen, dass die Nachricht stummgeschaltet wird.
Leo Simon
1
Laut Dokumentation geben Sie ein Fenster und ein übergeordnetes Fenster an. Ich nehme an, es sollte irgendwo nach der Fenstererstellung mit übergeordnetem Fenster auf aufgerufen werden NULL. Ich konnte jedoch nicht make installlokal Zenity (ich konnte keine Dokumente oder etwas zum Konfigurieren der Installation finden), so dass ich schließlich aufgab. Muss das dreckige benutzen 2>/dev/null.
Al.G.

Antworten:

21

Ignoriere es.

Es ist eine Warnung , kein Fehler. Die Anwendung funktioniert, es ist nur nicht mit Best Practices im Auge, wie es scheint, codiert. Sie müssten den zenityQuellcode ändern , um das in Ihrer verknüpften Frage beschriebene Update zu implementieren, und es dann selbst kompilieren, aber ... es funktioniert trotzdem. Warum sollten Sie sich also die Mühe machen?

Wenn Sie nur die Ausgabe in Ihrem Terminal löschen möchten, können Sie STDERR (Standardfehlerstrom, an den die Warnung gedruckt wird) einfach an /dev/null(virtuelles Zeichengerät, das Daten verschluckt) umleiten, indem Sie 2> /dev/nullan das Ende des Befehls anhängen. so was:

zenity --text-info --filename=<filename> 2> /dev/null
Byte Commander
quelle
1
Vielen Dank! Leider 2> /dev/nullhat die Warnung aus irgendeinem Grund nicht den gewünschten Effekt. Ich weiß, es ist nur ein Ärgernis, aber ich würde gerne in der Lage sein, solche Warnungen zu unterdrücken.
Leo Simon
3

Es scheint, dass die Gtk-Entwickler beschlossen haben, diese Warnung hinzuzufügen, die eine Reihe von Paketen betrifft. Wir müssen nur darauf warten, dass der Zenity-Entwickler Zenity einholt und repariert.

Mit der Bash- Shell (dies ist nicht Posix-konform) ist es relativ einfach, bestimmte Fehlermeldungen zu unterdrücken, während andere Nachrichten an stderr durchgelassen werden:

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

Dies beeinträchtigt stdout nicht, so dass es wie gewohnt weitergeleitet oder bei der Befehlsersetzung verwendet werden kann:

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

zenity ... 2>/dev/nullfunktioniert bei mir. Das einzige Problem, das ich sehe, ist, dass andere (wichtige) Fehlermeldungen ebenfalls unterdrückt werden, um die Fehlererfassung in Ihrem Code irgendwie besser zu erstellen

splaisan
quelle
2
In der Tat sieht dies nach einer gefährlichen Lösung aus. Besser nicht benutzen.
Marc Vanhoomissen
0

Aufbauend auf der Antwort von Dave Rove können Sie bei vielen Eingabeaufforderungen das Problem beheben, indem Sie eine Funktion wie erstellen

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

dann benutze es so:

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

Dies erleichtert die Lesbarkeit in Kombination mit anderer Logik:

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