Как мне работать с несколькими общими пользовательскими интерфейсами? - PullRequest
7 голосов
/ 07 января 2010

Я работаю над приложением на python, которое работает на 2 разных платформах, а именно на обычном настольном Linux и Maemo 4. Мы используем PyGTK на обеих платформах, но на Maemo есть несколько небольших настроек, которые реализованы, которые реализованы следующим образом:

if util.platform.MAEMO:
    # do something fancy for maemo
else:
    # regular pygtk

Примерно 15 таких операторов, необходимых для того, чтобы пользовательский интерфейс выглядел и работал хорошо на Maemo 4.

Это было очень управляемо все это время. Проблема в том, что некоторое время назад была выпущена новая версия Maemo (5, она же fremantle), и она имеет некоторые большие различия по сравнению с Maemo 4. Я не хочу добавлять кучу проверок в коде GUI, чтобы получить все 3 платформы, работающие хорошо с той же кодовой базой, потому что это будет грязно. Я также не хочу создавать копию исходного кода графического интерфейса для каждой платформы и просто изменять ее для конкретной платформы (я хотел бы повторно использовать как можно больше кода).

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

Ответы [ 3 ]

10 голосов
/ 07 января 2010

На фабрике можно было бы многое из этого сделать:

def createSpec():
  if util.platform.MAEMO: return Maemo4Spec()
  elif util.platform.MAEMO5: return Maemo5Spec()
  return StandardPyGTKSpec()

Затем, где-то в начале вашего кода, вы просто называете эту фабрику:

 spec = createSpec()

Теперь, где бы вы ни находились, вы просто вызываете необходимую функцию:

 spec.drawComboBox()

Пока drawComboBox() обрабатывает что-то специфическое для платформы, вы должны быть в хорошей форме.

0 голосов
/ 11 февраля 2010

Я сделал отдельный модуль, чтобы справиться со всей своей специализацией между обычным Linux, Maemo 4.1 и Maemo 5. Он определяет, какие функции доступны, и позволяет программе изящно ухудшаться.

Например

 def _fremantle_hildonize_window(app, window):
         oldWindow = window
         newWindow = hildon.StackableWindow()
         oldWindow.get_child().reparent(newWindow)
         app.add_window(newWindow)
         return newWindow


 def _hildon_hildonize_window(app, window):
         oldWindow = window
         newWindow = hildon.Window()
         oldWindow.get_child().reparent(newWindow)
         app.add_window(newWindow)
         return newWindow


 def _null_hildonize_window(app, window):
         return window


 try:
         hildon.StackableWindow
         hildonize_window = _fremantle_hildonize_window
 except AttributeError:
         try:
                 hildon.Window
                 hildonize_window = _hildon_hildonize_window
         except AttributeError:
                 hildonize_window = _null_hildonize_window

Подробнее см. Dialcentral, Gonert, ejpi или исходный код Quicknote для файла с именем hildonize.py https://garage.maemo.org/plugins/ggit/browse.php/?p=gc-dialer;a=blob;f=src/hildonize.py;

Другой пример из GObject Utils от The One Ring (go_utils.py)

 def _old_timeout_add_seconds(timeout, callback):
         return gobject.timeout_add(timeout * 1000, callback)


 def _timeout_add_seconds(timeout, callback):
         return gobject.timeout_add_seconds(timeout, callback)


 try:
         gobject.timeout_add_seconds
         timeout_add_seconds = _timeout_add_seconds
 except AttributeError:
         timeout_add_seconds = _old_timeout_add_seconds
0 голосов
/ 07 января 2010

Вы можете выделить вещи, специфичные для платформы, которые вам нужно сделать, в небольшие последовательно именованные функции внутри модуля platform, создать правильное имя функции, используя платформу, на которой вы работаете, а затем getattr нужную и вызвать ее , Тогда шаблон if / else исчезнет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...