我正在开发一个运行在两个不同平台上的python应用程序,即常规桌面Linux和Maemo 4.我们在两个平台上使用PyGTK,但是在Maemo上有一些小调整以使它看起来很好实现如下:
if util.platform.MAEMO:
# do something fancy for maemo
else:
# regular pygtk
在Maemo 4中,大约有15个if语句需要让用户界面看起来很好用。
这一直是非常容易管理的。问题是前一段时间发布了Maemo的新版本(5,aka fremantle),与Maemo 4相比,它有一些很大的不同。我不想在整个GUI代码中添加一堆检查,以便让所有3个平台在相同的代码库中运行良好,因为这会变得混乱。我也不想为每个平台创建原始GUI代码的副本,只需为特定平台修改它(我想尽可能多地重用代码)。
那么,对于基于相同核心UI代码的不同平台,有哪些轻微不同UI的方法是什么?我不认为这是一个python或Maemo特定的问题,我只想知道这是怎么做的。
答案 0 :(得分:10)
你可以在工厂中解决大部分问题:
def createSpec():
if util.platform.MAEMO: return Maemo4Spec()
elif util.platform.MAEMO5: return Maemo5Spec()
return StandardPyGTKSpec()
然后,在您的代码的早期某处,您只需调用该工厂:
spec = createSpec()
现在,在其他任何条件下,你只需要调用必要的功能:
spec.drawComboBox()
只要drawComboBox()
处理特定于平台的任何内容,就应该处于良好的状态。
答案 1 :(得分:0)
您可以将需要执行的平台特定内容隔离到platform
模块中的小型一致命名函数中,使用您运行的平台创建正确的函数名称,然后getattr
右侧一个并称之为。那么if / else样板就会消失。
答案 2 :(得分: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;
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