Возможно ли в сценарии оболочки bash (отдельный файл ) с переменными цикла и т. Д., Который выполняет zenity среди других программ, чтобы удалить zenity и вместо этого добавить функции GTK?
Если да, то возможно ли также добавить команды, переменные, циклы bash (скопированные из сценария оболочки bash) в qt4 designer ?
Я спрашиваю, есть ли вероятность того, что функции GTK можно будет объединить с командами bash внутри скрипта оболочки bash или даже с командами bash с конструктором qt4.
Я хочу избавиться от zenity (или yad, kdialog), потому что он очень ограничен более продвинутыми окнами и все еще использует все остальные функции bash, которые уже есть в сценарии оболочки bash. это возможно?
Оболочки являются просто интерпретаторами команд согласно определению 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 или файлом.
Нет никаких «команд GTK» в том, что касается функций GTK + в Python. GTK + - это библиотека с привязками на нескольких языках, но она не имеет исполняемых команд для функций, которые она предоставляет. Вы можете попытаться сделать часть того, что GTK + API может сделать с помощью некоторых внешних команд:
Но подавляющее большинство функций GTK + недоступны командам.
Я согласен с @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>&-
python3
интерпретатор? В частности, doesn' t сценарий Bash должен ожидать на асинхронном python3
, обрабатывают каждый раз, когда существует команда Bash, которая требует результата взаимодействия с пользователем? Если та проблема не решена, все, что использует информацию, подбираемую от пользователя через GTK +, должен будет быть сделан в Python также.
– agm1984
28.11.2017, 00:33
gtk_init()
должен быть сначала назван, тогда Вы выделяете некоторые ресурсы какGtkWidget
с. И весь этот контекст просто потерян, когда приложение, которое создало его выходы. Это устраняет любую возможность для GTK " commands" если каждый не готов иметь " GTK daemon" или некоторый другой объект, выполняющий команды, передал ему и хранящий контекст. – Manoj Bhardwaj 27.11.2017, 21:29