16.04でzenityを実行するとエラーメッセージが表示される: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にモーダルになる親を与えます。関連する関数は、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`でウィンドウIDを復元できました | grep WM_CLIENT_LEADER | cut -d "#" -f2 | cut -c2-20) `そして、私は試してみました zenity --attach=$WINDOW_ID --text-info --filename=<filename> が、残念ながらまだ警告が出ました。残念ですが、ある日、ウィンドウIDを取得する方法を知っておくと便利です。
レオサイモン

実際、gtk_window_set_transient_forのzenity のソースを検索しても結果は得られません。
Al.G.

うん。gtk_window_set_modalを検索すると多くの結果が得られますが、メッセージを沈黙させる方法でそれを設定する方法がわかりません。
レオサイモン

1
ドキュメントによると、ウィンドウと親ウィンドウを与えます。親ウィンドウをに設定して、ウィンドウ作成後にどこかで呼び出す必要があると思いますNULL。しかし、私はmake installローカルに何もできませんでした(インストールの設定方法に関するドキュメントや何かを見つけることができませんでした)。汚いを使用する必要があります2>/dev/null
Al.G.

回答:


21

それを無視します。

これは警告であり、エラーではありません。アプリケーションは動作しますが、ベストプラクティスを念頭に置いてコーディングされていないようです。zenityリンクされた質問で説明されている修正を実装するためにのソースコードを変更してから自分でコンパイルする必要がありますが、...それでも動作します。

ターミナルの出力を単に削除したい場合は、コマンドの末尾に/dev/null追加することにより、STDERR(標準エラーストリーム、警告が出力される場所)を(データを飲み込む仮想キャラクターデバイス)にリダイレクトできます2> /dev/null。このような:

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

1
ありがとう!残念ながら、何らかの理由で2> /dev/null望ましい効果が得られない場合でも、警告は引き続き表示されます。私はそれが迷惑にすぎないことを知っていますが、このような警告を抑制できるようになりたいです。
レオサイモン

3

Gtk開発者は、多くのパッケージに影響するこの警告を追加することに決めたようです。Zenity開発者がZenityに追いついて修正するのを待つ必要があります。

bashシェル(これはPOSIX準拠ではありません)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
実際、これは危険な解決策のように見えます。使用しないでください。
マークヴァンフーミセン

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.