2010-01-07 9 views
7

Estoy trabajando en una aplicación python que se ejecuta en 2 plataformas diferentes, a saber, escritorio regular Linux y Maemo 4. Utilizamos PyGTK en ambas plataformas, pero en Maemo hay un montón de pequeños ajustes para que se vea bien que se implementan como la siguiente manera:¿Cómo trato con múltiples interfaces de usuario comunes?

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

Hay aproximadamente 15 de ellos si las declaraciones necesarias para obtener la interfaz de usuario en busca de trabajo y agradable en Maemo 4.

esto ha sido muy manejable para todo este tiempo. El problema es que hace un tiempo hubo una nueva versión de Maemo lanzada (5, también conocida como fremantle) y tiene algunas grandes diferencias en comparación con Maemo 4. No quiero agregar muchos controles en el código GUI para poder consigue que las 3 plataformas funcionen bien con la misma base de código porque eso sería complicado. Tampoco quiero crear una copia del código GUI original para cada plataforma y simplemente modificarlo para la plataforma específica (me gustaría volver a usar la mayor cantidad de código posible).

Entonces, ¿cuáles son las formas de tener ligeramente UI diferentes para plataformas diferentes que se basan en el mismo código de interfaz de usuario central? No creo que esta sea una pregunta específica de Python o Maemo, solo me gustaría saber cómo se hace esto.

+2

¿Qué tipo de código es diferente entre las plataformas: las devoluciones de llamada, los widgets utilizado, la forma de los widgets están dispuestas (es decir, en diferentes contenedores o diferentes pedidos), o solo ciertas propiedades específicas de la plataforma en los widgets? – LeafStorm

+0

Lo siento, lo olvidé. Es todo lo de arriba.En el núcleo de todas las plataformas está PyGTK, luego en Maemo 4 hay algunas cosas de hildon (widgets específicos de Maemo que tienen diferentes nombres/señales/etc.) y luego en Maemo 5 hay cosas de hildon más sofisticadas y otros widgets que hacen aplicación más útil. Además, en la versión de Maemo 5 queremos soporte de rotación que requiere reorganizar widgets sobre la marcha. – nikosapi

Respuesta

0

Puede aislar las cosas específicas de la plataforma que necesita en pequeñas funciones consistentes en un módulo platform, crear el nombre de la función correcta utilizando la plataforma en la que se está ejecutando y luego llamar al getattr. La repetición if/else desaparecería entonces.

10

Usted podría terminar mucho de esto en una fábrica:

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

Entonces, en algún lugar al principio de su código, que acaba de llamar esa fábrica:

spec = createSpec() 

Ahora, en cualquier otro lugar que tenía condiciones , que acaba de llamar la función necesaria:

spec.drawComboBox() 

mientras drawComboBox() , maneja cualquier cosa específica de la plataforma, debe estar en buena forma.

0

He hecho un módulo separado para manejar todas mis especializaciones entre Linux normal, Maemo 4.1 y Maemo 5. Detecta qué características están disponibles y permite que el programa se degrade graciosamente.

Por ejemplo

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 

Para más información, véase el Dialcentral, Gonert, ejpi, o el código fuente de Quicknote un archivo llamado hildonize.py https://garage.maemo.org/plugins/ggit/browse.php/?p=gc-dialer;a=blob;f=src/hildonize.py;

Otro ejemplo de entre el uno del Anillo GObject Utilidades (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 
Cuestiones relacionadas