2016-10-15 8 views
0

Ich versuche, stdout zu beiden Konsole und QTextBrowser Widget zu senden. Aber ich bekomme eine Art Endlosschleife und dann wird die Anwendung beendet.Unendlich Schleife, wenn versuchen, stdout umleiten

Hier ist mein Code:

import sys 
from PyQt5 import QtWidgets, uic 
from PyQt5.QtCore import * 

qtCreatorFile = "qt_ui.ui" 
Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile) 

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): 
    def __init__(self): 
     QtWidgets.QMainWindow.__init__(self) 
     Ui_MainWindow.__init__(self) 
     self.setupUi(self) 
     self.start_button.clicked.connect(printing) 

def printing(): 
    print("Pressed!\n") 

class Logger(QObject): 
    def __init__(self): 
     super().__init__() 
     self.terminal = sys.stdout 

    def write(self, message): 
     self.terminal.write(message) 
     self.log_browser.setText(message) #problem is in this line 

    def flush(self): 
     pass 

if __name__ == "__main__": 
    sys.stdout = Logger() 
    app = QtWidgets.QApplication(sys.argv) 
    window = MainWindow() 
    window.show() 
    sys.exit(app.exec_()) 

Als Ergebnis, wenn Klick start_button, beobachtet wird, folgende:

"C:\...\python.exe" "E:/.../qt_gui.py" 
Pressed! 
Pressed! 
Pressed! 
... (totaly 332 times) 
Pressed! 
Pressed! 
Pressed! 

Process finished with exit code 1 

Ich kann einfach nicht verstehen, warum diese Linie Schleife macht:

self.log_browser.setText(message) 

Nach der ersten Antwort bearbeiten:

Ich ersetzte die obige Zeile durch print(message), aber immer noch die gleichen Ergebnisse. Ich würde jede Hilfe schätzen.

+0

Es gibt eine Einbuchtung Fehler unter der Klasse defintion –

+0

Es war copy/paste Fehler, nicht von den ursprünglichen Code. Ich habe es korrigiert. – dandepeched

Antwort

0

Sie ein eigenes Signal aus Logger emittieren könnten und es in dem Log-Browser verbinden:

class Logger(QObject): 
    loggerMessage = pyqtSignal(str) 

    def __init__(self): 
     super().__init__() 
     self.terminal = sys.stdout 

    def write(self, message): 
     self.terminal.write(message) 
     self.loggerMessage.emit(message) 

    def flush(self): 
     pass 

if __name__ == "__main__": 

    sys.stdout = Logger() 
    app = QtWidgets.QApplication(sys.argv) 
    window = MainWindow() 
    sys.stdout.loggerMessage.connect(window.log_browser.insertPlainText) 
    window.show() 
    sys.exit(app.exec_()) 
+0

Ich habe diesen Code versucht, aber Nachrichten erscheinen nicht in QTextBrowser. Irgendein Vorschlag warum? – dandepeched

+0

@dandepeched. Es scheint so, als würde "print" zweimal "stdout" * schreiben - einmal für den Text und einmal für die Endzeile. Wenn Sie 'setText' verwenden, überschreibt das zweite Signal das erste. Ich habe mein Beispiel geändert, um 'insertPlainText' zu verwenden, also fügt es stattdessen alle Nachrichten an. – ekhumoro

+0

Dieser hat funktioniert! Danke vielmals! – dandepeched

0

Sieht so aus, als wäre der von Ihnen gepostete Code kein Code, den Sie ausgeführt haben, aber wenn er repräsentativ ist, gibt es zwei Fehler: Die Basisklasse von Logger muss initiert werden und self.log_browser ist nirgendwo definiert. Dies führt jedoch nicht zu Schleifen, App-Exits (da es eine Ausnahme gibt, aber keinen Ausnahme-Hook, siehe). Da ich nicht weiß, was log_browser sein sollte, habe ich es als Mock() (von unittest.mock) definiert, das alles akzeptiert, was damit gemacht wird, und das Problem verschwindet.

class Logger(QObject): 
    def __init__(self): 
     super().__init__() 
     self.terminal = sys.stdout 
     from unittest.mock import Mock 
     self.log_browser = Mock() 

    def write(self, message): 
     self.terminal.write(message) 
     self.log_browser.setText(message) # problem was this line 

    def flush(self): 
     pass 
+0

log_browser ist in der Datei "qt_ui.ui" definiert, die von uic übersetzt wird. – dandepeched

+0

self.log_browser = QtWidgets.QTextBrowser (self.centralwidget) – dandepeched

+0

Ich vereinfachte Code durch Ersetzen von log_browser mit Druckfunktion, auch initialisierte Klasse, wie Sie sagten, aber immer noch das gleiche Verhalten. – dandepeched