web-dev-qa-db-fra.com

Les commandes GTK dans un seul script Shell BASH, est-ce possible?

Est-il possible dans un bash script shell (fichier unique) avec des variables de boucles, etc. qui exécute zenity parmi d'autres programmes à supprimer zenity et ajouter des fonctions GTK à la place?

Si oui, est-il possible d'ajouter des commandes bash, des variables, des boucles (copiées à partir du script bash shell) à concepteur qt4?

Ce que je demande, c'est s'il y a une possibilité que les fonctions GTK peuvent être combinées avec des commandes bash à l'intérieur d'un script shell bash ou même des commandes bash avec le concepteur Qt4.

Je veux me débarrasser de zenity (ou yad, kdialog) car est très limité à une fenêtre plus avancée et utilise toujours toutes les autres fonctions bash qu'il y a déjà dans le script bash Shell, est-ce possible ?

6
GoldHaloWings

Il n'y a pas de "commandes GTK" comme il y a de fonctions GTK + en Python. GTK + est une bibliothèque avec des liaisons dans plusieurs langues, mais elle n’a pas d’exécutable commandes pour les fonctions qu’il fournit. Vous pouvez essayer de faire une partie de ce que l'API GTK + peut faire via des commandes externes:

  • zenity, yad, etc. pour afficher des boîtes de dialogue
  • xsel ou xclip pour accéder au presse-papier
  • wmctrl pour contrôler les fenêtres d'application

Mais la grande majorité des fonctionnalités de GTK + ne sont pas accessibles via des commandes.

11
muru

Les shells sont juste interpréteurs de commandes selon la définition POSIX. Gtk est une bibliothèque destinée à être importée dans les langages de programmation actuels. Donc, la réponse est non, vous ne pouvez pas utiliser des éléments Gtk complets dans les scripts du shell, mais uniquement le nombre limité d'éléments autorisés par yad et zenity.

Mais vous pouvez utiliser Python. C'est un langage de script, mais plus approprié pour le système et la programmation que les shells. Vous pouvez appeler des commandes stockées à des emplacements tels que /bin ou /usr/bin via un module de sous-processus en Python. J'ai fait tellement de fois pour mes applications Gtk.

Voici par exemple une fonction standard que j'utilise pour appeler des commandes externes à partir du script Python:

def run_cmd(self, cmdlist):
    """ Reusable function for running external commands """
    new_env = dict(os.environ)
    new_env['LC_ALL'] = 'C'
    try:
        stdout = subprocess.check_output(cmdlist, env=new_env)
    except subprocess.CalledProcessError:
        pass
    else:
        if stdout:
            return stdout

Et voici un exemple d'utilisation de mon xrandr-indicator pour changer de résolution d'écran à partir du panneau supérieur d'Ubuntu; comme son nom l'indique, il appelle xrandr dans les coulisses:

    self.run_cmd(['xrandr','--output',out,'--mode',mode]) 

En ce qui concerne Shell, vous devez appeler un shell avec un argument -c. Donc, quelque chose comme cela pourrait fonctionner:

subprocess.Popen(['bash','-c', 'echo hello world'])

Sinon, envisagez de mettre en œuvre une communication interprocessus. Créez une interface graphique en python, mais laissez-la communiquer avec un script Shell via nommé pipe ou un fichier.

7

Je suis d’accord avec @Sergiy pour dire qu’utiliser uniquement Python serait idéal. Mais je pense à un meilleur compromis. Plutôt que d'exécuter le code Bash à partir de Python tel que proposé. Il devrait être possible de conserver le code Bash et de n'exécuter que GTK à partir de Python. Quelque chose comme ça :

exec 3> >(python3 &>/dev/null)

cat >&3 <<__CODE__
# python init gtk ...
__CODE__

# bash code ...
echo "..." >&3   # run a gtk command
# bash code ...

exec 3>&-
0
user285259