![](/img/trans.png)
[英]How do I groupby a dataframe based on values that are common to multiple columns?
[英]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.