komunikat o błędzie podczas uruchamiania zenity pod 16.04: Komunikat Gtk: GtkDialog zmapowany bez tymczasowego elementu nadrzędnego. To jest odradzane


19

Pod Ubuntu 16.04 otrzymuję następujący komunikat

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

kiedy otwieram zenity za pomocą polecenia

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

Nie wydarzyło się to przed 14.04. Zakładam, że odpowiedź jest związana z tym postem, ale post nie wyjaśnia, jak wdrożyć proponowane rozwiązanie. Czy ktoś mógłby wyjaśnić, do którego pliku powinienem dodać sugerowane linie?

Naprawiasz to ostrzeżenie, nadając GtkDialog rodzicowi, który ma być modalny. Odpowiednie funkcje to gtk_window_set_transient_for () (który ustawia to okno, aby zawsze znajdowało się na innym lub przejściowe dla innego) i opcjonalnie gtk_window_set_modal (), aby uczynić z niego modalne okno dialogowe. To właśnie robią różne konstruktory GtkDialog.


zenity --help-generaldaje, --attach=WINDOW Set the parent window to attach toale nie jestem pewien jak go używać (co to jest Window?), być może rozwiąże twój problem.
Al.G.

Dzięki, @ Al.G. Udało mi się odzyskać identyfikator WINDOW za pomocą WINDOW_ID=$(xprop -name echa linii $ TITLE` | grep WM_CLIENT_LEADER | cut -d "#" -f2 | cut -c2-20) `i wtedy spróbowałem, zenity --attach=$WINDOW_ID --text-info --filename=<filename> ale niestety nadal otrzymałem ostrzeżenie. Szkoda, ale może się przydać pewnego dnia dowiedzieć się, jak uzyskać identyfikator okna!
Leo Simon

Właściwie, jeśli przeszukujesz źródło zenity dla gtk_window_set_transient_for, nie uzyskasz żadnych wyników.
Al.G.

Tak. Jeśli szukasz gtk_window_set_modal, otrzymujesz wiele wyników, ale nie wiem, jak ustawić go w sposób, który wycisza wiadomość.
Leo Simon

1
Zgodnie z dokumentami dajesz mu okno i okno nadrzędne. Przypuszczam, że powinien on zostać wywołany gdzieś po utworzeniu okna z ustawionym oknem nadrzędnym NULL. Jednak nie mogłem make installzenity lokalnie (nie mogłem znaleźć dokumentów ani czegoś takiego, jak skonfigurować instalację), więc ostatecznie się poddałem. Będę musiał użyć brudnego 2>/dev/null.
Al.G.

Odpowiedzi:


21

Zignoruj ​​to.

To ostrzeżenie , a nie błąd. Aplikacja działa, po prostu nie jest zakodowana z myślą o najlepszych praktykach, jak się wydaje. Będziesz musiał zmodyfikować zenitykod źródłowy, aby wdrożyć poprawkę opisaną w połączonym pytaniu, a następnie samodzielnie go skompilować, ale ... i tak działa, więc dlaczego miałbyś się przejmować?

Jeśli chcesz tylko pozbyć się danych wyjściowych w swoim terminalu, możesz po prostu przekierować STDERR (standardowy strumień błędów, tam właśnie drukowane jest ostrzeżenie) na /dev/null(wirtualne urządzenie znakowe, które połyka dane), dołączając 2> /dev/nullna końcu polecenia, lubię to:

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

1
Dzięki! Niestety z jakiegoś powodu 2> /dev/nullostrzeżenie nadal nie działa. Wiem, że to tylko uciążliwość, ale chciałbym móc tłumić takie ostrzeżenia.
Leo Simon

3

Wygląda na to, że deweloperzy Gtk postanowili dodać to ostrzeżenie, które wpływa na wiele pakietów. Musimy tylko poczekać, aż twórca Zenity dogoni i naprawi Zenity.

Z powłoce bash (nie jest to zgodne z Posix) stosunkowo łatwo jest ukryć określone komunikaty o błędach, jednocześnie pozwalając innym przesyłać do stderr:

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

Nie koliduje to ze standardowym wyjściem, więc może być normalnie przesyłane potokowo lub zastępowane poleceniami:

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

2

zenity ... 2>/dev/nullpracuje dla mnie. Jedyny problem, jaki widzę, to to, że inne (ważne) komunikaty o błędach również będą pomijane, więc lepiej buduj wychwytywanie błędów w swoim kodzie


2
Rzeczywiście, wygląda to na niebezpieczne rozwiązanie. Lepiej tego nie używaj.
Marc Vanhoomissen,

0

Opierając się na Dave Rove za odpowiedź , jeśli masz wiele monitów, można to oczyścić poprzez stworzenie funkcji, takich jak

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

użyj tego w następujący sposób:

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

To sprawia, że ​​rzeczy są nieco łatwiejsze do odczytania w połączeniu z inną logiką:

if [[ `zenityNoWarn --question --text "Are you sure?"; echo $?` -eq 0 ]]; then
    echo "Yes!"
else
    echo "No..."
fi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.