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

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

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

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

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

6
задан 27.11.2017, 17:44

3 ответа

Оболочки являются просто интерпретаторами команд согласно определению 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
ответ дан 25.09.2019, 14:51
  • 1
    That' s печальный (для меня), потому что я провожу часы создания сценария оболочки удара: (Таким образом, я придерживаюсь zenity, yad kdialog на данный момент право? – Gianfranco P. 27.11.2017, 17:55
  • 2
    @GoldHaloWings да, просто придерживайтесь тех и медленно начинайте брать на Python. Я раньше писал все в ударе только, но спустя некоторое время я запустил с Python, и просто стало намного легче сделать материал GUI плюс обработка файла, по крайней мере, для меня лично – skryvets 27.11.2017, 17:58
  • 3
    @GoldHaloWings you' приветствие ре. Кроме того, I' ve обновил мой ответ – Sisir 27.11.2017, 18:16
  • 4
    Забавный вопрос, если там путь состоит в том, чтобы обмениваться всем, которое Вы знаете о Python в ответ для мгновенного изучения C++, Вы сделаете это? – hinok 27.11.2017, 20:44
  • 5
    Возможно, стоящий замечания, что для GTK для функционирования, gtk_init() должен быть сначала назван, тогда Вы выделяете некоторые ресурсы как GtkWidget с. И весь этот контекст просто потерян, когда приложение, которое создало его выходы. Это устраняет любую возможность для GTK " commands" если каждый не готов иметь " GTK daemon" или некоторый другой объект, выполняющий команды, передал ему и хранящий контекст. – Manoj Bhardwaj 27.11.2017, 21:29

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

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

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

11
ответ дан 25.09.2019, 14:51
  • 1
    Спасибо за сообщение мне там на самом деле не команды, но функции, но действительно ли возможно добавить команды удара, переменные, циклы (скопированный со сценария оболочки удара) как сигналы qt4 разработчику? – GN. 27.11.2017, 16:06
  • 2
    @GoldHaloWings, Если Вы имеете в виду обработчики сигналов, обработчики сигналов AFAIK QML, находятся в JavaScript (с C++ возможность). См. doc.qt.io/qt-4.8/qmlevents.html . Никакой удар. – mlunoe 27.11.2017, 16:13
  • 3
    youtube.com/watch?v=R11v_iGWgn4&t=3m30s, который я знаю, не является спокойным разработчиком, но поляной, Вы получаете идею, что я имею в виду – user261002 27.11.2017, 16:25

Я согласен с @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
ответ дан 25.09.2019, 14:51
  • 1
    В теории мне нравится эта идея..., но действительно ли это практично для Bash для получения информации от python3 интерпретатор? В частности, doesn' t сценарий Bash должен ожидать на асинхронном python3, обрабатывают каждый раз, когда существует команда Bash, которая требует результата взаимодействия с пользователем? Если та проблема не решена, все, что использует информацию, подбираемую от пользователя через GTK +, должен будет быть сделан в Python также. – agm1984 28.11.2017, 00:33
  • 2
    Право, я не могу найти корректный способ сделать это. Таким образом, это решение на самом деле ограничено. – Gal Bracha 29.11.2017, 06:35
  • 3
    С пользовательской точки зрения Python использует много CPU, я также использовал сценарий Py в своем сценарии удара. Я думал, чтобы начать изучать JavaScript, который намного больше быстрее и легок. Но я сказал эй, что у меня есть время, и C++ терпения является моим личным выбором, который я изучение и я практикуем btw. Я знаю (немного вещей из сценариев удара), что является переменной и если и еще операторы, шестнадцатеричные и т.д. и который я чувствую, могут узнать больше о C++ I don' t говорят, что это - легкая задача thow, но я хочу протестировать свои пределы, бросая вызов моему сам изучать C++, я полагаю, что C++ со спокойным Создателем точно, в чем я нуждаюсь (я верю), – vancy-pants 29.11.2017, 19:44

Теги

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