16.04에서 zenity를 실행할 때 오류 메시지 : Gtk-Message : GtkDialog가 일시적인 부모없이 맵핑되었습니다. 이것은 권장되지 않습니다


19

우분투 16.04에서 다음 메시지가 나타납니다.

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

내가 명령으로 정열을 열 때

  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하지만 난 아마도이 문제를 해결할 것입니다 (창은 무엇인가?) 확인을 사용하는 방법을 모르겠어요.
Al.G.

감사합니다, @ Al.G. WINDOW_ID=$(xprop -name echo $ TITLE`으로 WINDOW ID를 복구 할 수있었습니다. | grep WM_CLIENT_LEADER | 컷 -d "#"-f2 | cut -c2-20)`하고 시도 zenity --attach=$WINDOW_ID --text-info --filename=<filename> 했지만 슬프게도 여전히 경고가 나타납니다. 너무 나쁘지만 언젠가 창 ID를 얻는 방법을 아는 것이 좋을 수도 있습니다!
레오 시몬

실제로 gtk_window_set_transient_for에 대한 선의 의 소스 를 검색 하면 결과가 없습니다.
Al.G.

예. gtk_window_set_modal을 검색하면 많은 결과를 얻을 수 있지만 메시지를 무음으로 설정하는 방법을 모르겠습니다.
Leo Simon

1
문서에 따르면 창과 부모 창을 제공합니다. 부모 창을로 설정하여 창을 만든 후 어딘가에 호출해야한다고 가정합니다 NULL. 그러나 나는 make install로컬로 zenity를 가질 수 없었습니다 (설치를 구성하는 방법에 대한 문서 나 문서를 찾을 수 없었습니다). 그래서 나는 포기했습니다. 더티를 사용해야합니다 2>/dev/null.
Al.G.

답변:


21

무시해.

그것은 A의 경고 가 아닌 오류입니다. 응용 프로그램이 작동하지만 모범 사례를 염두에두고 코딩되지 않았습니다. 당신은 수정해야 할 것이 zenity너무 왜 귀찮게한다, 어쨌든 작동 ... 자신을 연결된 질문에 설명 된 수정 프로그램을 구현하고 그것을 컴파일의 소스 코드를, 그러나?

터미널에서 출력을 제거 하려면 명령 끝에 /dev/null추가 2> /dev/null하여 STDERR (표준 오류 스트림, 경고가 인쇄되는 곳)를 (데이터를 삼키는 가상 문자 장치 )로 리디렉션하면됩니다 . 이처럼 :

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

1
감사! 불행히도 어떤 이유로 든 2> /dev/null원하는 효과가 없지만 경고는 계속 지속됩니다. 나는 그것이 성가신 일이라는 것을 알고 있지만 이와 같은 경고를 억제하고 싶습니다.
레오 시몬

3

Gtk 개발자들은 많은 패키지에 영향을 미치는이 경고를 추가하기로 결정한 것 같습니다. Zenity 개발자가 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
실제로 이것은 위험한 해결책처럼 보입니다. 사용하지 않는 것이 좋습니다.
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.