繁体   English   中英

如何处理多个常见用户界面?

[英]How do I deal with multiple common user interfaces?

我正在开发一个运行在两个不同平台上的python应用程序,即常规桌面linux和Maemo 4.我们在两个平台上使用PyGTK,但是在Maemo上有一些小调整使它看起来很好,实现如下:

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

在Maemo 4中,大约有15个if语句需要让UI看起来很好用。

这一直是非常易于管理的。 问题是前一段时间发布了Maemo的新版本(5,aka fremantle),与Maemo 4相比,它有一些很大的不同。我不想在整个GUI代码中添加一堆检查,以便让所有3个平台在相同的代码库中运行良好,因为这会变得混乱。 我也不想为每个平台创建原始GUI代码的副本,只需为特定平台修改它(我想尽可能多地重用代码)。

那么,对于基于相同核心UI代码的不同平台,有哪些方法可以使用稍微不同的UI? 我不认为这是一个python或Maemo特定的问题,我只想知道这是怎么做的。

您可以在工厂中完成大部分工作:

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

然后,在代码的早期某处,您只需调用该工厂:

 spec = createSpec()

现在,除了你有条件的其他地方,你只需要调用必要的功能:

 spec.drawComboBox()

只要drawComboBox()处理特定于平台的任何内容,您就应该处于良好状态。

你可以孤立你需要做的到小的一贯命名功能的内部平台具体的东西platform模块,使用你所运行的平台创建正确的函数名称,然后getattr是正确的,并调用它。 那么if / else样板就会消失。

我已经创建了一个单独的模块来处理我在普通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 ;

The One Ring的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM