Funktion der GUI aufrufen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

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
Zuletzt geändert von Anonymous am Donnerstag 5. Januar 2017, 11:14, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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.
a fool with a tool is still a fool, www.magben.de, YouTube
joh#
User
Beiträge: 139
Registriert: Freitag 6. November 2009, 13:16

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?
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.
Antworten