2010-09-09 5 views
7

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

В настоящее время у меня есть parser.py, который обрабатывает все файлы низкого уровня IO и синтаксический анализ файла. Я показываю содержимое файла в виде дерева, что означает, что мне нужно использовать treestore в качестве моего типа данных.

Проблема, с которой я столкнулся, заключается в том, что я только думал о двух решениях этой проблемы. Во-первых, мой парсер может построить treestore и передать его моему классу. Это требует моего анализатора в зависимости от pygtk и минимизирует потенциальное повторное использование для класса. Второй будет хранить ссылку на мой класс ui в парсере, что также потенциально ограничивает повторное использование моего класса парсера в качестве автономной библиотеки.

Чтобы сконденсировать мой вопрос в короткий один лайнер: есть ли способ выполнить мои цели в более питоническом или дружественном для OO пути?

Если смотреть на моем коде поможет кто-нибудь пытается ответить на мой вопрос: https://code.launchpad.net/~blainepace/nbtparser/trunk

Других вещие предложения приветствуются, это моя первая программа на Python, и я могу быть застрял в более стиле C++ мышления. Я планирую много рефакторинг.

ответ

4

Вы должны взглянуть на учебник "Sub-classing GObject in Python". Это осуществляется с помощью системы типов GObject для создания сигналов и свойств, которые позволяют моделировать базовое поведение таким образом, чтобы его легко было интегрировать с типичной семантикой PyGTK (подключение к сигналам, ожидание уведомлений о свойствах и т. Д.).

И ваш парсер, и пользовательский интерфейс должны иметь только свойства и сигналы для подключения. Затем у вас есть третий класс, который соединяет эти сигналы и обратные вызовы и запускает основной цикл в блоке if __name__ == __main__.

Как правило, мой выглядеть примерно так:

class MyApp(gtk.Window): 

    def __init__(self, parser, ui): 
     gtk.Window.__init__(self) 
     parser.connect("some-signal", ui.update_this) 
     parser.connect("some-other-signal", ui.update_that, extra_params) 
     ui.connect("refresh-clicked", parser.reparse_file) 
     self.add(ui) 

..., а затем в главном скрипте:

parser = parser.Parser(...) 
ui = view.ParseView(...) 
app = MyApp(parser, ui) 

app.show_all() 

gtk.main() 

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

Главное, что вы можете написать, скажем, тестовый парсер, который ничего не делает, кроме как вернуть запрограммированные ответы или использует известный тестовый файл. Переключение на нее так же просто, как изменение одной строки выше:

parser = parser.DummyParser(...) 
+0

Спасибо, ты указал мне в правильном направлении. – sensae