Как я могу создать графический интерфейс поверх приложения Python, чтобы он мог выполнять либо графический интерфейс, либо интерфейс командной строки? - PullRequest
2 голосов
/ 18 мая 2010

Я пытаюсь написать приложение на python для управления двигателем с помощью последовательного интерфейса. Это все работает в ситуации CLI нормально и в целом стабильно. но мне было интересно, насколько просто было добавить графический интерфейс поверх этой базы кода?

Я предполагаю, что будет больше кода, но есть ли простой способ обнаружить что-то вроде GTK, поэтому он применял код только при наличии GTK?

Кроме того, создание графического интерфейса в Python в целом: лучше ли сохранить как можно меньше специфики графического интерфейса в коде и использовать что-то вроде подхода GTK на основе XML (используя функцию gtk.glade.XML ())? Существуют ли другие наборы инструментов с графическим интерфейсом, которые имеют подход, аналогичный подходу Glade / XML / "Explode in Code"?

Спасибо за любой совет.

Andy

Ответы [ 4 ]

10 голосов
/ 18 мая 2010

существует ли простой способ обнаружения чего-то вроде GTK, поэтому он применял код только при наличии GTK?

Сначала разбейте ваше приложение на 3 отдельных модуля.

  1. Фактическая работа: foo_core.py.

  2. Модуль CLI, который импортирует foo_core. Назовите это foo_cli.py.

  3. Модуль графического интерфейса, который импортирует foo_core. Назовите это foo_gui.pyw.

Модуль foo_cli выглядит следующим образом.

import foo_core
import optparse

def main():
    # parse the command-line options
    # the real work is done by foo_core

if __name__ == "__main__":
   main()

Модуль foo_gui может выглядеть следующим образом.

 import foo_core
 import gtk # or whatever

 def main()
     # build the GUI
     # real work is done by foo_core under control of the GUI

 if __name__ == "__main__":
     main()

Обычно этого достаточно. Людям можно доверять, чтобы они сами решали, хотят ли они CLI или GUI.

Если вы хотите сбить с толку людей, вы можете написать foo.py скрипт, который выполняет что-то вроде следующего.

try:
    import foo_gui
    foo_gui.main()
except ImportError:
    import foo_cli
    foo_cli.main()
1 голос
/ 18 мая 2010

Это зависит от того, какое взаимодействие вы хотите.

Если вам нужен настоящий графический интерфейс, вы можете использовать шаблон скромное диалоговое окно , чтобы отделить элементы интерфейса от логики программы, и использовать текст «GUI» для обработки интерфейса командной строки. Это также имеет приятный побочный эффект - большие части графического интерфейса становятся программируемыми для тестирования.

Другим способом является назначение sys.stdin и sys.stout с собственными объектами, которые перенаправляют ввод-вывод ваших программ в графический интерфейс (это не работает с библиотеками, отличными от python) Это означает, что у вас меньше возможностей взаимодействия в графическом интерфейсе, но гораздо меньше усилий при программировании.

0 голосов
/ 20 мая 2010

Что я делаю, так это то, что у меня есть один-единственный скрипт bash со следующим:

if [ "${0}" == "mcm" ]; then
    /usr/bin/python ${inst_dir}/terminal/mcm-terminal.py ${@}
else
    /usr/bin/python ${inst_dir}/gtk/mcm-gtk.py &
fi

Затем я создаю две символические ссылки: / usr / sbin / mcm и / usr / bin / mcm-gtk

Работает очень хорошо.

0 голосов
/ 18 мая 2010

Я не рекомендую делать GUI в XML. Все, что делает XML - это дает вам мини-язык для описания макета. Зачем использовать мини-язык, когда вы можете использовать всю мощь Python?

Что касается обнаружения GTK, я бы не советовал этого. Вместо этого добавьте аргумент командной строки, чтобы определить, следует ли создавать графический интерфейс или нет (например: myprogram -g). После этого становится легко создать ярлык на рабочем столе или псевдоним командной строки для запуска в режиме графического интерфейса, но при этом можно использовать инструмент командной строки из любого терминала.

Однако вы хотите сохранить код GUI отдельно от битов, которые выполняют реальную работу. Дайте себе класс, который содержит всю бизнес-логику, затем предоставьте GUI и CLI доступ к этому объекту для выполнения работы.

...