2010-01-07 40 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