2010-09-09 27 views
7

Actualmente estoy escribiendo una aplicación PyGTK y me gustaría obtener algunos consejos sobre la mejor manera de estructurar mi aplicación. Básicamente, la aplicación leerá una especificación de archivo específica y la presentará en una GUI para su edición.¿Cuál es una forma de "buena práctica" para escribir una aplicación Python GTK +?

Actualmente tengo un parser.py que maneja todo el archivo de nivel bajo IO y el análisis del archivo. Estoy mostrando el contenido del archivo en una vista de árbol, lo que significa que necesito usar un almacén de árboles como mi tipo de datos.

El problema que me he encontrado es que solo he pensado en dos soluciones para este problema. La primera es que mi analizador podría construir una arboleda y pasarla a mi clase de ui. Eso requiere que mi analizador dependa de pygtk, y minimiza la posible reutilización para la clase. El segundo sería almacenar una referencia a mi clase ui en el analizador, lo que también podría limitar la reutilización de mi clase de analizador como una biblioteca independiente.

Para condensar mi pregunta en un trazador de líneas corto: ¿Hay alguna manera de lograr mis objetivos de una manera más pythonic u OO-friendly?

Si mirando mi código podría ayudar a cualquiera que trate de responder a mi pregunta: https://code.launchpad.net/~blainepace/nbtparser/trunk

Otras sugerencias Pythonic bienvenidos, este es mi primer programa en Python y puede ser atrapado en un estilo más C++ de pensar. Planeo refacturar mucho.

Respuesta

4

Deberías echar un vistazo al tutorial "Sub-classing GObject in Python". Esto pasa mediante el uso del sistema de tipos de GObject para crear señales y propiedades, que le permiten modelar el comportamiento subyacente de una manera que es fácil de integrar con la semántica típica de PyGTK (conexión a señales, a la espera de notificaciones de propiedad, etc.).

Tanto su analizador como su IU deben tener solo propiedades y señales para conectarse. Luego tiene una tercera clase que conecta estas señales y devoluciones de llamada e inicia el ciclo principal en un bloque if __name__ == __main__.

Por lo general, la mía ser algo como:

class MyApp(gtk.Window): 

    def __init__(self, parser, ui): 
     gtk.Window.__init__(self) 
     parser.connect("some-signal", ui.update_this) 
     parser.connect("some-other-signal", ui.update_that, extra_params) 
     ui.connect("refresh-clicked", parser.reparse_file) 
     self.add(ui) 

... y luego en el script principal:

parser = parser.Parser(...) 
ui = view.ParseView(...) 
app = MyApp(parser, ui) 

app.show_all() 

gtk.main() 

Por supuesto, esto es a menudo diferente dependiendo, por ejemplo. ¿Estoy usando Glade? ¿Subclases widgets para la aplicación principal o los envuelvo? etc.

Lo mejor de esto es que puede escribir, por ejemplo, un analizador de prueba que no hace más que devolver respuestas preprogramadas, o utiliza un archivo de prueba conocido. Cambiarlo es tan fácil como cambiar una línea arriba:

parser = parser.DummyParser(...) 
+0

Gracias, me apuntaste en la dirección correcta. – sensae

Cuestiones relacionadas