pesan galat saat menjalankan zenity di bawah 16.04: Gtk-Pesan: GtkDialog dipetakan tanpa orangtua sementara. Ini tidak dianjurkan

19

Di bawah ubuntu 16.04 saya mendapatkan pesan berikut

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

ketika saya membuka zenity dengan perintah

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

Ini tidak terjadi di bawah 14,04. Saya menduga bahwa jawabannya terkait dengan posting ini tetapi posting tersebut tidak menjelaskan bagaimana menerapkan solusi yang diusulkan. Bisakah seseorang tolong jelaskan file mana yang harus saya tambahkan baris yang disarankan?

Anda memperbaiki peringatan ini dengan memberikan GtkDialog induk untuk dijadikan modal. Fungsi yang relevan adalah gtk_window_set_transient_for () (yang mengatur jendela ini untuk selalu berada di atas, atau sementara, untuk yang lain) dan secara opsional gtk_window_set_modal () untuk menjadikannya dialog modal. Inilah yang akhirnya dilakukan oleh berbagai konstruktor GtkDialog.

Leo Simon
sumber
zenity --help-generalmemberi --attach=WINDOW Set the parent window to attach totetapi saya tidak yakin bagaimana menggunakannya (apa itu Window?), mungkin itu akan menyelesaikan masalah Anda.
Al.G.
Terima kasih, @ Al.G. Saya dapat memulihkan id WINDOW dengan baris WINDOW_ID=$(xprop -name echo $ TITLE` | grep WM_CLIENT_LEADER | cut -d "#" -f2 | cut -c2-20) `dan saya kemudian mencoba zenity --attach=$WINDOW_ID --text-info --filename=<filename> tetapi sayangnya saya masih mendapat peringatan. Sayang sekali, tetapi suatu hari mungkin berguna untuk mengetahui cara mendapatkan id jendela!
Leo Simon
Sebenarnya jika Anda mencari sumber zenity untuk gtk_window_set_transient_for Anda tidak akan mendapatkan hasil.
Al.G.
Ya. Jika Anda mencari gtk_window_set_modal Anda mendapatkan banyak hasil, tetapi saya tidak tahu cara mengaturnya dengan cara yang membungkam pesan.
Leo Simon
1
Menurut dokumen Anda memberikan jendela dan jendela induk. Saya kira itu harus dipanggil di suatu tempat setelah pembuatan jendela dengan jendela induk diatur ke NULL. Namun saya tidak dapat make installzenity secara lokal (saya tidak dapat menemukan dokumen atau sesuatu tentang cara mengkonfigurasi instal) jadi saya akhirnya menyerah. Harus menggunakan yang kotor 2>/dev/null.
Al.G.

Jawaban:

21

Abaikan itu.

Ini peringatan , bukan kesalahan. Aplikasi berfungsi, hanya saja tidak diberi kode dengan praktik terbaik dalam pikiran, seperti yang terlihat. Anda harus memodifikasi zenitykode sumber untuk mengimplementasikan perbaikan yang dijelaskan dalam pertanyaan Anda yang ditautkan dan kemudian mengompilasinya sendiri, tetapi ... tetap berhasil, jadi mengapa Anda harus repot-repot?

Jika Anda hanya ingin menghilangkan output di terminal Anda, Anda bisa dengan mudah mengarahkan ulang STDERR (aliran kesalahan standar, di mana peringatan akan dicetak) ke /dev/null(perangkat karakter virtual yang menelan data) dengan menambahkan 2> /dev/nullke akhir perintah, seperti ini:

zenity --text-info --filename=<filename> 2> /dev/null
Komandan Byte
sumber
1
Terima kasih! Sayangnya untuk beberapa alasan 2> /dev/nulltidak memiliki efek yang diinginkan, peringatan itu masih berlanjut. Saya tahu ini hanya gangguan, tetapi saya ingin sekali dapat menekan peringatan seperti ini.
Leo Simon
3

Tampaknya para devt Gtk memutuskan untuk menambahkan peringatan ini yang memengaruhi sejumlah paket. Kita hanya harus menunggu dev Zenity untuk mengejar ketinggalan dan memperbaiki Zenity.

Dengan bash shell (ini bukan yang sesuai dengan POSIX), relatif mudah untuk menekan pesan kesalahan tertentu sambil mengizinkan pesan lain melalui stderr:

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

Ini tidak mengganggu stdout, sehingga dapat disalurkan atau digunakan dalam substitusi perintah seperti biasa:

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

zenity ... 2>/dev/nullbekerja untukku. Satu-satunya masalah yang saya lihat adalah bahwa pesan kesalahan (penting) lainnya juga akan ditekan sehingga lebih baik membuat kesalahan pengambilan entah bagaimana dalam kode Anda

orang Spanyol
sumber
2
Memang, ini terlihat seperti solusi berbahaya. Lebih baik tidak menggunakannya.
Marc Vanhoomissen
0

Membangun berdasarkan jawaban Dave Rove , jika Anda memiliki banyak permintaan, Anda dapat membersihkan ini dengan membuat fungsi seperti

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

lalu gunakan seperti ini:

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

Ini membuat beberapa hal lebih mudah dibaca ketika digabungkan dengan logika lain:

if [[ `zenityNoWarn --question --text "Are you sure?"; echo $?` -eq 0 ]]; then
    echo "Yes!"
else
    echo "No..."
fi
EmpireJones
sumber