[PYTHON] pyqt에서 로그를 표시하는 가장 좋은 방법은 무엇입니까?
PYTHONpyqt에서 로그를 표시하는 가장 좋은 방법은 무엇입니까?
현재 qt 디자이너를 사용하는 GUI에서 작업 중입니다. 로거 창처럼 작동하는 GUI에서 문자열을 인쇄하는 방법에 대해 궁금합니다. 나는 pyqt5를 사용하고있다.
해결법
-
==============================
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.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.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.읽기 전용으로 설정된 QPlainTextEdit 위젯을 사용하려는 것처럼 보입니다.
읽기 전용으로 설정된 QPlainTextEdit 위젯을 사용하려는 것처럼 보입니다.
배경색을 회색으로 변경하여 편집 할 수 없다는 힌트를 사용자에게 제공하십시오. 스크롤 가능하거나 텍스트를 선택할 수있게하려는 경우에는 사용자의 몫입니다.
이 대답을 통해 QPlainTextEdit의 서브 클래 싱을 시작하여 출력으로 스크롤하고, 파일에 저장할 수 있습니다.
from https://stackoverflow.com/questions/28655198/best-way-to-display-logs-in-pyqt by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] Colaboratory에 로컬 데이터 파일로드 (0) | 2018.11.10 |
---|---|
[PYTHON] 파이썬을 사용하여 PDF에서 텍스트로 표를 추출하는 방법은 무엇입니까? (0) | 2018.11.10 |
[PYTHON] Pyodbc 오류 데이터 원본 이름을 찾을 수없고 기본 드라이버가 역설을 지정하지 않았습니다. (0) | 2018.11.10 |
[PYTHON] 뒤틀린 상태에서 HTTP 프록시를 HTTPS 프록시로 변환 (0) | 2018.11.10 |
[PYTHON] qt 디자이너에서 만든 ui 파일에 비디오를 삽입하는 방법은 무엇입니까? (0) | 2018.11.10 |