2010-01-07 12 views
7

Ich arbeite an einer Python-Anwendung, die auf 2 verschiedenen Plattformen läuft, nämlich regulärem Desktop-Linux und Maemo 4. Wir verwenden PyGTK auf beiden Plattformen, aber auf Maemo gibt es eine Reihe kleiner Optimierungen, damit es gut aussieht, die als implementiert sind folgt:Wie gehe ich mit mehreren gemeinsamen Benutzeroberflächen um?

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

Es rund 15 davon sind, wenn Aussagen der UI suchen und arbeiten schön auf Maemo 4.

sehr Dies war für die ganze Zeit überschaubar bekommen benötigt. Das Problem ist, dass vor einiger Zeit eine neue Version von Maemo veröffentlicht wurde (5, aka fremantle) und es einige große Unterschiede im Vergleich zu Maemo 4 gibt. Ich möchte im GUI-Code nicht eine Reihe von Überprüfungen hinzufügen, um alle 3 Plattformen funktionieren gut mit der gleichen Codebasis, weil das unordentlich werden würde. Ich möchte auch keine Kopie des ursprünglichen GUI-Codes für jede Plattform erstellen und sie einfach für die spezifische Plattform ändern (ich möchte so viel Code wie möglich wiederverwenden).

Also, was sind Möglichkeiten leicht verschiedene UIs für verschiedene Plattformen zu haben, die auf dem gleichen Kern UI-Code basieren? Ich glaube nicht, dass dies eine Python oder Maemo-spezifische Frage ist, ich würde einfach gerne wissen, wie das gemacht wird.

+2

Was zwischen den Plattformen unterscheidet: die Rückrufe verwendeten Widgets, die Art und Weise der Widgets angeordnet sind (dh in verschiedenen Container oder andere Bestellungen) oder nur bestimmte plattformspezifische Eigenschaften auf den Widgets? – LeafStorm

+0

Sorry, ich habe das vergessen. Es ist alles oben genannte.Im Kern auf allen Plattformen ist es PyGTK, dann auf Maemo 4 gibt es einige Hildon-Sachen (Maemo-spezifische Widgets, die verschiedene Namen/Signale/etc haben) und dann auf Maemo 5 gibt es noch mehr ausgefallene Hildon-Sachen und andere andere Widgets, die das machen App mehr verwendbar. Auch bei der Maemo 5-Version möchten wir eine Rotationsunterstützung haben, bei der Widgets im laufenden Betrieb neu angeordnet werden müssen. – nikosapi

Antwort

0

Sie könnten die plattformspezifischen Dinge, die Sie tun müssen, in kleine einheitlich benannte Funktionen innerhalb eines platform Moduls isolieren, den richtigen Funktionsnamen mit der Plattform erstellen, auf der Sie laufen und dann getattr die richtige und nennen Sie es. Das if/else-Boilerplate würde dann verschwinden.

10

Sie könnten viel von diesem in einer Fabrik aufzuwickeln:

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

Dann irgendwo in Ihrem Code früh, Sie rufen genau das Werk:

spec = createSpec() 

Nun, Sie überall sonst Bedingungen hatten rufen Sie einfach die notwendige Funktion:

spec.drawComboBox() 

Solange drawComboBox() , behandelt alles, was spezifisch für die Plattform ist, sollten Sie in guter Form sein.

0

Ich habe ein separates Modul erstellt, um alle meine Spezialisierung zwischen normalen Linux, Maemo 4.1 und Maemo 5 zu behandeln. Es erkennt, welche Funktionen verfügbar sind und ermöglicht es dem Programm, würdevoll degradieren.

Zum Beispiel

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 

Weitere Informationen finden sich Dialcentral, Gonert, ejpi oder Quicknote Quellcode für eine Datei namens hildonize.py https://garage.maemo.org/plugins/ggit/browse.php/?p=gc-dialer;a=blob;f=src/hildonize.py;

Ein weiteres Beispiel aus der Art des Code GObject Utils One Ring (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 
Verwandte Themen