ausgabe in fesnter ODER Konsole

Plattformunabhängige GUIs mit wxWidgets.
Antworten
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Hi,

ich spiele gerade ein wenig mit wxPython.
Ich möchte jetzt für eine Funktion, die während ihrer Abarbeitung jede Menge (Logging-)Output erzeugt, dieser Output entweder in ein Fenster geschrieben wird, wenn das Programm mit Gui gestartet wird, oder in die Konsole, wenn die Funktion ohne Gui aufgerufen wird (z.B. beim testen etc.)

Gibt es dafür ein best practice?

Meine erste Idee sieht so aus:

Code: Alles auswählen

def test(tc=None):

    class inner():
        def write(self, msg):
            print msg

    if tc == None:
        tc = inner()

    tc.write("blabla")

if __name__ == '__main__':
    test()
'tc' ist hier das Textfeld, welches eine 'write'-Methode implementiert. Wird kein Textfeld übergeben, mappe ich halt tc auf eine kleine pseudo-Klasse, die nur diese wirte-Methode hat. So ist es für die Funktion im weiteren Verlauf egal, ob sie in die Gui oder die Konsole ausgibt.

Ist das so "okay", oder gibt es da bessere, "pythonischere", Möglichkeiten und Wege?

Gruß,
r.
BlackJack

Du könntest `sys.stdout` bei Bedarf durch ein Objekt ersetzen das in ein Textfeld schreibt. Dann landet jedes ``print`` dort.

Oder Du beschäftigst Dich mit dem `logging`-Modul aus der Standardbibliothek und schreibst dafür einen entsprechenden Logger der in ein Textfeld schreibt.

Nachtrag: Deine Funktion ist jedenfalls sehr umständlich. Die `inner`-Klasse wird bei jedem Aufruf neu erstellt um dann eventuell *ein* Exemplar davon zu erzeugen und darauf dann *einmal* die *eine* Methode aufzurufen. Unnötige Komplexität ohne Ende. Das könnte man im Grunde auch hierauf eindampfen:

Code: Alles auswählen

import sys

def test(tc=sys.stdout):
    tc.write('blabla\n')
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Hi, danke für deine Antwort.

Also, die eine 'write' Methode wird ja nicht nur einmal aufgerufen, sondern soll während der Verarbeitung laufend Infos über den Aktuellen Arbeitsschritt und den Status raushauen.

Aber dass es so zu Umständlich ist habe ich mir schon gedacht, deswegen habe ich ja nachgefragt.
Da es mir in erster Linie mal darum ging, die Funktion auch unabhängig von der Gui nutzen zu können, werde ich erst mal sys.stdout nutzen.

Auf lange Sicht werde ich mir aber mal das logging-modul zu Gemüt führen müssen.

Gruß,
r.
Antworten