2010-09-09 7 views
7

Je suis en train d'écrire une application PyGTK et j'aimerais avoir quelques conseils sur la meilleure façon de structurer mon application. Fondamentalement, l'application va lire une spécification de fichier spécifique et le présenter dans une interface graphique pour l'édition.Quelle est la meilleure façon d'écrire une application Python GTK +?

Actuellement, j'ai un parser.py qui gère tous les IO de fichiers de bas niveau et l'analyse du fichier. J'affiche le contenu du fichier dans une arborescence, ce qui signifie que je dois utiliser un treestore comme type de données.

Le problème que j'ai rencontré est que j'ai seulement pensé à deux solutions à ce problème. Le premier est que mon parseur pourrait construire un treestore et le passer à mon cours d'ui. Cela nécessite mon analyseur en fonction de pygtk, et minimise la réutilisation potentielle pour la classe. La seconde consisterait à stocker une référence à ma classe ui dans l'analyseur, ce qui limiterait potentiellement la réutilisation de ma classe d'analyseur en tant que bibliothèque autonome.

Pour condenser ma question en un court doublure: Y a-t-il un moyen d'atteindre mes objectifs d'une manière plus pythonique ou OO-friendly?

Si regardant mon code aiderait toute personne essayant de répondre à ma question: https://code.launchpad.net/~blainepace/nbtparser/trunk

Autres suggestions pythonique bienvenue, ceci est mon premier programme de python et je peux être coincé dans un style plus C++ de la pensée. Je prévois de refactoriser beaucoup de cela.

Répondre

4

Vous devriez jeter un coup d'œil au tutoriel "Sub-classing GObject in Python". Cela passe par l'utilisation du système de type GObject pour créer des signaux et des propriétés qui vous permettent de modéliser le comportement sous-jacent d'une manière facile à intégrer avec la sémantique typique de PyGTK (connexion aux signaux, attente de notifications de propriétés, etc.). Votre analyseur et votre interface utilisateur ne doivent avoir que des propriétés et des signaux auxquels se connecter. Vous avez ensuite une troisième classe qui connecte ces signaux et rappels et démarre la boucle principale dans un bloc if __name__ == __main__.

En règle générale, le mien ressemble à quelque chose comme:

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) 

... puis dans votre script principal:

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

app.show_all() 

gtk.main() 

Bien sûr, cela est souvent différent selon par exemple. est-ce que j'utilise Glade? Dois-je sous-classer les widgets pour l'application principale ou les envelopper?

La bonne chose à ce sujet est que vous pouvez ensuite écrire, disons, un analyseur de test qui ne fait que retourner des réponses préprogrammées, ou utilise un fichier de test connu. L'échange est aussi facile que de changer une ligne ci-dessus:

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

Merci, vous m'a indiqué dans la bonne direction. – sensae

Questions connexes