GNU/Linux >> Tutoriels Linux >  >> Linux

Développer rapidement une interface graphique pour la ligne de commande

Ce message semble demander presque exactement ce que vous voulez.

La meilleure solution consistant à utiliser YAD semble couvrir vos besoins.

Par exemple, la doublure suivante :

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

crée une boîte de dialogue contenant :

  • champs de texte
  • sélections déroulantes
  • cases à cocher
  • boutons

qui ressemble à :

La sortie est entièrement mise sur yad stdout et echo "$data" ressemble à :

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

Vous pouvez maintenant "analyser" la sortie avec un outil cmdline tel que cut ou awk :

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

Ensuite, il vous reste juste la logique d'application.

Installation d'Ubuntu :

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

EDIT :se concentrer sur la conversion de l'interface graphique en options de ligne de commande

Après avoir reçu un vote négatif, je pense avoir mal interprété la réponse. Le point clé qu'il souhaite est la conversion de l'interface graphique vers l'interface d'options de la ligne de commande.

Je ne connais pas de solution existante, et comme après 7 jours bounty toujours pas de réponse, on peut supposer qu'il n'y a pas de solution existante.

Par conséquent, le mieux que nous puissions faire est d'aider l'OP à créer lui-même une solution. Je pense que, puisqu'il n'y a pas beaucoup de cas d'options de ligne de commande, un script raisonnablement petit sera suffisant.

Voici un exemple 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()

Pour exécuter sur Ubuntu 12.04, faites d'abord :

sudo apt-get install python-tk

Capture d'écran :

Commande générée pour la capture d'écran :

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

Comportement :

  • si la valeur de --text= est vide alors il est omis
  • les commutateurs n'apparaissent que si la case correspondante est cochée

Si vous souhaitez implémenter une nouvelle fonctionnalité en plus de ce code, je vous recommande de le faire ici. Si cela devient assez bon, séparons-nous en un nouveau dépôt et rendons-le pip installable.


Linux
  1. Titan - Un gestionnaire de mots de passe en ligne de commande pour Linux

  2. ppl - Un carnet d'adresses en ligne de commande pour Linux

  3. Moro - Un outil de productivité en ligne de commande pour le suivi des heures de travail

  4. Conseils de ligne de commande Linux pour augmenter la productivité

  5. Client SVN d'interface graphique pour Debian Linux

4 applications de prise de notes en ligne de commande pour Linux

10 astuces de ligne de commande Linux utiles pour les débutants - Partie 2

20 exemples de commandes Sed (éditeur de flux) pour les utilisateurs Linux

Tutoriel Linux Uniq Command pour débutants (10 exemples)

Micro - Un éditeur de texte basé sur la ligne de commande pour Linux

Ripgrep - L'outil de recherche de ligne de commande le plus rapide pour Linux