Как я имею дело с несколькими общими пользовательскими интерфейсами?

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

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

Существует примерно 15 из них, если операторы должны были получить взгляд UI и работу, хорошую на Maemo 4.

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

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

7
задан nikosapi 7 January 2010 в 18:00
поделиться

3 ответа

Большую часть этого можно завернуть на заводе:

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

Затем, где-то на ранней стадии кода, Вы просто вызываете этот завод:

 spec = createSpec()

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

 spec.drawComboBox()

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

.
10
ответ дан 7 December 2019 в 01:22
поделиться

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

.
0
ответ дан 7 December 2019 в 01:22
поделиться

Я сделал отдельный модуль для обработки всех моих специализаций между обычным 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 (go_utils.py) из The One Ring

 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
ответ дан 7 December 2019 в 01:22
поделиться
Другие вопросы по тегам:

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