如何使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
。