Сообщение об ошибке при запуске 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