2010-05-18 5 views
2

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

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

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

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

Энди

ответ

10

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

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

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

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

  3. Модуль GUI, который импортирует 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() 
0

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

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

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

1

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

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

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

+0

+1 хорошая ссылка, спасибо – msw

0

Ну, что я делаю, что у меня есть один и только Баш скрипт со следующим:

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/бен/mcm- gtk

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

Смежные вопросы