16.04 altında zenity çalıştırılırken hata iletisi: Gtk-Message: Geçici bir üst öğe olmadan eşlenen GtkDialog. Bu cesareti kırıldı


19

Ubuntu 16.04 altında aşağıdaki mesajı alıyorum

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

komutu ile zenity'yi açtığımda

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

Bu 14.04'ün altında olmadı. Cevabın bu yazı ile ilgili olduğunu düşünüyorum ancak yazı önerilen çözümün nasıl uygulanacağını açıklamıyor. Birisi önerilen satırları hangi dosyaya eklemem gerektiğini açıklayabilir mi?

Bu uyarıyı, GtkDialog'a kalıcı olacak bir üst öğe vererek düzeltirsiniz. İlgili işlevler, gtk_window_set_transient_for () (bu pencereyi her zaman başka bir pencerenin üstünde veya geçici olarak olacak şekilde ayarlar) ve isteğe bağlı olarak kalıcı bir iletişim kutusu yapmak için gtk_window_set_modal () işlevidir. Nihayetinde çeşitli GtkDialog yapıcıları bunu yapar.


zenity --help-generalverir --attach=WINDOW Set the parent window to attach toama nasıl kullanılacağından emin değilim (Pencere nedir?), belki sorununuzu çözecektir.
Al.G.

Teşekkürler, @ Al.G. Satır WINDOW_ID=$(xprop -name echo $ TITLE` ile WINDOW kimliği kurtarmak mümkün | grep WM_CLIENT_LEADER | kes -d "#" -f2 | cut -c2-20) `ve sonra denedim zenity --attach=$WINDOW_ID --text-info --filename=<filename> ama ne yazık ki hala uyarıyı aldım. Çok kötü, ama pencere kimliği almak için bilmek bir gün kullanışlı gelebilir!
Leo Simon

Aslında gtk_window_set_transient_ için zenity kaynağını ararsanız sonuç alamazsınız.
Al.G.

Evet. Gtk_window_set_modal için arama yaparsanız çok sayıda sonuç alırsınız, ancak iletiyi susturmak için nasıl ayarlayacağımı bilmiyorum.
Leo Simon

1
Dokümanlara göre bir pencere ve bir üst pencere verirsiniz. Üst pencere ayarlanmış pencere oluşturma sonra bir yere çağırılması gerektiğini varsayalım NULL. Ancak ben make installyerel olarak zenity olamazdı (Ben docs nasıl yapılandırmak için nasıl bir şey bulamadı) bu yüzden sonunda vazgeçti. Kirli kullanmak zorunda kalacak 2>/dev/null.
Al.G.

Yanıtlar:


21

Boşver.

Bu bir uyarı , bir hata değil. Uygulama çalışıyor, göründüğü gibi, akılda en iyi uygulamalar ile kodlanmamış. zenityBağlantılı sorunuzda açıklanan düzeltmeyi uygulamak ve daha sonra kendiniz derlemek için kaynak kodunu değiştirmeniz gerekir, ancak ... yine de çalışır, öyleyse neden rahatsız etmelisiniz?

Terminalinizdeki çıkıştan kurtulmak istiyorsanız , komutun sonuna /dev/nullekleyerek STDERR (standart hata akışı, uyarının yazdırıldığı yer) 'e (verileri yutan sanal karakter cihazı)' e 2> /dev/nullyönlendirebilirsiniz. bunun gibi:

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

1
Teşekkürler! Ne yazık ki, herhangi bir nedenden dolayı 2> /dev/nullistenen etkiye sahip değil, uyarı hala devam ediyor. Bunun sadece bir sıkıntı olduğunu biliyorum, ama böyle uyarıları bastırmayı çok isterim.
Leo Simon

3

Gtk geliştiricileri, bir dizi paketi etkileyen bu uyarıyı eklemeye karar vermiş gibi görünüyor. Sadece Zenity geliştiricisinin Zenity'yi yakalamasını ve düzeltmesini beklemeliyiz.

İle bash kabuğu (bu Posix uyumlu değildir) stderr'e aracılığıyla diğer iletilere izin onu bastırmak belirli hata iletilerine nispeten basit:

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

Bu stdout ile etkileşime girmez, bu nedenle normal olarak komut ikamesinde borulanabilir veya kullanılabilir:

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

2

zenity ... 2>/dev/nullbenim için çalışıyor. Gördüğüm tek sorun, diğer (önemli) hata mesajlarının da bastırılacağı, böylece kodunuzda bir şekilde daha iyi hata oluşturma


2
Gerçekten de bu tehlikeli bir çözüm gibi görünüyor. Kullanmasan daha iyi.
Marc Vanhoomissen

0

Dave Rove'un cevabına dayanarak , çok fazla isteminiz varsa, bunu gibi bir işlev oluşturarak temizleyebilirsiniz.

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

sonra şu şekilde kullanın:

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

Bu, diğer mantıkla birleştirildiğinde şeylerin okunmasını biraz daha kolaylaştırır:

if [[ `zenityNoWarn --question --text "Are you sure?"; echo $?` -eq 0 ]]; then
    echo "Yes!"
else
    echo "No..."
fi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.