2010-09-09 5 views
7

Ich schreibe gerade eine PyGTK-Anwendung und würde mir gerne einen Ratschlag geben, wie ich meine Anwendung am besten strukturiere. Grundsätzlich liest die Anwendung eine bestimmte Dateispezifikation und präsentiert sie in einer GUI zur Bearbeitung.Wie kann man eine Python GTK + -Anwendung schreiben?

Derzeit habe ich eine parser.py, die alle Low-Level-Datei IO und Parsing der Datei behandelt. Ich zeige den Inhalt der Datei in einer Baumansicht an, was bedeutet, dass ich einen Baumspeicher als meinen Datentyp verwenden muss.

Das Problem ist, dass ich nur an zwei Lösungen für dieses Problem gedacht habe. Der erste ist, dass mein Parser einen Baumspeicher erstellen und an meine ui-Klasse übergeben kann. Das erfordert, dass mein Parser von pygtk abhängt, und minimiert die mögliche Wiederverwendung für die Klasse. Die zweite wäre, einen Verweis auf meine ui-Klasse im Parser zu speichern, was auch die Wiederverwendung meiner Parser-Klasse als eigenständige Bibliothek einschränken würde.

Um meine Frage zu einem kurzen Liner zu verdichten: Gibt es eine Möglichkeit, meine Ziele auf pythonhale oder OO-freundliche Weise zu erreichen?

Wenn bei meinem Code suchen würde helfen, meine Frage jeder, der versucht zu beantworten: https://code.launchpad.net/~blainepace/nbtparser/trunk

Andere pythonic Vorschläge willkommen, dies ist mein erstes Python-Programm, und ich kann in einem C++ Stil des Denkens stecken. Ich habe vor, viel davon zu refaktorieren.

Antwort

4

Sie sollten sich das Tutorial "Sub-classing GObject in Python" ansehen. Dies geschieht durch die Verwendung des GObject-Typsystems zur Erzeugung von Signalen und Eigenschaften, mit denen Sie das zugrundeliegende Verhalten so modellieren können, dass es leicht in die typische PyGTK-Semantik integriert werden kann (Verbindung mit Signalen, Warten auf Eigenschaftsbenachrichtigungen usw.).

Sowohl Ihr Parser als auch Ihre Benutzeroberfläche sollten nur Eigenschaften und Signale enthalten, zu denen eine Verbindung hergestellt werden kann. Sie haben dann eine dritte Klasse, die diese Signale und Rückrufe verbindet und die Hauptschleife in einem if __name__ == __main__ Block startet.

Normalerweise schauen Mine so etwas wie:

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) 

... und dann in Ihrem Haupt-Skript:

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

app.show_all() 

gtk.main() 

Natürlich ist dies oft unterschiedlich, abhängig von z. verwende ich Glade? Unterteile ich Widgets für die Hauptanwendung oder wickle sie um? etc.

Das Tolle daran ist, dass Sie dann beispielsweise einen Testparser schreiben können, der nur vorprogrammierte Antworten zurückgibt oder eine bekannte Testdatei verwendet. Es einzutauschen ist so einfach wie das Ändern einer Zeile über:

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

Danke, Sie zeigten mir in die richtige Richtung. – sensae

Verwandte Themen