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

19

Под 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.

Лео Симон
источник
zenity --help-generalдает, --attach=WINDOW Set the parent window to attach toно я не уверен, как его использовать (что такое Window?), возможно, это решит вашу проблему.
Ал.Г.
Спасибо, @ Al.G. Мне удалось восстановить идентификатор WINDOW с помощью строки WINDOW_ID=$(xprop -name echo $ TITLE` | grep WM_CLIENT_LEADER | cut -d "#" -f2 | cut -c2-20) `и я попытался, zenity --attach=$WINDOW_ID --text-info --filename=<filename> но, к сожалению, я все еще получил предупреждение. Жаль, но однажды может пригодиться узнать, как получить идентификатор окна!
Лео Симон
На самом деле, если вы ищете источник zenity для gtk_window_set_transient_for, вы не получите никаких результатов.
Ал.Г.
Ага. Если вы ищете gtk_window_set_modal, вы получите много результатов, но я не знаю, как настроить его таким образом, чтобы заставить сообщение замолчать.
Лео Саймон
1
Согласно документам вы даете ему окно и родительское окно. Я предполагаю, что это должно быть вызвано где-то после создания окна с родительским окном, установленным в NULL. Однако я не мог установить make installлокально zenity (я не мог найти документы или что-то о том, как настроить установку), поэтому я в конце концов сдался. Придется использовать грязный 2>/dev/null.
Ал.Г.

Ответы:

21

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

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

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

zenity --text-info --filename=<filename> 2> /dev/null
Byte Commander
источник
1
Благодарность! К сожалению, по какой-то причине 2> /dev/nullне дает желаемого эффекта, предупреждение все еще сохраняется. Я знаю, что это только неприятность, но я хотел бы иметь возможность подавлять подобные предупреждения.
Лев Симон
3

Похоже, что разработчики 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) )
Дэйв Роув
источник
2

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

splaisan
источник
2
Действительно, это выглядит как опасное решение. Лучше не используйте это.
Марк Ванхомиссен
0

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

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
EmpireJones
источник