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.