linux - 为命令行快速开发 GUI

标签 linux user-interface command-line-arguments

<分区>

我正在寻找可以帮助我快速构建 GUI(例如 HTML 页面)的软件。当从 GUI(例如 HTML 表单)中选择不同的选项时,这些选项将神奇地变成命令行选项。例如:我的 GUI 允许我选择:

  • 选择输入文件名:inputfn
  • 选择输出文件名:outputfn
  • 将选项 1 设置为开启
  • 将选项 2 设置为关闭
  • 将 Option3 设置为值“42”
  • ...

单击“提交”时,此用户输入将变成如下内容:

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

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

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

最佳答案

This post似乎几乎可以准确地询问您想要什么。

使用的顶级解决方案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 stdout 上,echo "$data" 看起来像这样:

Application|Name|Generic name|This is the comment|/usr/bin/yad|yad|FALSE|TRUE|

现在您可以使用一些 cmdline 工具“解析”输出,例如 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 到 cmdline 选项界面的转换。

我不知道现有的解决方案,并且由于在 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= 的值为空则省略
  • 开关只有在相应的复选框被选中时才会出现

如果您想在该代码之上实现新功能,我建议您这样做 here . 如果它变得足够好,让我们拆分到一个新的 repo 并使其可以 pip 安装。

关于linux - 为命令行快速开发 GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20842687/

相关文章:

linux - Tar 备份 bash 脚本中的奇怪行为

python - 在 Python 中使用 optparse

c - 段错误和 argv、argc

c - 进程和线程如何选择

linux - 如何压缩不符合特定条件的文件?

java - 创建 JToolBar 时出错

java - 让其他 JPanel 中的 JPanel 左对齐

java - launch4j:通过命令行覆盖默认 JVM 堆大小

linux - 如何从 Linux 命令行获取 exe 的编译日期

java - Gui 中可调整大小的框架