GNU/Linux >> Znalost Linux >  >> Linux

Rychle vyvíjejte GUI pro příkazový řádek

Zdá se, že tento příspěvek se ptá téměř přesně na to, co chcete.

Zdá se, že nejlepší řešení pomocí YAD pokrývá vaše potřeby.

Například následující jedna vložka:

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

vytvoří dialog obsahující:

  • textová pole
  • rozbalovací výběr
  • zaškrtávací políčka
  • tlačítka

vypadá to takto:

Výstup je celý umístěn na yad stdout a echo "$data" vypadá nějak takto:

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

Nyní můžete výstup "analyzovat" pomocí nějakého nástroje cmdline, jako je cut nebo awk :

a="$(echo "$data" | cut -d"|" -f1)"
b="$(echo "$data" | cut -d"|" -f1)"

Pak už zbývá jen aplikační logika.

Instalace Ubuntu:

sudo add-apt-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install yad

EDIT:zaměření na převod GUI na možnosti příkazového řádku

Po obdržení záporného hlasu si myslím, že jsem si odpověď vyložil špatně. Klíčovým bodem, který chce, je převod z GUI na rozhraní možností cmdline.

Nevím o existujícím řešení, a protože ani po 7 dnech odměny stále žádná odpověď, můžeme předpokládat, že žádné existující řešení neexistuje.

Proto to nejlepší, co můžeme udělat, je pomoci OP vytvořit řešení sám. Domnívám se, že vzhledem k tomu, že není tolik případů možností příkazového řádku, bude postačovat přiměřeně malý skript.

Zde je příklad 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()

Chcete-li spustit na Ubuntu 12.04, nejprve proveďte:

sudo apt-get install python-tk

Snímek obrazovky:

Příkaz vygenerovaný pro snímek obrazovky:

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

Chování:

  • pokud je hodnota --text= je prázdný, pak je vynechán
  • Přepínače se zobrazí, pouze pokud je zaškrtnuto příslušné políčko

Pokud chcete implementovat novou funkci nad tento kód, doporučuji vám to udělat zde. Pokud bude dostatečně dobrý, rozdělte se na nové repo a udělejte jej pip instalovatelný.


Linux
  1. Titan – Správce hesel příkazového řádku pro Linux

  2. ppl – Adresář příkazového řádku pro Linux

  3. Moro – Nástroj pro produktivitu příkazového řádku pro sledování pracovní doby

  1. 8 Dílčí příkazy Linux virsh pro správu virtuálních počítačů na příkazovém řádku

  2. Obecná specifikace pro rozhraní příkazového řádku?

  3. Ny Ligature-aware Alternativa pro „pdfgrep“ v příkazovém řádku?

  1. 8 tipů pro příkazový řádek Linuxu

  2. Bash tipy pro každý den na příkazovém řádku

  3. Tipy pro příkazový řádek Linuxu pro zvýšení produktivity