복붙노트

[PYTHON] pyqt에서 로그를 표시하는 가장 좋은 방법은 무엇입니까?

PYTHON

pyqt에서 로그를 표시하는 가장 좋은 방법은 무엇입니까?

현재 qt 디자이너를 사용하는 GUI에서 작업 중입니다. 로거 창처럼 작동하는 GUI에서 문자열을 인쇄하는 방법에 대해 궁금합니다. 나는 pyqt5를 사용하고있다.

해결법

  1. ==============================

    1.파이썬 로깅 모듈을 사용하는 경우 로그 메시지를 QPlainTextEdit 인스턴스 (Christopher에서 설명한대로)로 전달하는 사용자 정의 로깅 핸들러를 쉽게 만들 수 있습니다.

    파이썬 로깅 모듈을 사용하는 경우 로그 메시지를 QPlainTextEdit 인스턴스 (Christopher에서 설명한대로)로 전달하는 사용자 정의 로깅 핸들러를 쉽게 만들 수 있습니다.

    이렇게하려면 먼저 logging.Handler를 하위 클래스 화하십시오. 이 __init__에서 우리는 로그를 포함 할 QPlainTextEdit를 생성합니다. 여기서 중요한 점은 핸들이 emit () 함수를 통해 메시지를 수신한다는 것입니다. 그래서 우리는이 함수를 오버로딩하고 메시지 텍스트를 QPlainTextEdit에 전달합니다.

    import logging
    
    class QPlainTextEditLogger(logging.Handler):
        def __init__(self, parent):
            super(Logger, self).__init__()
    
            self.widget = QPlainTextEdit(parent)
            self.widget.setReadOnly(True)
    
        def emit(self, record):
            msg = self.format(record)
            self.widget.textCursor().appendPlainText(msg)
    
        def write(self, m):
            pass
    

    이 클래스에서 객체를 만들고 QPlainTextEdit의 부모 (예 : 기본 윈도우 또는 레이아웃)를 전달합니다. 그런 다음이 로거에이 핸들러를 추가 할 수 있습니다.

    # Set up logging to use your widget as a handler
    log_handler = QPlainTextEditLogger(<parent widget>)
    logging.getLogger().addHandler(log_handler)
    
  2. ==============================

    2.mfitzp의 대답을 기반으로 한 완전한 예제가 있습니다 :

    mfitzp의 대답을 기반으로 한 완전한 예제가 있습니다 :

    import sys
    from PyQt4 import QtCore, QtGui
    import logging
    
    # Uncomment below for terminal log messages
    # logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(name)s - %(levelname)s - %(message)s')    
    
    class QPlainTextEditLogger(logging.Handler):
        def __init__(self, parent):
            super().__init__()
            self.widget = QtGui.QPlainTextEdit(parent)
            self.widget.setReadOnly(True)    
    
        def emit(self, record):
            msg = self.format(record)
            self.widget.appendPlainText(msg)    
    
    
    class MyDialog(QtGui.QDialog, QPlainTextEditLogger):
        def __init__(self, parent=None):
            super().__init__(parent)    
    
            logTextBox = QPlainTextEditLogger(self)
            # You can format what is printed to text box
            logTextBox.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
            logging.getLogger().addHandler(logTextBox)
            # You can control the logging level
            logging.getLogger().setLevel(logging.DEBUG)
    
            self._button = QtGui.QPushButton(self)
            self._button.setText('Test Me')    
    
            layout = QtGui.QVBoxLayout()
            # Add the new logging box widget to the layout
            layout.addWidget(logTextBox.widget)
            layout.addWidget(self._button)
            self.setLayout(layout)    
    
            # Connect signal to slot
            self._button.clicked.connect(self.test)    
    
        def test(self):
            logging.debug('damn, a bug')
            logging.info('something to remember')
            logging.warning('that\'s not right')
            logging.error('foobar')
    
    if (__name__ == '__main__'):
        app = None
        if (not QtGui.QApplication.instance()):
            app = QtGui.QApplication([])
        dlg = MyDialog()
        dlg.show()
        dlg.raise_()
        if (app):
            app.exec_()
    
  3. ==============================

    3.Todd Vanyo의 PyQt5에 대한 예 :

    Todd Vanyo의 PyQt5에 대한 예 :

    import sys
    from PyQt5 import QtWidgets
    import logging
    
    # Uncomment below for terminal log messages
    # logging.basicConfig(level=logging.DEBUG, format=' %(asctime)s - %(name)s - %(levelname)s - %(message)s')
    
    class QTextEditLogger(logging.Handler):
        def __init__(self, parent):
            super().__init__()
            self.widget = QtWidgets.QPlainTextEdit(parent)
            self.widget.setReadOnly(True)
    
        def emit(self, record):
            msg = self.format(record)
            self.widget.appendPlainText(msg)
    
    
    class MyDialog(QtWidgets.QDialog, QtWidgets.QPlainTextEdit):
        def __init__(self, parent=None):
            super().__init__(parent)
    
            logTextBox = QTextEditLogger(self)
            # You can format what is printed to text box
            logTextBox.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
            logging.getLogger().addHandler(logTextBox)
            # You can control the logging level
            logging.getLogger().setLevel(logging.DEBUG)
    
            self._button = QtWidgets.QPushButton(self)
            self._button.setText('Test Me')
    
            layout = QtWidgets.QVBoxLayout()
            # Add the new logging box widget to the layout
            layout.addWidget(logTextBox.widget)
            layout.addWidget(self._button)
            self.setLayout(layout)
    
            # Connect signal to slot
            self._button.clicked.connect(self.test)
    
        def test(self):
            logging.debug('damn, a bug')
            logging.info('something to remember')
            logging.warning('that\'s not right')
            logging.error('foobar')
    
    app = QtWidgets.QApplication(sys.argv)
    dlg = MyDialog()
    dlg.show()
    dlg.raise_()
    sys.exit(app.exec_())
    
  4. ==============================

    4.읽기 전용으로 설정된 QPlainTextEdit 위젯을 사용하려는 것처럼 보입니다.

    읽기 전용으로 설정된 QPlainTextEdit 위젯을 사용하려는 것처럼 보입니다.

    배경색을 회색으로 변경하여 편집 할 수 없다는 힌트를 사용자에게 제공하십시오. 스크롤 가능하거나 텍스트를 선택할 수있게하려는 경우에는 사용자의 몫입니다.

    이 대답을 통해 QPlainTextEdit의 서브 클래 싱을 시작하여 출력으로 스크롤하고, 파일에 저장할 수 있습니다.

  5. from https://stackoverflow.com/questions/28655198/best-way-to-display-logs-in-pyqt by cc-by-sa and MIT license