thông báo lỗi khi chạy zenity dưới 16.04: Gtk-Message: GtkDialog được ánh xạ mà không có cha mẹ tạm thời. Điều này không được khuyến khích


19

Trong ubfox 16.04 tôi nhận được thông báo sau

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

khi tôi mở lòng với lệnh

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

Điều này đã không xảy ra dưới 14.04. Tôi cho rằng câu trả lời có liên quan đến bài đăng này nhưng bài đăng không giải thích cách thực hiện giải pháp được đề xuất. Ai đó có thể vui lòng giải thích tập tin nào tôi nên thêm các dòng được đề xuất?

Bạn khắc phục cảnh báo này bằng cách cung cấp cho cha mẹ GtkDialog phương thức. Các hàm có liên quan là gtk_window_set_transient_for () (đặt cửa sổ này luôn ở trên cùng hoặc tạm thời cho một cái khác) và tùy chọn gtk_window_set_modal () để biến nó thành hộp thoại theo chế độ. Đây cuối cùng là những gì các nhà xây dựng GtkDialog khác nhau làm.


zenity --help-generalcho --attach=WINDOW Set the parent window to attach tonhưng tôi không chắc làm thế nào để sử dụng nó (Window là gì?), có lẽ nó sẽ giải quyết vấn đề của bạn.
Al.G.

Cảm ơn, @ Al.G. Tôi đã có thể khôi phục id WINDOW với dòng WINDOW_ID=$(xprop -name echo $ TITLE` | grep WM_CLIENT_LEADER | cắt -d "#" -f2 | cắt -c2-20) `và sau đó tôi đã thử zenity --attach=$WINDOW_ID --text-info --filename=<filename> nhưng thật buồn là tôi vẫn nhận được cảnh báo. Quá tệ, nhưng một ngày nào đó sẽ có ích để biết cách lấy id cửa sổ!
Leo Simon

Trên thực tế nếu bạn tìm kiếm nguồn của zquil cho gtk_window_set_transient_for bạn sẽ không nhận được kết quả.
Al.G.

Vâng Nếu bạn tìm kiếm gtk_window_set_modal, bạn sẽ nhận được rất nhiều kết quả, nhưng tôi không biết cách đặt nó theo cách làm im lặng tin nhắn.
Leo Simon

1
Theo các tài liệu bạn cung cấp cho nó một cửa sổ và một cửa sổ cha. Tôi cho rằng nó nên được gọi ở đâu đó sau khi tạo cửa sổ với cửa sổ cha được đặt thành NULL. Tuy nhiên, tôi không thể thoải mái make installtại địa phương (tôi không thể tìm thấy tài liệu hoặc nội dung nào về cách định cấu hình cài đặt) vì vậy tôi đã từ bỏ. Sẽ phải dùng bẩn 2>/dev/null.
Al.G.

Câu trả lời:


21

Bỏ mặc nó.

Đó là một cảnh báo , không phải là một lỗi. Ứng dụng hoạt động, nó chỉ không được mã hóa với các thực tiễn tốt nhất trong tâm trí, như nó có vẻ. Bạn sẽ phải sửa đổi zenitymã nguồn của nó để thực hiện sửa lỗi được mô tả trong câu hỏi được liên kết của bạn và sau đó tự biên dịch nó, nhưng ... dù sao nó cũng hoạt động, vậy tại sao bạn phải bận tâm?

Nếu bạn chỉ muốn loại bỏ đầu ra trong thiết bị đầu cuối của mình, bạn chỉ cần chuyển hướng STDERR (luồng lỗi tiêu chuẩn, đó là nơi cảnh báo được in) đến /dev/null(thiết bị ký tự ảo nuốt dữ liệu) bằng cách nối 2> /dev/nullvào cuối lệnh, như thế này:

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

1
Cảm ơn! Thật không may vì một số lý do 2> /dev/nullkhông có hiệu quả mong muốn, cảnh báo vẫn còn. Tôi biết đó chỉ là một sự phiền toái, nhưng tôi rất thích có thể đàn áp những cảnh báo như thế này.
Leo Simon

3

Có vẻ như các nhà phát triển Gtk đã quyết định thêm cảnh báo này ảnh hưởng đến một số gói. Chúng ta chỉ cần đợi nhà phát triển Zenity bắt kịp và sửa chữa Zenity.

Với bash shell (điều này không tương thích với Posix), việc loại bỏ các thông báo lỗi cụ thể trong khi cho phép các thông báo khác thông qua stderr là tương đối đơn giản.

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

Điều này không can thiệp vào thiết bị xuất chuẩn, do đó có thể được dẫn hoặc sử dụng thay thế lệnh như bình thường:

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

2

zenity ... 2>/dev/nulllàm việc cho tôi Vấn đề duy nhất tôi thấy là các thông báo lỗi (quan trọng) khác cũng sẽ bị loại bỏ để có thể nắm bắt lỗi xây dựng tốt hơn bằng cách nào đó trong mã của bạn


2
Thật vậy, điều này trông giống như một giải pháp nguy hiểm. Tốt hơn không sử dụng nó.
Marc Vanhoomissen

0

Dựa trên câu trả lời của Dave Rove , nếu bạn có nhiều lời nhắc, bạn có thể xóa phần này bằng cách tạo một hàm như

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

sau đó sử dụng nó như thế này:

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

Điều này làm cho mọi thứ dễ đọc hơn một chút khi kết hợp với logic khác:

if [[ `zenityNoWarn --question --text "Are you sure?"; echo $?` -eq 0 ]]; then
    echo "Yes!"
else
    echo "No..."
fi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.