在 16.04 下运行 zenity 时出现错误消息:Gtk-Message:GtkDialog 映射时没有临时父级。不建议这样做

在 16.04 下运行 zenity 时出现错误消息:Gtk-Message:GtkDialog 映射时没有临时父级。不建议这样做

在 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 构造函数所做的事情。

答案1

忽略它。

它是警告,不是错误。应用程序可以运行,只是它似乎没有按照最佳实践进行编码。您必须修改zenity的源代码以实现链接问题中描述的修复,然后自己编译它,但是……它无论如何都可以运行,所以您为什么要费心呢?

如果您只是想摆脱终端中的输出,那么您可以简单地将 STDERR(标准错误流,警告打印到那里)重定向到/dev/null(吞下数据的虚拟字符设备),方法是附加2> /dev/null到命令末尾,如下所示:

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

答案2

看来 Gtk 开发人员决定添加此警告,这会影响许多软件包。我们只需等待 Zenity 开发人员赶上并修复 Zenity。

随着狂欢shell(这不符合 Posix 标准)抑制特定的错误消息同时允许其他消息通过 stderr 相对简单:

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

这不会干扰标准输出,因此可以像平常一样通过管道传输或在命令替换中使用:

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

答案3

zenity ... 2>/dev/null对我来说很管用。我看到的唯一问题是其他(重要)错误消息也将被抑制,因此最好在代码中以某种方式构建错误捕获

答案4

以 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

相关内容