Wie organisiere ich mein Programm richtig?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Sunny0815
User
Beiträge: 6
Registriert: Montag 26. Mai 2008, 07:44
Wohnort: Ilmenau / Thüringen

Mittwoch 25. Juni 2008, 09:24

Hallo,

ich habe ein Problem, wahrscheinlich habe ich mein Programm falsch rum angefangen. Jedenfalls fehlt mir momentan die Idee wie ich folgendes Problem lösen kann:

Ich habe ein Programm (Python + wxPython + pySerial), mit dem ich ein Steuerungs-System ansprechen kann. Damit soll das System getestet werden, daher sind relativ viele verschiedene Aktionen erforderlich.

Das Programm besteht in der Basis aus einem großen Frame, mit einem großen TextCtrl, in dem alle Aktionen beschrieben werden (was geht raus zur Steuerung, was kommt zurück). Dann gibt es ein paar ComboBoxen um Dinge auszuwählen und eine Button-Sammlung um Aktionen auszulösen. So weit so schön, funktioniert sogar. 8)

Leider schaffe ich es nicht, das Programm zu modularisieren, da die Ausgaben in das Textfeld über Methoden des Haupt-Frames erfolgen.
Ich kürze den Code mal auf das Wesentliche zusammen. Für die Ausgaben habe ich Methoden in mehreren Farben.

Code: Alles auswählen

class Frame(wx.Frame):
# [ ... ]
        self.TextFeld = wx.TextCtrl(panel, -1, size=(780, 430),  # pos=(10, 30),
                               style=wx.TE_MULTILINE | wx.TE_RICH2 | wx.TE_READONLY)
# [ ... ]
    def roterText(self, text):
        self.TextFeld.SetDefaultStyle(wx.TextAttr("red"))
        self.TextFeld.AppendText(text)      # ins Textfeld schreiben
        LogFile.SchreibeText(text)          # ggf. ins Logfile schreiben
# [ ... ]

class App(wx.App):

    global HighVersion, LowVersion, BuildDate
    
    def OnInit(self):
        self.frame = Frame()
        if self.frame.portOK:       # wir haben einen gültigen seriellen Port, dann weiter
            self.frame.Show()
            self.SetTopWindow(self.frame)
            self.frame.schwarzerText(' %s - Starte rvmDiag Version %i.%i vom %s'
                                     %(Zeitstempel(0), HighVersion, LowVersion, BuildDate) )
        return True

if __name__ == '__main__':
    LogFile = clLogFile()
    #OpenPort()
    app = App()
    if not app.frame.portOK:
        app.frame.Destroy()
    app.MainLoop()
    ClosePort()
    

Ausgaben die von Methoden innerhalb des Frames erzeugt werden, passieren mit self.frame.roterText("Beispiel").

Das Problem sind Ausgaben von Hilfsfunktionen, die von "aussen" kommen. Diese erfolgen durch app.frame.roterText("Beispiel").
Wenn der Aufrufer im selben File steht, klappt das. Möchte ich modularisieren und Teile in andere Dateien auslagern, finden diese "app" nicht, nicht mal, wenn ich die Hauptdatei im Zirkelschluss importiere. (was schon gruselig genug wäre).

Ich grüble jetzt seit Tagen (immer mal wieder, nicht Vollzeit :lol: ) drüber nach, wie ich diesen Knoten gelöst bekomme. Mir fehlt ein passender Geistesblitz. Könnt ihr mir ein Licht aufstecken? :idea:

Viele Grüße
Matthias
OldBoy
User
Beiträge: 34
Registriert: Samstag 12. Januar 2008, 20:39

Mittwoch 25. Juni 2008, 11:08

Hallo Matthias,

schreibe deine Funktionen in ein eigenes Module (myfunc.py):

Code: Alles auswählen

def func1(f):
    f("Module myfunc, Funktion func1")

def func2(f):
    f("Module myfunc, Funktion func2")
und verwendende sie dann so im Hauptrogramm:

Code: Alles auswählen

.
.
import myfunc
.
.
    myfunc.func1(self.frame.schwarzerText)
    myfunc.func2(self.frame.roterText)
.
.

Gruss

OldBoy
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Mittwoch 25. Juni 2008, 12:49

Sunny0815 hat geschrieben:finden diese "app" nicht
Hallo Matthias!

Mit ``wx.GetApp()`` bekommst du vom ganzen Programm aus Zugriff auf die aktuelle App-Instanz. Deshalb ist die App-Klasseninstanz so ideal zum Verwalten der gesamten Anwendung -- auch wenn diese aus mehreren Frames besteht.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Sunny0815
User
Beiträge: 6
Registriert: Montag 26. Mai 2008, 07:44
Wohnort: Ilmenau / Thüringen

Mittwoch 25. Juni 2008, 13:28

Hi,
gerold hat geschrieben:Mit ``wx.GetApp()`` bekommst du vom ganzen Programm aus Zugriff auf die aktuelle App-Instanz. :-)
Ich glaub, das könnte der Ansatz sein, den ich gesucht habe - gleich mal probieren. - Dickes Danke!

Gut zwei Stunden später ist das Programm zerlegt - Klasse, genau sowas hab ich gesucht. Noch ein dickes Danke hinterher!

Grüßle
Matthias
Antworten