7

私は2つの異なるプラットフォーム、つまり通常のデスクトップLinuxとMaemo 4で実行されるPythonアプリケーションに取り組んでいます。両方のプラットフォームでPyGTKを使用していますが、Maemoには、見栄えを良くするための小さな調整がたくさんあり、次のように実装されています。

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

UIをMaemo4で見栄えよく動作させるために必要な、これらのifステートメントは約15個あります。

これはずっと管理しやすいものでした。問題は、しばらく前に新しいバージョンのMaemo(5、別名fremantle)がリリースされ、Maemo4と比較していくつかの大きな違いがあることです。 3つのプラットフォームすべてが同じコードベースでうまく機能するようにします。これは、面倒になるためです。また、プラットフォームごとに元のGUIコードのコピーを作成して、特定のプラットフォーム用に変更するだけでは不十分です(できるだけ多くのコードを再利用したいと思います)。

では、同じコアUIコードに基づくプラットフォームごとにわずかに異なるUIを使用する方法は何ですか?これはPythonやMaemo固有の質問ではないと思います。これがどのように行われるかを知りたいだけです。

4

3 に答える 3

10

工場でこれの多くを巻き上げることができます:

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

次に、コードの早い段階で、そのファクトリを呼び出します。

 spec = createSpec()

さて、条件があった他の場所では、必要な関数を呼び出すだけです:

 spec.drawComboBox()

がプラットフォームに固有のものを処理する限りdrawComboBox()、問題はありません。

于 2010-01-07T18:09:02.717 に答える
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

詳細については、hildonize.py という名前のファイルの Dialcentral、Gonert、ejpi、または Quicknote のソース コードを参照して ください。 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
于 2010-02-11T17:51:29.260 に答える
0

実行する必要があるプラットフォーム固有のものをplatformモジュール内の小さな一貫した名前の関数に分離し、実行しているプラ​​ットフォームを使用して適切な関数名を作成し、次に適切な関数名を作成してgetattr呼び出すことができます。その場合、if/else ボイラープレートは消えます。

于 2010-01-07T18:07:37.193 に答える