E
For starters, QTextEditLogger, can we do something else?Although that's a different question, but I'll answer, "Yes, I can."import logging
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(900, 400)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(110, 240, 75, 23))
self.pushButton.setObjectName("pushButton")
self.plainTextEdit = QtWidgets.QPlainTextEdit(self.centralwidget)
self.plainTextEdit.setGeometry(QtCore.QRect(10, 10, 291, 131))
self.plainTextEdit.setObjectName("plainTextEdit")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(130, 180, 47, 13))
self.label.setObjectName("label")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.pushButton.setText(_translate("MainWindow", "PushButton"))
self.label.setText(_translate("MainWindow", "TextLabel"))
class QTextEditLogger123(logging.Handler):
def init(self, parent):
super().init()
self.widget = parent.plainTextEdit
self.widget.setReadOnly(True)
def emit(self, record):
msg = self.format(record)
self.widget.appendPlainText(msg)
+++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
class QTextEditLogger(logging.Handler):
def init(self, parent):
super().init()
self.PVELogs = QtWidgets.QPlainTextEdit(self.centralwidget)
self.PVELogs = QtWidgets.QPlainTextEdit(parent.centralwidget) # +++
self.PVELogs.setGeometry(QtCore.QRect(40, 50, 541, 491))
font = QtGui.QFont()
font.setFamily("Consolas")
font.setPointSize(10)
self.PVELogs.setFont(font)
self.PVELogs.setStyleSheet("background-color: rgb(30, 30, 30); color: rgb(255, 255, 255);")
self.PVELogs.setReadOnly(True)
self.PVELogs.setPlainText("")
self.PVELogs.setObjectName("PVELogs")
parent.layout.addWidget(self.PVELogs, 1, 0) # +++
self.PVPLogs = QtWidgets.QPlainTextEdit(parent.centralwidget)
self.PVPLogs.setGeometry(QtCore.QRect(610, 50, 541, 491))
font = QtGui.QFont()
font.setFamily("Consolas")
font.setPointSize(10)
self.PVPLogs.setFont(font)
self.PVPLogs.setStyleSheet("background-color: rgb(30, 30, 30); color: rgb(255, 255, 255);")
self.PVPLogs.setReadOnly(True)
self.PVPLogs.setPlainText("")
self.PVPLogs.setObjectName("PVPLogs")
parent.layout.addWidget(self.PVPLogs, 1, 1) # +++
def emit(self, record):
msg0 = self.format(record)
self.PVELogs.appendPlainText(msg0)
msg1 = self.format(record)
self.PVPLogs.appendPlainText(msg1)
+++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
class ExampleApp(QtWidgets.QMainWindow, Ui_MainWindow):
def init(self):
super().init()
self.setupUi(self)
self.layout = QtWidgets.QGridLayout(self.centralwidget) # +++
self.layout.addWidget(self.plainTextEdit, 0, 0, 1, 2)
self.layout.addWidget(self.label, 2, 0) # +++
self.layout.addWidget(self.pushButton, 2, 1) # +++
logTextBox = QTextEditLogger(self)
logTextBox.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
logging.getLogger().addHandler(logTextBox)
logging.getLogger().setLevel(logging.DEBUG)
# Делает QPlainTextEdit только для вывода
self.plainTextEdit.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse)
self.thread = WorkThread()
self.thread.threadSignal.connect(self.func2)
self.pushButton.clicked.connect(self.func1)
logging.debug("Это сообщение об отладке")
logging.info(u'This is an info message')
def func1(self):
# Создаем поток
self.thread.start()
def func2(self, value):
logging.info("Передано из потока -> {}".format(value))
class WorkThread(QtCore.QThread):
''' Потоковая задача '''
threadSignal = QtCore.pyqtSignal(int)
def __init__(self):
super().__init__()
def run(self):
for i in range(10):
self.msleep(200)
print(i)
self.threadSignal.emit(i)
if name=='main':
app = QtWidgets.QApplication(sys.argv)
window = ExampleApp()
window.show()
sys.exit(app.exec_())