在 16.04 下运行 zenity 时出现错误消息:Gtk-Message:GtkDialog 映射而没有临时父级。这是不鼓励的

Leo*_*mon 23 gui gtk zenity

在 ubuntu 16.04 下,我收到以下消息

 Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged
Run Code Online (Sandbox Code Playgroud)

当我用命令打开 zenity 时

  zenity --text-info --filename=<filename>
Run Code Online (Sandbox Code Playgroud)

这在 14.04 下不会发生。我认为答案与这篇文章有关,但这篇文章没有解释如何实施建议的解决方案。有人可以解释一下我应该将建议的行添加到哪个文件吗?

您可以通过为 GtkDialog 提供一个模态的父级来修复此警告。相关的函数是 gtk_window_set_transient_for()(它设置这个窗口总是在另一个窗口的顶部或瞬态)和可选的 gtk_window_set_modal() 以使其成为一个模态对话框。这最终是各种 GtkDialog 构造函数所做的。

Byt*_*der 25

忽略它。

这是警告,而不是错误。应用程序可以工作,只是没有按照最佳实践进行编码,就像看起来的那样。您将不得不修改zenity的源代码以实现链接问题中描述的修复程序,然后自己编译它,但是……无论如何它都可以工作,那么为什么要麻烦呢?

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

zenity --text-info --filename=<filename> 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

  • 我仍然认为 zenity 的人应该解决这个问题。它很烦人。 (4认同)
  • 它使输出混乱,并且很难发现新的错误。更糟糕的是,如果我们将 stderr 重定向到 /dev/null。错误应该被修复,而不是被覆盖。 (3认同)

Dav*_*ove 11

似乎 Gtk 开发人员决定添加这个影响许多软件包的警告。我们只需要等待 Zenity 开发人员赶上并修复 Zenity。

使用bash shell(这不符合 Posix 标准),在允许其他消息通过 stderr 的同时抑制特定错误消息相对简单:

zenity --info --text "hello" 2> >(grep -v 'GtkDialog' >&2)
Run Code Online (Sandbox Code Playgroud)

这不会干扰 stdout,因此可以正常使用管道或在命令替换中使用它:

echo message: $(zenity --entry  2> >(grep -v 'GtkDialog' >&2) )
Run Code Online (Sandbox Code Playgroud)