2010-01-07 36 views
7

我正在研究一個在2個不同平臺上運行的python應用程序,即常規桌面linux和Maemo 4.我們在兩個平臺上都使用PyGTK,但在Maemo上有一些小的調整,使它看起來不錯,如下:如何處理多個通用用戶界面?

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

大致有這15 if語句需要得到UI尋找和Maemo操作4

工作很好這一直是這段時間非常易於管理。問題是前一段時間有Maemo發佈的新版本(5,又名fremantle),與Maemo 4相比,它有一些很大的不同。我不想在GUI代碼中添加一堆檢查以便得到所有3個平臺與相同的代碼庫很好地工作,因爲這會得到混亂。我也不想爲每個平臺創建原始GUI代碼的副本,只是針對特定平臺修改它(我想盡可能多地使用代碼)。

那麼,什麼是略微不同的用戶界面爲基於相同的核心UI代碼的不同平臺?我不認爲這是一個python或Maemo特定的問題,我只想知道這是如何完成的。

+2

什麼樣的代碼是平臺之間不同:回調,所使用的窗口小部件,小部件被佈置(即,在不同的方式容器或不同的訂單),還是隻是某些平臺特定的小部件屬性? – LeafStorm 2010-01-07 18:06:39

+0

對不起,我忘了。這一切都是上述情況。在所有平臺上的核心是PyGTK,然後在Maemo 4上有一些hildon的東西(Maemo特定的小部件,它們具有不同的名稱/信號/等),然後在Maemo 5上有更多奇特的hildon東西以及其他一些小部件,應用程序更可用。另外,在Maemo 5版本中,我們希望有旋轉支持,它需要重新安排小部件。 – nikosapi 2010-01-07 18:36:18

回答

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,或爲被叫hildonize.py https://garage.maemo.org/plugins/ggit/browse.php/?p=gc-dialer;a=blob;f=src/hildonize.py文件Quicknote的源代碼;

從該一個環的的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