GNU/Linux >> Tutoriales Linux >  >> Linux

Desarrolle rápidamente una GUI para la línea de comandos

Esta publicación parece preguntar casi exactamente lo que quieres.

La mejor solución de usar YAD parece cubrir sus requisitos.

Por ejemplo, el siguiente trazador de líneas:

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

crea un diálogo que contiene:

  • campos de texto
  • selecciones desplegables
  • casillas de verificación
  • botones

que se parece a:

La salida se coloca en yad stdout y echo "$data" se ve algo como:

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

Ahora puede "analizar" la salida con alguna herramienta cmdline como cut o awk :

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

Entonces solo te queda la lógica de la aplicación.

Instalación de Ubuntu:

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

EDITAR:centrarse en la conversión de GUI a opciones de línea de comandos

Después de recibir un voto negativo, creo que interpreté la respuesta de manera incorrecta. El punto clave que quiere es la conversión de la GUI a la interfaz de opciones de cmdline.

No conozco una solución existente, y dado que después de 7 días de recompensa todavía no hay respuesta, podemos suponer que no existe una solución.

Por lo tanto, lo mejor que podemos hacer es ayudar al OP a crear una solución por sí mismo. Creo que dado que no hay muchos casos de opciones de línea de comandos, una secuencia de comandos razonablemente pequeña será suficiente.

Aquí va un ejemplo de 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()

Para ejecutar en Ubuntu 12.04 primero haga:

sudo apt-get install python-tk

Captura de pantalla:

Comando generado para la captura de pantalla:

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

Comportamiento:

  • si el valor de --text= está vacío, entonces se omite
  • los interruptores solo aparecen si la casilla de verificación correspondiente está marcada

Si desea implementar una nueva función además de ese código, le recomiendo que lo haga aquí. Si se vuelve lo suficientemente bueno, dividamos a un nuevo repositorio y hagámoslo instalable por pip.


Linux
  1. ppl:una libreta de direcciones de línea de comandos para Linux

  2. Moro:una herramienta de productividad de línea de comandos para realizar un seguimiento de las horas de trabajo

  3. 8 subcomandos virsh de Linux para administrar máquinas virtuales en la línea de comandos

  4. ¿Alternativa compatible con Ny Ligature para "pdfgrep" en la línea de comandos?

  5. Consejos de línea de comandos de Linux para aumentar la productividad

4 aplicaciones de línea de comandos para tomar notas para Linux

10 trucos útiles de la línea de comandos de Linux para principiantes – Parte 2

20 ejemplos de comandos Sed (Stream Editor) para usuarios de Linux

Tutorial de Linux Uniq Command para principiantes (10 ejemplos)

Micro:un editor de texto basado en la línea de comandos para Linux

Ripgrep:la herramienta de búsqueda de línea de comandos más rápida para Linux