首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速开发用于命令行的GUI

快速开发用于命令行的GUI
EN

Stack Overflow用户
提问于 2013-12-30 15:43:04
回答 2查看 3.1K关注 0票数 8

我正在寻找一个软件,可以帮助我快速建立图形用户界面(例如。HTML页面)。当选择与GUI不同的选项时(例如。这些选项将神奇地变成命令行选项。我的GUI允许我选择:

  • 选择输入文件名: inputfn
  • 选择输出文件名: outputfn
  • 将Option1设置为ON
  • 将Option2设置为OFF
  • 将Option3设置为'42‘值
  • ..。

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

代码语言:javascript
复制
$ cmd_line --input $inputfn --output $outputfn --option1-on --option2-off --option3=42

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

我是在做梦还是有类似的东西?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-08 14:48:26

这个职位似乎在问你想要什么。

使用亚德的最佳解决方案似乎满足了您的需求。

例如,下面的一个班轮:

代码语言:javascript
复制
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")"

创建一个对话框,其中包含:

  • 文本字段
  • 下拉选择
  • 复选框
  • 按钮

看上去像是:

输出全部放在yad上,echo "$data"看起来类似于:

代码语言:javascript
复制
Application|Name|Generic name|This is the comment|/usr/bin/yad|yad|FALSE|TRUE|

现在您可以使用一些cmdline工具(如cutawk )来“解析”输出。

代码语言:javascript
复制
a="$(echo "$data" | cut -d"|" -f1)"
b="$(echo "$data" | cut -d"|" -f1)"

然后,只有应用程序逻辑留给您。

Ubuntu安装:

代码语言:javascript
复制
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示例

代码语言:javascript
复制
#!/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()

要在Ubuntu12.04上运行,首先要做的是:

代码语言:javascript
复制
sudo apt-get install python-tk

截图:

为屏幕截图生成的命令:

代码语言:javascript
复制
cmd_line --text="asdf" -s qwer /path/to/file

行为:

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

如果您想在代码的基础上实现一个新特性,我建议您使用这里。如果它足够好,让我们分裂到一个新的回购,并使它的pip可安装。

票数 9
EN

Stack Overflow用户

发布于 2019-07-30 18:39:24

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20842687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档