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

графики для видеокарт AMD Radeon выпущены для большинства версий Ubuntu, поэтому я ожидаю, что они также выпустят один для 16.04. Читая FAQ, он (fglrx) в основном выпущен, через 12 недель после выпуска версии ubuntu; поэтому нам нужно быть немного более терпеливым.

Об использовании драйвера с открытым исходным кодом с AMD Radeon HD6670 работает нормально, но не слишком хорошо. Например. photoś, безусловно, отображаются с меньшим качеством. Кроме того, X-сервер аварийно завершает работу (хотя мне все еще нужно выяснить, что именно происходит).

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

6 ответов

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

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

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

11
ответ дан 18 July 2018 в 02:31

Оболочки - это просто интерпретаторы команд в соответствии с определением 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

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

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

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

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

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

6
ответ дан 18 July 2018 в 02:31

Я согласен с @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
ответ дан 18 July 2018 в 02:31

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

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

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

11
ответ дан 24 July 2018 в 17:35
  • 1
    Спасибо, что рассказали мне, что на самом деле не команды, а функции, но можно ли добавлять команды bash, переменные, циклы (скопированные из сценария оболочки bash) в качестве сигналов для qt4-дизайнера? – GoldHaloWings 27 November 2017 в 08:06
  • 2
    @GoldHaloWings Если вы имеете в виду обработчики сигналов, обработчики сигналов AFAIK QML находятся в JavaScript (с возможностью C ++). См. [D0] doc.qt.io/qt-4.8/qmlevents.html . Нет баш. – muru 27 November 2017 в 08:13
  • 3
    youtube.com/watch?v=R11v_iGWgn4&t=3m30s, которого я знаю, не является дизайнером qt, но вы можете получить представление о том, что я имею в виду – GoldHaloWings 27 November 2017 в 08:25

Оболочки - это просто интерпретаторы команд в соответствии с определением 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

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

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

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

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

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

6
ответ дан 24 July 2018 в 17:35
  • 1
    Это печально (для меня), потому что я трачу часы на создание сценария оболочки bash: (Итак, я придерживаюсь zenity, yad kdialog сейчас правильно? – GoldHaloWings 27 November 2017 в 09:55
  • 2
    @GoldHaloWings да, просто придерживайтесь этих и начинайте медленно подниматься на Python. Раньше я писал все только в bash, но через некоторое время я начал с Python, и мне стало намного проще делать материал GUI и обработку файлов, по крайней мере для меня лично – Sergiy Kolodyazhnyy 27 November 2017 в 09:58
  • 3
    @GoldHaloWings, пожалуйста. Кроме того, я обновил свой ответ – Sergiy Kolodyazhnyy 27 November 2017 в 10:16
  • 4
    Смешной вопрос, если есть способ обменять все, что вы знаете о Python, в обмен на мгновенное изучение C ++, вы это сделаете? – GoldHaloWings 27 November 2017 в 12:44
  • 5
    Возможно, стоит отметить, что для работы GTK необходимо сначала вызвать gtk_init(), затем вы выделяете некоторые ресурсы, такие как GtkWidget s. И весь этот контекст просто теряется, когда приложение, которое его создало, выходит. Это исключает любую возможность для команд GTK " если только он не желает иметь «демон GTK», или какой-либо другой объект, выполняющий переданные ему команды и сохраняющие контекст. – Ruslan 27 November 2017 в 13:29

Я согласен с @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
ответ дан 24 July 2018 в 17:35
  • 1
    Теоретически мне нравится эта идея ... но полезно ли Bash получать информацию из интерпретатора python3? В частности, не нужно ли сценарию Bash ждать асинхронного процесса python3 каждый раз, когда есть команда Bash, требующая результата взаимодействия с пользователем? Если эта проблема не будет решена, все, что использует информацию, полученную от пользователя через GTK +, должно быть выполнено и на Python. – Eliah Kagan 27 November 2017 в 16:33
  • 2
    Правильно, я не могу найти правильный способ сделать это. Таким образом, это решение фактически ограничено. – user285259 28 November 2017 в 22:35
  • 3
    С точки зрения пользователя Python использует много процессора, я также использовал скрипт Py в моем сценарии bash. Я думал начать изучать JavaScript, который намного быстрее и проще. Но я сказал, что у меня есть время и терпение. C ++ - это мой личный выбор, который я изучаю и практикую кстати. Я знаю (несколько вещей из сценариев bash), что такое переменная, а если и else - шестнадцатеричные и т. Д., И я чувствую, что могу больше узнать о C ++. Я не говорю, что это простая задача, но я хочу проверить свои ограничения, оспаривая мои Я изучаю C ++ Я считаю, что C ++ с QT Creator - именно то, что мне нужно (я считаю) – GoldHaloWings 29 November 2017 в 11:44

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

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