2010-01-07 6 views
7

Je travaille sur une application python qui fonctionne sur 2 plateformes différentes, à savoir le bureau standard linux et Maemo 4. Nous utilisons PyGTK sur les deux plates-formes mais sur Maemo il y a un tas de petites modifications qui sont implémentées comme suit:Comment gérer plusieurs interfaces utilisateur communes?

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

Il y a à peu près 15 de ces déclarations, si nécessaire pour obtenir l'interface utilisateur recherche et de travail agréable sur Maemo 4.

cela a été très facile à gérer pour tout ce temps. Le problème est qu'il y a quelques temps une nouvelle version de Maemo a été publiée (5, alias fremantle) et il y a de grandes différences par rapport à Maemo 4. Je ne veux pas ajouter un tas de contrôles dans le code de l'interface graphique pour faire en sorte que les trois plates-formes fonctionnent bien avec la même base de code, car cela serait désordonné. Je ne veux pas non plus créer une copie du code GUI d'origine pour chaque plate-forme et le modifier simplement pour la plate-forme spécifique (je voudrais réutiliser autant de code que possible).

Alors, quelles sont les façons d'avoir légèrement différentes interfaces utilisateur pour différentes plates-formes qui sont basées sur le même code de base de l'interface utilisateur? Je ne pense pas que ce soit un python ou une question spécifique à Maemo, j'aimerais juste savoir comment cela est fait.

+2

Quel genre de code est différent entre les plates-formes: les callbacks, les widgets utilisés, la façon dont les widgets sont disposés (dans différents conteneurs ou différentes commandes), ou seulement certaines propriétés spécifiques à la plate-forme sur les widgets? – LeafStorm

+0

Désolé, j'ai oublié ça. C'est tout ce qui précède.Au cœur de toutes les plateformes c'est PyGTK, puis sur Maemo 4 il y a des trucs hildon (des widgets spécifiques à Maemo qui ont différents noms/signaux/etc) puis sur Maemo 5 il y a encore plus de trucs hildon et d'autres widgets qui font le application plus utilisable. En outre, sur la version Maemo 5, nous voulons avoir un support de rotation qui nécessite de réorganiser les widgets à la volée. – nikosapi

Répondre

0

Vous pouvez isoler les éléments spécifiques à la plate-forme que vous devez faire dans de petites fonctions nommées de manière cohérente dans un module platform, créer le nom de fonction correct à l'aide de la plate-forme que vous utilisez, puis l'appeler. Le passe-partout if/else disparaîtrait alors.

10

Vous pouvez liquider une grande partie de cela dans une usine:

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

Puis, quelque part au début de votre code, il vous suffit d'appeler cette usine:

spec = createSpec() 

Maintenant, partout ailleurs vous aviez des conditions , vous appelez simplement la fonction nécessaire:

spec.drawComboBox() 

tant que drawComboBox() , gère tout ce qui est spécifique à la plate-forme, vous devriez être en bonne forme.

0

J'ai fait un module séparé pour gérer toutes mes spécialisations entre Linux normal, Maemo 4.1 et Maemo 5. Il détecte quelles sont les fonctionnalités disponibles et permet au programme de se dégrader de façon élégante.

Par exemple

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 

Pour plus, voir Dialcentral, Gonert, ejpi, ou le code source de Quicknote pour un fichier appelé hildonize.py https://garage.maemo.org/plugins/ggit/browse.php/?p=gc-dialer;a=blob;f=src/hildonize.py;

Un autre exemple de la GObject de l'Anneau 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 
Questions connexes