快速开发命令行GUI界面

8
我正在寻找一款软件,可以帮助我快速构建GUI(例如HTML页面)。当从GUI(例如HTML表单)中选择不同的选项时,这些选项会自动转换为命令行选项。例如:我的GUI将允许我选择:
  • 选择输入文件名:inputfn
  • 选择输出文件名:outputfn
  • 将Option1设置为ON
  • 将Option2设置为OFF
  • 将Option3设置为值'42'
  • ...

点击“提交”后,此用户输入将变成以下内容:

$ cmd_line --input $inputfn --output $outputfn --option1-on --option2-off --option3=42

我想我需要编写一个简单的XML(YAML?)配置文件,描述简单的布局和命令行特定性(单选按钮、文本字段...)。

我在做梦还是有这样的东西可用?


gtkdialog应该能够帮助您使用bash脚本和glade(xml)完成此操作。请访问http://pclosmag.com/html/Issues/200910/page21.html。 - Petr Skocik
请为您的操作系统添加标签 - 我猜测是Unix/Linux? - Tomas
2个回答

9

这篇文章 看起来几乎完全符合您的要求。

使用 YAD 的最佳解决方案似乎涵盖了您的要求。

例如,以下一行代码:

data="$(yad --title="Desktop entry editor" --text="Simple desktop entry editor" --form --field="Type:CB" --field="Name" --field="Generic name" --field="Comment" --field="Command:FL" --field="Icon" --field="In terminal:CHK" --field="Startup notify:CHK" "Application" "Name" "Generic name" "This is the comment" "/usr/bin/yad" "yad" FALSE TRUE --button="WebUpd8:2" --button="gtk-ok:0" --button="gtk-cancel:1")"

创建一个包含以下内容的对话框:
  • 文本字段
  • 下拉选择
  • 复选框
  • 按钮
它看起来像这样:

enter image description here

输出都放在 yad 标准输出上,echo "$data" 的输出大致如下:
Application|Name|Generic name|This is the comment|/usr/bin/yad|yad|FALSE|TRUE|

现在,您可以使用一些命令行工具(如cutawk)来“解析”输出:
a="$(echo "$data" | cut -d"|" -f1)"
b="$(echo "$data" | cut -d"|" -f1)"

那么现在只剩下应用逻辑需要你来完成。
Ubuntu安装:
sudo add-apt-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install yad

编辑:专注于将GUI转换为命令行选项

在收到一次踩后,我认为我对答案的解释是错误的。他想要的关键点是从GUI转换为命令行选项界面。

我不知道是否存在现有的解决方案,而且经过7天的悬赏仍然没有答案,我们可以假设不存在现有的解决方案。

因此,最好的办法是帮助OP自己创建一个解决方案。 我相信,由于没有那么多的命令行选项情况,一个相当小的脚本就足够了。

这里有一个Python + Tk示例

#!/usr/bin/env python

import Tkinter
import tkFileDialog

class Option(object):
    def __init__(self, optype, name, widget=Tkinter.Entry):
        self.optype = optype
        self.name = name
        if self.optype == 'switch':
            self.widget = Tkinter.Checkbutton
        else:
            self.widget = widget

## INPUT -------------------------------------------------------
options = [
    Option("key-value", "--text="),
    Option("switch", "-s"),
    Option("positional", "pos0"),
    Option("positional", "pos1", tkFileDialog.askopenfilename),
]
## END -------------------------------------------------------

def askopenfilename(filename):
    filename.set(tkFileDialog.askopenfilename())

# Build command
def ok_func():
    cmd = "cmd_line"
    for option in options:
        if option.optype == "key-value":
            val = tkvars[option.name].get()
            if val:
                cmd += ' '
                cmd += '%s"%s"' % (option.name, val)
        elif option.optype == "switch":
            cmd += ' '
            if tkvars[option.name].get() == 1:
                cmd += option.name
        elif option.optype == "positional":
            val = tkvars[option.name].get()
            if val:
                cmd += ' '
                cmd += val
    print cmd


tkvars = {}
app = Tkinter.Tk()
grid = Tkinter.Frame()
row = 0

# Build GUI
for option in options:
    Tkinter.Label(grid, text=option.name).grid(row=row, column=0, sticky='W')
    if option.widget == Tkinter.Entry:
        tkvars[option.name] = Tkinter.StringVar()
        widget = Tkinter.Entry(
            grid,
            textvariable=tkvars[option.name]
        )
    elif option.widget == Tkinter.Checkbutton:
        tkvars[option.name] = Tkinter.IntVar()
        widget = Tkinter.Checkbutton(
            grid,
            variable = tkvars[option.name],
            onvalue = 1
        )
    elif option.widget == tkFileDialog.askopenfilename:
        tkvars[option.name] = Tkinter.StringVar()
        widget = Tkinter.Button(
            grid,
            text='Browse',
            command=lambda: askopenfilename(tkvars[option.name])
        )
    widget.grid(row=row, column=1, sticky='W')
    row += 1

grid.pack()
Tkinter.Button(app, text="ok", command=ok_func).pack()
Tkinter.Button(app, text="quit", command=app.quit).pack()
app.mainloop()

在Ubuntu 12.04上运行,首先执行:

sudo apt-get install python-tk

屏幕截图:

enter image description here

生成截图的命令:

cmd_line --text="asdf" -s qwer /path/to/file

行为:

  • 如果--text=的值为空,则省略
  • 开关只会出现在相应的复选框被选中时

如果你想在该代码的基础上实现一个新功能,我建议你在这里进行操作。 如果足够好,我们可以将其拆分为一个新的存储库,并使其可通过pip安装。


这似乎非常接近我所寻找的内容。仍需编写应用程序逻辑,并确保将yad图形工具映射到将要执行的低级命令行工具。 - malat
请解释一下为什么要给我点踩,这样我才能改进信息。 - Ciro Santilli OurBigBook.com
与我最初所要求的相比,Yad属于低级别。 想象一下必须为-djpeg编写应用程序。 没有简便的方法来说明选项“-outfile”需要类型为文件名的用户输入。 如果我想现在为cjpeg编写应用程序,所有这些样板代码都是复制/粘贴的...... - malat
@malat 表示选项需要文件名是可以的:在 --field="Command:FL" 中,FL 表示它期望一个路径,在 GUI 上显示一个打开文件浏览器的按钮。不过我同意,将其转换为命令行参数可能会更自动化一些。 - Ciro Santilli OurBigBook.com
@malat,请检查一下编辑是否更接近您想要的内容。 - Ciro Santilli OurBigBook.com

0

我认为你要找的是CommandUI。使用它,你可以指定文件/目录/简单输入、选项等。


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