TextCtrl und Konsole

Plattformunabhängige GUIs mit wxWidgets.
Antworten
m0ps1234
User
Beiträge: 40
Registriert: Freitag 13. März 2009, 08:57

Hallo zusammen.
Ich sitz hier jetzt seid ca 3 Stunden und komm einfach nicht weiter.
Ich hab das Forum schon durchsucht und hab auch den ein oder anderen Thread gefunden, der mein Problem anspricht, aber ich chegg es einfach nicht.

Ich ich habe ein Modul A, das mir Werte und Fehlermessages(gewollt) in der Console ausgibt.
Dazu habe ich jetzt ein Gui gebaut, das ein TextCtrl und Buttons enthält.
Drückt man den "Start"-Button, rattert A sein Programm da durch.

Aber wie schaffe ich es, dass die Ausgaben von A in dem TextFenster des Gui erscheinen?
Ich hab irgendwas von "subprocess" gelesen. Hab es mir in der Docu angeschaut und was soll ich sagen... ...als Neuling wurde ich völligst erschlagen.
Bin ich mit subprocess auf dem richtigen Weg?
Oder funktioniert das doch anders? Hat vielleicht jemand einen Tipp für mich?

Habe schon diesen "Konsole in wx.Fenster" - Thread angeschaut, aber das ist alles noch ein bischen unklar für mich.

Grüße
Matthias
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

ein paar Fragen:
- Möchtest Du gleichzeitig in Konsole und TextCtrl schreiben?
- Wieso subprocess? Ich denke, Dein Modul gibt Strings zurück?

Gruß,
Christian
m0ps1234
User
Beiträge: 40
Registriert: Freitag 13. März 2009, 08:57

Theoretisch würde mir die Ausgabe in dem TextCtrl reichen.

Dachte Subprocess verwendet man, wenn man die stdout und stderr eines anderen Moduls angezeigt haben möchte? Oder hab ich das falsch verstanden?
Das Modul A gibt Strings zurück. Aber auch Fehlermeldungen möchte ich in dem TextCtrl angezeigt bekommen.

Grüße
Matthias
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

Bzgl. subprocess hast Du in der Tat etwas falsch verstanden: Man verwendet es, wenn man auf die Ausgaben eines externen (!) Programmes zugreifen will. Das Modul "A" ist Dein Modul und Bestandteil Deines Programms. Du kannst es gestalten, wie Du magst.

Mal angenommen Dein Modul "A" hat eine Methode "call()" und die gibt einen String oder ein Objekt mit __repr__() zurück, dann geht im GUI:

Code: Alles auswählen

class Mygui(wx.Frame):
    def __init__(self, parent, id, title):
         wx.Frame.__init__(self, None, -1, title)
         self.textfield = wx.TextCtrl(...) # Dir überlassen
         # hier die Positionierung von self.textfield mit Sizern
         # und alles Weitere.
         a = A()

    def big_action(self, event):
        ...
        try:
            result = a.call()
            self.textfield.write(result)
        except Exception, msg:
            self.textfield.write(msg)
            x = self.textfield.GetLastPosition()
            self.textfield.SetStyle(x-len(msg), x, wx.TextAttr("Red"))
Besonders "sophisticated" ist das nicht, aber ist hoffentlich ein Startpunkt.

HTH
Christian
m0ps1234
User
Beiträge: 40
Registriert: Freitag 13. März 2009, 08:57

Danke für deine Antwort.
Bin durch folgende Zeile ja schonmal soweit, dass er mir wenigstens die "GUI-Meldungen" alle im TextCtrl anzeigt...

Code: Alles auswählen

def __LogTextCtrlInit(self):
        self.__logWindow = wx.TextCtrl(self.panel, -1, style = wx.TE_MULTILINE | wx.TE_READONLY | wx.HSCROLL
                                      , size = (600,200)
                                      , pos = (30,55))
        sys.stdout = sys.stderr = self.__logWindow
So:
Das Modul A hat eine call, die aufgerufen wird. In dieser werden mehrere Methoden abgearbeitet.
Wenn diese Methoden Fehler werfen, werden sie über ein loggingmodul jeweils an die Konsole weitergeleitet, die Methode übersprungen und Modul A rattert weiter.
Sry, dass ich das jetzt erst schreib, bin noch Anfänger und tu mir immer noch n bischen schwer mit den verzwickten Konstrukten.

Ich bräuchte also ne Möglichkeit die stdout und stderr dieser loggingMethode anzuzeigen. Mit deiner Möglichkeit wird ja entweder das Ergebnis ausgegeben oder eben die eine Fehlermessage.

Grüße
MAtthias
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Wieso hat Deine Methode ein Ergebnis, wenn sie eine Exception wirft? Kann zwar sein, aber macht mich, gerade bei Anfängern, etwas mißtrauisch, ob das Design stimmig ist - sorry.

Was Du machen kannst ist z. B. das gute alte Linebuffer-Module von Dookie verwenden und entsprechend beide Kanäle als receiver setzen.

Ansonsten zeige doch mal etwas mehr Code, sonst wird das hier ein Rumgerate ... (Code am besten in einen Pastebin).

Gruß,
Christian
m0ps1234
User
Beiträge: 40
Registriert: Freitag 13. März 2009, 08:57

Danke erstmal für deine Bemühungen.

Das mit Anfänger und den Methoden ist so, dass ich eignetlich studiere und jetzt in den Ferien arbeite. Also wurde ich vor 2 Wochen das erste Mal mit Python konfrontiert (hatte vorher nur n bischen mit Java zu tun). Ich soll mich hier in Python einarbeiten und eine GUI zu einem Programm erstellen, das bis jetzt nur über die Konsole lief.
Deswegen weiß ich nicht, ob ich den Code hier posten darf.
Das GUI funktioniert einwandfrei, nur bei besagter call-Methode klappt es nicht.

Ich weiß, kein code = schwer zu helfen.
Werd einfach mal rumprobieren und vielleicht bekomm ich bei den Angestellten noch n bischen was raus.

Trotzdem Danke!
Antworten