Команды GTK в одном сценарии оболочки BASH, это возможно?

Возможно ли в сценарии оболочки bash (отдельный файл ) с переменными цикла и т. Д., Который выполняет zenity среди других программ, чтобы удалить zenity и вместо этого добавить функции GTK?

Если да, то возможно ли также добавить команды, переменные, циклы bash (скопированные из сценария оболочки bash) в qt4 designer ?

Я спрашиваю, есть ли вероятность того, что функции GTK можно будет объединить с командами bash внутри скрипта оболочки bash или даже с командами bash с конструктором qt4.

Я хочу избавиться от zenity (или yad, kdialog), потому что он очень ограничен более продвинутыми окнами и все еще использует все остальные функции bash, которые уже есть в сценарии оболочки bash. это возможно?

6
задан 27 November 2017 в 08:44

3 ответа

Нет никаких «команд GTK» в том, что касается функций GTK + в Python. GTK + - это библиотека с привязками на нескольких языках, но она не имеет исполняемых команд для функций, которые она предоставляет. Вы можете попытаться сделать часть того, что GTK + API может сделать с помощью некоторых внешних команд:

  • zenity, yad и т. Д. Для отображения диалоговых окон
  • xsel или xclip для доступа к буферу обмена.
  • wmctrl для управления окнами приложений

Но подавляющее большинство функций GTK + недоступны командам.

11
ответ дан 27 November 2017 в 08:44

Я согласен с @Sergiy, что было бы идеально использовать только Python. Но я думаю о лучшем компромиссе. Вместо того, чтобы запускать код Bash из Python, как предложено. Должна быть возможность сохранить код Bash и запускать только GTK из Python. Примерно так:

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
ответ дан 27 November 2017 в 08:44
  • 1
    Хорошо Ваш ответ работает, но зависит дистрибутивов. Для меня это было: gsettings set org.cinnamon.settings-daemon.peripherals.keyboard repeat-interval 20 и gsettings set org.cinnamon.settings-daemon.peripherals.keyboard delay 150 – Olivier Pons 4 December 2014 в 18:10
  • 2
    Хорошо Ваш ответ работает, но зависит дистрибутивов. Для меня это было: gsettings set org.cinnamon.settings-daemon.peripherals.keyboard repeat-interval 20 и gsettings set org.cinnamon.settings-daemon.peripherals.keyboard delay 150 – Olivier Pons 4 December 2014 в 18:10
  • 3
    Хорошо Ваш ответ работает, но зависит дистрибутивов. Для меня это было: gsettings set org.cinnamon.settings-daemon.peripherals.keyboard repeat-interval 20 и gsettings set org.cinnamon.settings-daemon.peripherals.keyboard delay 150 – Olivier Pons 4 December 2014 в 18:10
  • 4
    Хорошо Ваш ответ работает, но зависит дистрибутивов. Для меня это было: gsettings set org.cinnamon.settings-daemon.peripherals.keyboard repeat-interval 20 и gsettings set org.cinnamon.settings-daemon.peripherals.keyboard delay 150 – Olivier Pons 4 December 2014 в 18:10
  • 5
    Хорошо Ваш ответ работает, но зависит дистрибутивов. Для меня это было: gsettings set org.cinnamon.settings-daemon.peripherals.keyboard repeat-interval 20 и gsettings set org.cinnamon.settings-daemon.peripherals.keyboard delay 150 – Olivier Pons 4 December 2014 в 18:10
  • 6
    Хорошо Ваш ответ работает, но зависит дистрибутивов. Для меня это было: gsettings set org.cinnamon.settings-daemon.peripherals.keyboard repeat-interval 20 и gsettings set org.cinnamon.settings-daemon.peripherals.keyboard delay 150 – Olivier Pons 4 December 2014 в 18:10

Оболочки являются просто интерпретаторами команд согласно определению POSIX. Gtk - это библиотека, предназначенная для импорта на реальных языках программирования. Таким образом, ответ - нет, вы не можете использовать полнофункциональный Gtk в скриптах оболочки, только ограниченный набор вещей, которые yad и zenity допускают.

Но вы можете использовать Python. Это язык сценариев, но он больше подходит для системного программирования, чем для оболочек. Вы можете вызывать команды, хранящиеся в таких местах, как /bin или /usr/bin, через модуль подпроцесса в Python. Я сделал так много раз для моих приложений Gtk.

Вот, например, стандартная функция, которую я использую для вызова внешних команд из скрипта 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

А вот пример, использующий ее в моих xrandr-indicator для переключения разрешение экрана с верхней панели Ubuntu; как следует из названия, он вызывает xrandr за кулисами:

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

Что касается оболочки, вам нужно вызвать оболочку с аргументом -c. Так что-то вроде этого может сработать:

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

В качестве альтернативы рассмотрите возможность реализации межпроцессного взаимодействия. Создайте GUI на python, но позвольте ему взаимодействовать со сценарием оболочки через с именем pipe или файлом.

7
ответ дан 27 November 2017 в 08:44

Другие вопросы по тегам:

Похожие вопросы: