повідомлення про помилку при запуску zenity до 16.04: Gtk-повідомлення: 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 | вирізати -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зентувати локально (я не міг знайти документів або щось про те, як налаштувати встановлення), тому я остаточно відмовився. Доведеться використовувати брудне 2>/dev/null.
Ал.Г.

Відповіді:


21

Ігноруйте це.

Це попередження , а не помилка. Додаток працює, він просто не кодується з найкращими методами на увазі, як здається. Вам доведеться змінити zenityвихідний код, щоб реалізувати виправлення, описане у вашому пов'язаному питанні, а потім скомпілювати його самостійно, але ... він працює все одно, тож навіщо вам турбуватися?

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

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

1
Спасибі! На жаль, чомусь 2> /dev/nullне дає бажаного ефекту, попередження зберігається. Я знаю, що це лише неприємність, але я хотів би мати можливість придушити подібні попередження.
Лев Саймон

3

Схоже, розробники Gtk вирішили додати це попередження, яке впливає на ряд пакунків. Нам залишається лише чекати, коли Zenity dev наздожене і виправить Zenity.

З оболонкою bash (це не відповідає Posix) порівняно просто придушити конкретні повідомлення про помилки, одночасно дозволяючи іншим повідомленням стверджувати:

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

Це не заважає stdout, так що він може бути прокладений або використаний для заміни команд як звичайний:

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

2

zenity ... 2>/dev/nullпрацює для мене. Єдина проблема, яку я бачу, полягає в тому, що інші (важливі) повідомлення про помилки також будуть придушені, тому краще побудувати помилки як-небудь у вашому коді


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.