2016-10-15 4 views
0

콘솔과 QTextBrowser 위젯 모두에 stdout을 보내려고합니다. 하지만 무한 루프가 발생하고 응용 프로그램이 종료됩니다.표준 출력을 리디렉션하려고 할 때 무한 루프

:이 라인은 루프를 만드는 이유

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

Process finished with exit code 1 

난 그냥 이해할 수 없다 : 결과

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_()) 

, 클릭 START_BUTTON이 관찰된다 다음 : 여기

내 코드입니다
self.log_browser.setText(message) 

1 차 답차 후 편집 :

위의 행을 print(message)으로 바꾸었지만 여전히 동일한 결과가 나타납니다. 나는 어떤 도움을 주셔서 감사합니다.

+0

는 클래스 (고화질) –

+0

아래에 들여 쓰기 오류가있다 그것은 복사/붙여 넣기 오류가 아닌 원래의 코드에서였다. 나는 그것을 바로 잡았다. – dandepeched

답변

0

당신은 Logger에서 사용자 정의 신호를 방출 할 수 및 로그 브라우저에 연결 :

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

이 코드를 시도했지만 QTextBrowser에 메시지가 나타나지 않습니다. 어떤 제안? – dandepeched

+0

@depepeched. 그것은'print'가'stdout' * 두 번 쓰는 것 같습니다 - 한 번은 텍스트를위한 것이고 한 번은 endline을위한 것입니다. 따라서'setText'를 사용하면 두 번째 신호가 첫 번째 신호를 덮어 씁니다. 내 예제를'insertPlainText'를 사용하도록 변경 했으므로 대신 모든 메시지를 추가합니다. – ekhumoro

+0

이 하나 일했습니다! 고마워요! – dandepeched

0

게시 한 코드가 실행 한 코드가 아닌 것처럼 보이지만 대표적인 것으로 가정하면 두 가지 오류가 있습니다. 로거의 기본 클래스를 삽입해야하며 self.log_browser는 어디에도 정의되어 있지 않습니다. 그러나 이것은 루프, 앱 종료를 일으키지 않습니다 (예외가 있지만 예외 훅이 없으므로 참조). log_browser가 무엇인지 알지 못하기 때문에, 나는 그것을 아무 것도 받아 들일 수있는 Mock() (unittest.mock에서)으로 정의하고, 문제는 사라진다.

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는 "qt_ui.ui"파일에 정의되어 있으며,이 파일은 사용자가 번역했습니다. – dandepeched

+0

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

+0

log_browser를 print 함수로 대체하여 코드를 단순화하고 앞에서 설명한대로 클래스를 초기화하지만 여전히 동일한 동작을 얻습니다. – dandepeched