Comandos GTK em um único script de shell BASH, é possível?

6

É possível em um script de shell bash ( arquivo único ) com variáveis de loops etc que executa zenity entre outros programas para remover o zenity e adicionar funções do GTK?

Se sim, então é possível também adicionar comandos bash, variáveis, loops (copiados do script de shell bash) para qt4 designer ?

O que estou perguntando é se existe a possibilidade de que as funções do GTK possam ser combinadas com os comandos do bash dentro de um script de shell bash ou até comandos bash com o designer qt4.

Eu quero me livrar do zenity (ou yad, kdialog) porque é muito limitado a janelas mais avançadas e ainda usa todas as funções bash restantes que já existem no shell script bash, é possível?

    
por GoldHaloWings 27.11.2017 / 04:21

3 respostas

11

Não existem "comandos GTK" no modo como existem funções GTK + em Python. O GTK + é uma biblioteca com ligações em vários idiomas, mas não possui comandos executáveis para as funções que ele fornece. Você pode tentar fazer partes do que a API do GTK + pode fazer por meio de alguns comandos externos:

  • zenity, yad, etc. para exibir caixas de diálogo
  • xsel ou xclip para acessar a área de transferência
  • wmctrl para controlar janelas de aplicativos

Mas a grande maioria das funcionalidades do GTK + não pode ser acessada por comandos.

    
por muru 27.11.2017 / 04:42
7

Os shells são apenas intérpretes de comandos de acordo com a definição POSIX. O Gtk é uma biblioteca e deve ser importado em linguagens de programação reais. Então a resposta é não, você não pode usar coisas Gtk completas em scripts de shell, apenas o conjunto limitado de coisas que yad e zenity permitem.

Mas você pode usar o Python. É uma linguagem de script, ainda mais adequada para coisas de sistema e programação do que shells. Você pode chamar comandos armazenados em locais como /bin ou /usr/bin via módulo de subprocesso no Python. Eu já fiz tantas vezes para meus aplicativos Gtk.

Aqui está, por exemplo, uma função padrão que eu uso para chamar comandos externos do 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

E aqui está um exemplo usando-o no meu xrandr-indicator para alternar a resolução da tela do painel superior do Ubuntu; como o nome sugere, ele chama xrandr nos bastidores:

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

Quanto ao shell, você precisaria chamar um shell com o argumento -c. Então, algo assim poderia funcionar:

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

Alternativamente, considere implementar a comunicação entre processos. Faça GUI  em python, mas deixe que ele se comunique com um script de shell via canal nomeado ou arquivo.

    
por Sergiy Kolodyazhnyy 27.11.2017 / 06:48
0

Concordo com o @Sergiy que usar apenas Python seria ideal. Mas penso em um compromisso melhor. Em vez de executar o código Bash do Python, conforme proposto. Deve ser possível manter o código Bash e executar apenas o GTK a partir do Python. Algo assim:

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

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

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

exec 3>&-
    
por user285259 27.11.2017 / 12:53