Seite 1 von 1

Funktion der GUI aufrufen

Verfasst: Donnerstag 5. Januar 2017, 10:12
von joh#
Hallo,

eine ziemlich grundlegende Frage:
Ich habe ein QTextEdit in das Programmausgaben
geprinted werden sollen. Solange das durch eine
Methode der GUI selbst passiert funktioniert das:

Code: Alles auswählen

import sys
from PyQt4 import QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        layout = QtGui.QVBoxLayout(self)
        self.button = QtGui.QPushButton('Test')
        self.edit = QtGui.QTextEdit()
        layout.addWidget(self.edit)
        layout.addWidget(self.button)
        self.button.clicked.connect(self.handleTest)

    def handleTest(self):
        self.edit.append('spam: spam spam spam spam')

if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec_())
Was aber, wenn Ausgaben von code eines anderen Python moduls in der GUI gedruckt werden sollen.
Bei mir ist die GUI erst später dazugekommen und das bisherigeprinten auf die Konsole soll nun alles
im QTextEdit landen. Der button im Bsp. würde also code des anderen moduls starten, welches dann seinerseits
drucken möchte.

Gruß
joh

Re: Funktion der GUI aufrufen

Verfasst: Donnerstag 5. Januar 2017, 10:43
von Sirius3
@joh#: Du solltest nicht einfach so etwas in Funktionen ›printen‹. Die Methode der Wahl dafür ist „logging“. Das Modul logging aus der Standardbibliothek bietet an, eigene Handler zu definieren, die z.B. das Schreiben in ein QTextEdit statt auf die Konsole übernehmen. Dadurch kannst Du nachträglich relativ einfach die Ausgabe Deiner Funktionen umleiten.

Re: Funktion der GUI aufrufen

Verfasst: Donnerstag 5. Januar 2017, 10:52
von MagBen
joh# hat geschrieben:Der button im Bsp. würde also code des anderen moduls starten, welches dann seinerseits drucken möchte.
Das läuft dann immer noch alles im GUI-Event-Thread und ist damit OK. Wenn eine GUI umfangreicher wird, dann gibt so etwas allerdings ein ziemliches durcheinander. Model-View-Controller schafft da Ordnung.

Re: Funktion der GUI aufrufen

Verfasst: Freitag 6. Januar 2017, 16:05
von joh#
MagBen hat geschrieben:
joh# hat geschrieben:Der button im Bsp. würde also code des anderen moduls starten, welches dann seinerseits drucken möchte.
Das läuft dann immer noch alles im GUI-Event-Thread und ist damit OK.
Das beschert mir dann allerdings beim Aufruf einer länger dauernden Berechnung in der externen Funktion aus der GUI heraus,
das die Ausgaben in die GUI hinein erst nach Beenden der externen Funktion angezeigt werden.
Da die externen Funktion nun schon mal eine Referenz auf die GUI hat, kann man dann die GUI main loop o.ä nicht auch 'von Hand'
immer mal aufrufen, um ein Refreshen der Ausgaben zwischendurch zu erzielen?

Re: Funktion der GUI aufrufen

Verfasst: Freitag 6. Januar 2017, 16:21
von BlackJack
@joh#: Die Berechnung sollte keine GUI-Elemente kennen. Dann vermischt Du Programmlogik und Benutzerinteraktion. Das ist genau das Problem was Du mit dem ``print`` aus dem Berechnungsteil schon hattest und jetzt zu lösen versuchst. Zu versuchen den ereignisbasierten Programmablauf der GUIs üblich ist, doch wieder mit ”Gewalt” an Dich zu reissen ist keine sinnvolle Lösung. Wenn tatsächlich längere Berechnungen parallel zur GUI laufen müssen, dann verwendet man Threads. Also bei Qt dann `QThread` wenn man das Signal/Slot-Konzept verwenden möchte, um zum Beispiel Ergebnisse zu signalisieren und die dann anzuzeigen.