2010-01-07 2 views
7

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

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

Есть примерно 15 из них, если заявления нужно, чтобы получить интерфейс смотреть и работать хорошо на Maemo 4.

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

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

+2

Какой код отличается между платформами: обратные вызовы, используемые виджеты, путь виджеты расположены (т.е. в разных контейнеры или разные заказы), или только определенные свойства конкретной платформы для виджетов? – LeafStorm

+0

Извините, я забыл об этом. Это все вышесказанное.В основе всех платформ лежит PyGTK, затем на Maemo 4 есть некоторые вещи из хилдона (специфичные для Maemo виджеты, которые имеют разные имена/сигналы/и т. Д.), А затем на Maemo 5 есть еще более причудливые хильдоны и другие другие виджеты, которые делают приложение более удобно. Кроме того, в версии Maemo 5 мы хотим иметь поддержку вращения, которая требует переустановки виджетов на лету. – nikosapi

ответ

0

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

10

Вы можете закончить большую часть этого на заводе:

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

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

spec = createSpec() 

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

spec.drawComboBox() 

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

0

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

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 
Смежные вопросы