如何为bash脚本创建图形用户界面(GUI)?

74

我想为我的脚本制作一些图形对话框,但不知道该如何操作。 我听说过GTK-Server或类似的东西。 如果有人知道如何将Bash与tcl/tk链接,我也会很满意。

请不要提出像"改用C++"这样的建议,因为我的项目必须是Bash脚本;没有其他选择。

有什么想法吗?

编辑: 感谢回答,但我不想要控制台中的颜色之类的“图形”,而是可以移动、最小化等的图形窗口。 我会尝试使用xmessage,但我不认为那是我正在寻找的东西。

编辑2: 我不想制作简单的对话框,比如是/否,而是希望有进度条和按钮之类的界面,类似游戏。


3
你肯定需要使用zenity - jmc
1
在早期,有一个名为“dtksh”的ksh-93实现,可以访问Motif库。您可以设置shell函数回调并使用shell脚本创建完整的图形应用程序。它包括对话框、按钮、文本框、单选按钮等功能。 - Emmanuel
1
请查看tkbash. - phil294
这个问题已经8年了。 - lauriys
未关闭的重复项:https://dev59.com/y2sy5IYBdhLWcg3wvgdl - Ciro Santilli OurBigBook.com
8个回答

70

在实际使用GUI对话框之前,考虑使用控制台提示。很多情况下,你可以通过简单的“y/n?”提示完成,而在bash中,你可以通过read命令实现。

read -p "Do something? ";
if [ $REPLY == "y" ]; then
    echo yay;
fi
如果控制台提示无法满足需求,Zenity非常易于使用,例如:
      zenity --error --text="Testing..."
      zenity --question --text="Continue?"

这只适用于Linux/Gnome系统(或者说,仅默认安装在这些系统上)。read方法可以在几乎任何平台上工作(包括无头机器或通过SSH)

如果您需要比read或Zenity提供的更复杂的内容,“转到C ++”确实是最好的方法(尽管对于这种shell脚本替换任务,我建议使用Python/Ruby而不是C ++)

我想为一些奇怪的游戏制作简单的界面,例如健康进度条。 变量“HEALTH”为34,因此将进度条填充为34/100

作为命令行脚本,它会使用Python:

$ export HEALTH=34
$ python -c "import os; print '*' * int(os.environ.get('HEALTH', 0))"
**********************************

或者将值在1至78之间归一化(这样在标准终端大小下不会出现换行):

$ python -c "import os; print '*' * int((int(os.environ.get('HEALTH', 0)) / 100.0) * 78)"

Zenity还具有一个进度对话框

#!/bin/sh
(
echo "10" ; sleep 1
echo "# Updating mail logs" ; sleep 1
echo "20" ; sleep 1
echo "# Resetting cron jobs" ; sleep 1
echo "50" ; sleep 1
echo "This line will just be ignored" ; sleep 1
echo "75" ; sleep 1
echo "# Rebooting system" ; sleep 1
echo "100" ; sleep 1
) |
zenity --progress \
  --title="Update System Logs" \
  --text="Scanning mail logs..." \
  --percentage=0

if [ "$?" = -1 ] ; then
        zenity --error \
          --text="Update canceled."
fi

如我之前所说,如果Zenity无法满足你的需求,建议你考虑用Python/Ruby/Perl/C++等语言编写一个“正式”的脚本来实现游戏功能,因为似乎你正在挑战shell脚本的极限。


1
我不需要是/否的答案,但我想为某个奇怪的游戏做一个简单的界面,例如血条进度条,我想要的就是这样的效果。 变量“HEALTH”为34,因此将进度条填充至34/100。 这就是我想要做的。 - lauriys
上面的进度对话框链接已经失效:( - Jeremy Iglehart
1
非常容易使用:`禁止访问您没有权限访问此服务器上的 /users/zenity/stable/。 Apache/2.2.15 (Red Hat) 服务器位于 help.gnome.org 端口 80。` - Snowcrash

25

如果您想在Bash中编写图形用户界面(GUI),那么Zenity是一个好的选择。以下是您可以使用它来完成的操作:

Application Options:
  --calendar                                     Display calendar dialog
  --entry                                        Display text entry dialog
  --error                                        Display error dialog
  --info                                         Display info dialog
  --file-selection                               Display file selection dialog
  --list                                         Display list dialog
  --notification                                 Display notification
  --progress                                     Display progress indication dialog
  --question                                     Display question dialog
  --warning                                      Display warning dialog
  --scale                                        Display scale dialog
  --text-info                                    Display text information dialog

通过组合这些小部件,您可以创建相当可用的GUI。当然,它不像集成到编程语言中的工具包那样灵活,但在某些情况下确实非常有用。


1
除了手册没用之外:https://help.gnome.org/users/zenity/ - Snowcrash

16

有一个名为 dialog 的命令,它使用 ncurses 库。" Dialog 是一个程序,它将让您在 shell 脚本中使用对话框来呈现各种问题或显示消息。这些类型的对话框是实现的(尽管并非所有对话框都被编译到 dialog 中)。"

请参阅 http://pwet.fr/man/linux/commandes/dialog


1
很有趣,我刚安装了该实用程序的一个版本,就在我看到你的答案时。我认为对话框运行得相当不错。 - Kamil Kisiel
除了“dialog”实用程序之外,还应该提到“whiptail”。它们甚至在彼此之间保持一定的兼容性。 - Bass

14

如果您的环境可以使用 Tcl/Tk,那么您应该编写一个 TCL 脚本并使用它。您还可以查看 wish


1
但那不是Bash。 - phil294
可能不是bash,但是在超过某个限度后,bash变得非常棘手,而处理任何复杂的图形用户界面都远远超出了这个限度。 - Donal Fellows

11

7
请看我的库: http://sites.google.com/site/easybashgui 它旨在使用相同的命令集,不分是"kdialog"、"Xdialog"、"cdialog"还是"zenity",无论X是否正在运行,无论D.E.是KDE、Gnome还是其他,都可以处理。其中有15个不同的函数(其中有两个名为"progress"和"adjust")...
再见 :-)

很酷,所以这是一个适配器。支持的工具是否必需,还是您的库将使用它发现的任何兼容环境检测的工具? - drAlberT
这个实际上很酷。Bash程序员不需要担心用户将使用KDE还是GNOME平台;它会自动检测环境并使用可用的库相应地显示UI。 - shivams

7

听起来很有趣。不幸的是,似乎没有适用于它的.deb软件包。无论如何,我会尝试编译它。 - mivk

4
如果您已经安装了Qt/KDE,可以使用kdialog,它会弹出一个Qt对话框窗口。您可以轻松指定显示“是/否”对话框、 “确定/取消”对话框、简单文本输入、密码输入等。然后您可以在shell中访问这些对话框的返回值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接