ข้อความแสดงข้อผิดพลาดเมื่อเรียกใช้ 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 พาเรนต์เป็น modal ฟังก์ชั่นที่เกี่ยวข้องคือ 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 id ด้วยบรรทัด WINDOW_ID=$(xprop -name echo $ TITLE` | grep WM_CLIENT_LEADER | ตัด -d "#" -f2 | cut-c2-20) `แล้วฉันก็ลอง zenity --attach=$WINDOW_ID --text-info --filename=<filename> แต่น่าเศร้าที่ฉันยังคงได้รับคำเตือน แย่ไปหน่อย แต่มันอาจมีประโยชน์สักวันหนึ่งที่จะรู้วิธีรับ id หน้าต่าง!
Leo Simon

จริง ๆ แล้วถ้าคุณค้นหาแหล่งที่มาของ zenity สำหรับ gtk_window_set_transient_for คุณจะไม่ได้ผลลัพธ์
อัลจี

ได้. หากคุณค้นหา gtk_window_set_modal คุณจะได้รับผลลัพธ์จำนวนมาก แต่ฉันไม่รู้วิธีตั้งค่าในวิธีที่ทำให้ข้อความเงียบลง
Leo Simon

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ไม่มีผลตามที่ต้องการคำเตือนยังคงมีอยู่ ฉันรู้ว่ามันเป็นเพียงความรำคาญ แต่ฉันชอบที่จะสามารถยับยั้งการเตือนเช่นนี้
Leo Simon

3

ดูเหมือนว่า Gtk devs ตัดสินใจที่จะเพิ่มคำเตือนนี้ซึ่งมีผลต่อแพคเกจจำนวนมาก เราแค่ต้องรอให้ Zenity dev ติดตามและแก้ไข Zenity

ด้วยbash shell (นี่ไม่ใช่ Posix-compliant) มันค่อนข้างง่ายที่จะระงับข้อความแสดงความผิดพลาดในขณะที่อนุญาตให้ข้อความอื่นผ่านไปยัง 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ทำงานได้สำหรับฉัน ปัญหาเดียวที่ฉันเห็นคือข้อความข้อผิดพลาด (สำคัญ) อื่น ๆ ก็จะถูกระงับเพื่อให้การสร้างข้อผิดพลาดในการจับภาพในโค้ดของคุณดีขึ้น


2
แน่นอนว่านี่เป็นทางออกที่อันตราย ดีกว่าไม่ใช้
Marc Vanhoomissen

0

จากคำตอบของ Dave Rove หากคุณมีข้อความแจ้งมากมายคุณสามารถทำความสะอาดสิ่งนี้ได้โดยการสร้างฟังก์ชั่นเช่น

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.