在16.04下运行zenity时出现错误消息:Gtk-消息: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但我不确定如何使用它(什么是Window?),也许它将解决您的问题。
Al.G.

谢谢@ Al.G。我能够通过WINDOW_ID=$(xprop -name echo $ TITLE` 行恢复WINDOW ID 。grep WM_CLIENT_LEADER | 切-d“#” -f2 | 剪切-c2-20)`,然后我尝试了, zenity --attach=$WINDOW_ID --text-info --filename=<filename> 但可悲的是我仍然收到警告。太糟糕了,但是一天之内知道如何获取窗口ID可能会派上用场!
西蒙

实际上,如果您 zenk 的来源中搜索gtk_window_set_transient_for,您将不会获得任何结果。
Al.G.

对。如果您搜索gtk_window_set_modal,则会得到很多结果,但是我不知道如何以使消息静音的方式进行设置。
Leo Simon

1
根据文档,您给它一个窗口和一个父窗口。我想应该在将父窗口设置为的窗口创建后的某个地方调用它NULL。但是我无法make install在本地进行禅意(找不到文档或有关如何配置安装的内容),所以我最终放弃了。一定要用脏的2>/dev/null
Al.G.

Answers:


21

忽略它。

这是警告,不是错误。该应用程序可以正常运行,看起来好像没有考虑到最佳实践。您必须修改zenity的源代码以实现您所链接问题中描述的修复,然后自己进行编译,但是...仍然可以正常工作,所以为什么要打扰呢?

如果您只是想摆脱终端机中的输出,只需在命令末尾/dev/null附加STDERR(标准错误流,即打印警告的位置)到(吞没数据的虚拟字符设备)2> /dev/null,像这样:

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

1
谢谢!不幸的是,由于某些原因2> /dev/null没有达到预期的效果,警告仍然存在。我知道这只是个麻烦,但我希望能够抑制这样的警告。
Leo Simon

3

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

使用bash shell(不兼容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
确实,这似乎是一个危险的解决方案。最好不要使用它。
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.