如何使zenity“瞬态父母”警告永久消失

Zenity总是在终端显示警告,这让我很恼火:

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

显然我不是唯一一个:

  • linuxquestions.org – 没有临时父代的Gtk消息gtkdialog映射
  • bugs.debian.org – 没有临时父级映射的GtkDialog
  • stackoverflow.com – 没有临时父级映射的GtkDialog
  • AskUbuntu – 在16.04 Gtk-message下运行zenity时出现错误信息…

几乎所有答案都告诉您通过在命令末尾附加2>/dev/null来更改调用zenity的方式。 我不想对我已编写的所有代码执行此操作,并记住这是我编写的未来代码。

有没有更容易的方法让这个恼人的消息消失?

基本上,除了将stderr重定向到/dev/null之外别无他法。 主要原因是因为Gtk需要对话窗口(实际上是zenity窗口)才能拥有父应用程序窗口。 如果您在c或python中从头开始构建GUI对话框,也会发生同样的事情。

因此,唯一的“真正”方式是Gtk开发人员实际上允许对话窗口自己站立,或者zenity开发人员在源代码中使这些警告静音。 否则,您唯一的选择是不断向任何zenity命令添加2>/dev/null 。 当然,你总是可以创建一个别名或包装函数来为你做这件事,就像这样:

 zenity(){ /usr/bin/zenity "$@" 2>/dev/null } 

然而,这可能在引用和传递参数方面存在问题,但在大多数情况下应该有效。 如果您使用Python或其他可以实际处理Gtk的语言,您可以使用隐藏的父窗口制作自己的弹出窗口,这会以复杂性为代价并学习如何创建这些东西。 但同样,真正的方法是为zenity开发人员实际修复此问题,或者Gtk开发人员承认需要独立的对话框窗口。

每次调用zenity时自动添加2>/dev/null

编辑文件~/.bashrc并搜索以下行:

 # some more ls aliases alias ll='ls -alF' alias la='ls -A' alias l='ls -CF' 

之后添加以下行:

 # Add zenity alias to make the annoying terminal error message disappear forever: # "Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged." alias zenity="zenity 2>/dev/null" 

保存文件并打开一个新的终端窗口进行测试:

 zenity --info --text "Hello Zenity-Silly-Error-Free World" 

瞧! 所有旧代码都是固定的,未来的代码不需要像所有其他答案所指示的那样附加2>/dev/null