Сообщение об ошибке при запуске zenity под 16.04: Gtk-Message: GtkDialog отображается без переходного родителя. Это не рекомендуется

Под Ubuntu 16.04 я получаю следующее сообщение

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

когда я открываю zenity с помощью команды

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

Этого не произошло до 14.04. Я предполагаю, что ответ связан с этим постом, но пост не объясняет, как реализовать предложенное решение. Может кто-нибудь объяснить, к какому файлу я должен добавить предложенные строки?

Вы исправляете это предупреждение, давая GtkDialog родительский объект, который будет модальным. Соответствующими функциями являются gtk_window_set_transient_for() (которая устанавливает это окно всегда поверх или переходное для другого) и, опционально, gtk_window_set_modal(), чтобы сделать его модальным диалоговым окном. В конечном итоге это то, что делают различные конструкторы GtkDialog.

3 ответа

Решение

Игнорируй это.

Это предупреждение, а не ошибка. Приложение работает, просто оно не закодировано с учетом передового опыта, как кажется. Вы должны будете изменить zenityисходный код для реализации исправления, описанного в вашем связанном вопросе, а затем скомпилируйте его самостоятельно, но... в любом случае это работает, так зачем вам беспокоиться?

Если вы просто хотите избавиться от вывода в вашем терминале, вы можете просто перенаправить STDERR (стандартный поток ошибок, куда выводится предупреждение) в /dev/null (виртуальное символьное устройство, которое проглатывает данные) путем добавления 2> /dev/null до конца команды, вот так:

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

Похоже, что разработчики Gtk решили добавить это предупреждение, которое затрагивает ряд пакетов. Нам просто нужно подождать, пока разработчик Zenity догонит и исправит Zenity.

С оболочкой bash (она не является Posix-совместимой) относительно просто подавить определенные сообщения об ошибках, а другие сообщения могут проходить через stderr:

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

Это не мешает работе stdout, поэтому его можно передать или использовать в подстановке команд как обычно:

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

zenity ... 2>/dev/null работает для меня. Единственная проблема, которую я вижу, состоит в том, что другие (важные) сообщения об ошибках также будут подавлены, так что лучше собрать сборку ошибок в вашем коде

Основываясь на ответе Дэйва Роува, если у вас много подсказок, вы можете очистить это, создав такую ​​функцию, как

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

затем используйте это так:

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

Это немного облегчает чтение в сочетании с другой логикой:

if [[ `zenityNoWarn --question --text "Are you sure?"; echo $?` -eq 0 ]]; then
    echo "Yes!"
else
    echo "No..."
fi
Другие вопросы по тегам