快速开发命令行GUI

 rebeccataolina_733 发布于 2023-02-07 14:46

我正在寻找一种可以帮助我快速构建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?)配置文件来描述简单的布局和命令行特性(单选按钮,文本字段......).

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

1 个回答
  • 这篇文章似乎几乎准确地问你想要什么.

    使用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")"
    

    创建一个对话框包含:

    文本字段

    下拉选项

    复选框

    纽扣

    看起来像:

    在此输入图像描述

    输出全部放在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转换为命令行选项

    在收到downvote之后,我想我用错误的方式解释了答案.他想要的关键点是从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
    

    截图:

    在此输入图像描述

    为截图生成的命令:

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

    行为:

    如果值为--text=空,则省略

    如果选中相应的复选框,则仅显示开关

    如果您想在该代码之上实现新功能,我建议您在此处执行此操作.如果它变得足够好,让我们拆分成一个新的仓库并使其可以安装.

    2023-02-07 14:49 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有