如何为bash脚本制作GUI?[关闭]


68

我想为脚本创建一些图形对话框,但不知道如何。我听到一些关于GTK-Server的信息。如果有人知道如何将Bash与tcl / tk链接,我也会感到满意。

请不要发布诸如“更改为C ++”之类的内容,因为我的项目必须是Bash中的脚本。没有其他选择。

有任何想法吗?

编辑: 感谢您的回答,但我不希望控制台中的颜色为“图形”,而是可以移动,最小化等的图形窗口。我将进行测试xmessage,但我认为这不是我要搜索的内容。

编辑2: 我不想做一个简单的对话框,如是/否,但某些界面,如进度栏和按钮,像游戏。


3
你一定要zenity
jmc 2012年

1
在过去,“ dtksh”是可访问Motif库的ksh-93实现。您可以设置外壳函数回调,并使用外壳脚本制作完整的图形应用程序。它具有对话框,按钮,文本框,单选按钮等功能
伊曼纽尔

1
看一看tkbash
phil294

问题是8岁。
lauriys

公开的

Answers:


64

在实际使用GUI对话框之前,请考虑使用控制台提示。通常,您可以通过简单的“是/否”来逃避。提示,这可以通过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)

如果您需要比阅读书或Zenity提供的东西更复杂的东西,那么“更改为C ++”确实是最好的方法(尽管我建议在C ++中使用Python / Ruby代替Shell / script替换任务)

我想为一些奇怪的游戏做一个简单的界面,为健康而设计的进度条就是我想要的例子。变量“健康”为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 ++ / etc中的“适当”脚本来编写游戏内容,因为这听起来像是在推动shell的发展。 -script可以做..


1
我不想要“是/否”,但是我想为一些奇怪的游戏做一个简单的界面,为健康而准备的进度条或某些东西就是我想要的例子。变量“健康”为34,因此将进度条填充为34/100。我想做的。
lauriys

上面的“进度对话框”链接已损坏:(
杰里米·伊格哈特

如此易于使用:Forbidden You don't have permission to access /users/zenity/stable/ on this server. Apache/2.2.15 (Red Hat) Server at help.gnome.org Port 80
Snowcrash

23

如果要用bash编写图形用户界面,则要选择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
除非手册无用:help.gnome.org/users/zenity
Snowcrash

14

有一个dialog使用ncurses库的名为的命令。“对话框是一个程序,使用该脚本,您可以使用外壳程序脚本中的对话框来提出各种问题或显示消息。实现了这些类型的对话框(尽管不一定将所有对话框都编译成对话框)

参见http://pwet.fr/man/linux/commandes/dialog


1
有趣的是,当我看到您的答案时,我只是安装了该实用程序的一个版本。对话效果很好,我认为。
卡米尔·

dialog实用程序外,whiptail还应提及。它们甚至彼此之间保持某种程度的兼容性。
巴斯

13

好吧,如果您可以在环境中使用Tcl / Tk,则可能应该编写一个TCL脚本并使用它。您可能还希望看到。


1
但这不是猛击
phil294


7

请看看我的图书馆:http : //sites.google.com/site/easybashgui

它旨在使用相同的命令集来处理所有四个大型工具“ kdialog”,“ Xdialog”,“ cdialog”和“ zenity”,这取决于X是否在运行,DE是KDE还是Gnome或其他。有15种不同的功能(其中有两个叫做“ progress”和“ adjust”)...

再见:-)


很酷,所以它是一个适配器。是否需要受支持的工具,或者您的lib将使用发现的任何东西,并与检测到的环境兼容?
drAlberT

这个真的很酷。bash程序员不必担心用户将在哪个平台上使用KDE或gnome。它将自动检测环境并使用可用的库相应地显示UI。
shivams 2015年


4

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

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.