Передача logging из дочернего окна в главное PyQT5
У меня есть главное окно, в котором реализована запись логов. Из этого окна можно открыть дочернее и нужно из дочернего передавать логи тоже в первое окно в тот же текстбокс.
import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import QDateTime, QTimer
import logging
from lr1 import lr1Window
from mainUI import Ui_MainWindow
class QTextEditLogger(logging.Handler):
def __init__(self, parent):
super().__init__()
self.widget = parent.ui.plainTextEdit
self.widget.setReadOnly(True)
def emit(self, record):
msg = self.format(record)
self.widget.appendPlainText(msg)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.datetime = QDateTime.currentDateTime()
self.timer = QtCore.QTimer()
self.logTextBox = QTextEditLogger(self)
self.logTextBox.setFormatter(logging.Formatter('%(asctime)s %(name)s (%(filename)s).%(funcName)s(%(lineno)d) %('
'levelname)s:%(message)s'))
logging.getLogger().addHandler(self.logTextBox)
logging.getLogger().setLevel(logging.DEBUG)
self.initUI()
def initUI(self):
self.ui.action_open.triggered.connect(self.openFile)
self.ui.action_DIS_lab1.triggered.connect(self.open_lr1)
self.timer = QTimer()
self.timer.start()
self.timer.timeout.connect(self.timerUI)
def timerUI(self):
self.datetime = QDateTime.currentDateTime()
self.ui.statusbar.showMessage(self.datetime.toString('dd.MM.yyyy, hh:mm:ss'))
def openFile(self):
try:
file_name = QtWidgets.QFileDialog.getOpenFileName(filter='*.txt')[0]
file = open(file_name, 'r', encoding="utf8")
data = file.read()
self.ui.plainTextEdit.append(data)
except OSError as e:
logging.debug(e)
def open_lr1(self):
self.lr1 = lr1Window(self.logTextBox)
self.lr1.show()
def main():
app = QtWidgets.QApplication(sys.argv)
main1 = MainWindow()
main1.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
в lr1.py нужно, как я понимаю, верно наследовать класс QTextEditLogger, никак не могу справиться с этим. Вызвать исключение там может только нажатие на кнопку "Считать!", если оставить поля Фамилии и Имени пустыми.
# lr1.py
from PyQt5 import QtWidgets
from lr1UI import Ui_MainWindow
import sys
class lr1Window(QtWidgets.QMainWindow):
def __init__(self, logTextBox):
super(lr1Window, self).__init__()
self.surname = ''
self.name = ''
self.surname_unicode = []
self.name_unicode = []
self.tail = ''
self.result_unicode = []
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.logTextBox = logTextBox
self.initUI()
def initUI(self):
self.ui.pushButton_calculate.clicked.connect(self.calculation)
def checkInput(self):
if self.surname == '' and self.name == '':
raise ValueError('Surname`s and name`s forms are empty', 0)
def calculation(self):
try:
self.surname = self.ui.surname_inp.text()
self.name = self.ui.name_inp.text()
self.checkInput()
self.surname_unicode = [ord(n) for n in self.surname]
self.name_unicode = [ord(n) for n in self.name]
if len(self.name_unicode) < len(self.surname_unicode):
self.result_unicode = [self.surname_unicode[i] ^ self.name_unicode[i] for i in
range(len(self.name_unicode))]
self.tail = self.surname[len(self.name_unicode):]
elif len(self.name_unicode) > len(self.surname_unicode):
self.result_unicode = [self.surname_unicode[i] ^ self.name_unicode[i] for i in
range(len(self.surname_unicode))]
self.tail = self.name[len(self.surname_unicode):]
else:
self.result_unicode = [self.surname_unicode[i] ^ self.name_unicode[i] for i in
range(len(self.surname_unicode))]
self.setSurname()
self.setName()
self.setTail()
self.setResultUni()
self.setResult(' '.join(map(chr, self.result_unicode)))
except ValueError as e:
self.logging(e)
def setSurname(self):
self.ui.unisurname_output.setText(' '.join(map(str, self.surname_unicode)))
self.ui.splitter.adjustSize()
def setName(self):
self.ui.uniname_output.setText(' '.join(map(str, self.name_unicode)))
self.ui.splitter_2.adjustSize()
def setTail(self):
self.ui.tail_output.setText(self.tail)
self.ui.splitter_3.adjustSize()
def setResultUni(self):
self.ui.uniresult_output.setText(' '.join(map(str, self.result_unicode)))
self.ui.splitter_4.adjustSize()
def setResult(self, text, iswarning=False):
self.ui.result_output.setText(text)
if iswarning == True:
self.ui.result_output.setStyleSheet('color: red;')
self.ui.splitter_5.adjustSize()
def main():
app = QtWidgets.QApplication(sys.argv)
main1 = lr1Window()
main1.show()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
То что есть сейчас, при запуске через дебагер, говорит, что во время обработки моего исключения происходит другое исключение:
'lr1Window' object has no attribute 'logging'
Чтобы все это запустилось нужные еще файлы с UI, все лежит здесь
Ответы (1 шт):
я не проверял логику вашего кода, а исправил только пару ошибок, которые получил при запуске вашего примера. Проверьте:
q1197933.py
import sys
import logging
from PyQt5 import QtCore, QtWidgets, QtGui
from PyQt5.Qt import *
from lr1UI import Ui_MainWindow
###
from mainUI import Ui_MainWindow as Main_Ui_MainWindow # + as Main_Ui_MainWindow
#from lr1 import lr1Window
class lr1Window(QtWidgets.QMainWindow):
def __init__(self, logTextBox):
super(lr1Window, self).__init__()
self.surname = ''
self.name = ''
self.surname_unicode = []
self.name_unicode = []
self.tail = ''
self.result_unicode = []
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.logTextBox = logTextBox
self.initUI()
def initUI(self):
self.ui.pushButton_calculate.clicked.connect(self.calculation)
def checkInput(self):
if self.surname == '' and self.name == '':
raise ValueError('Surname`s and name`s forms are empty', 0)
def calculation(self):
try:
self.surname = self.ui.surname_inp.text()
self.name = self.ui.name_inp.text()
self.checkInput()
self.surname_unicode = [ord(n) for n in self.surname]
self.name_unicode = [ord(n) for n in self.name]
if len(self.name_unicode) < len(self.surname_unicode):
self.result_unicode = [self.surname_unicode[i] ^ self.name_unicode[i] for i in
range(len(self.name_unicode))]
self.tail = self.surname[len(self.name_unicode):]
elif len(self.name_unicode) > len(self.surname_unicode):
self.result_unicode = [self.surname_unicode[i] ^ self.name_unicode[i] for i in
range(len(self.surname_unicode))]
self.tail = self.name[len(self.surname_unicode):]
else:
self.result_unicode = [self.surname_unicode[i] ^ self.name_unicode[i] for i in
range(len(self.surname_unicode))]
self.setSurname()
self.setName()
self.setTail()
self.setResultUni()
self.setResult(' '.join(map(chr, self.result_unicode)))
except ValueError as e:
###
# self.logging(e) # ---
logging.debug(e) # +++
def setSurname(self):
self.ui.unisurname_output.setText(' '.join(map(str, self.surname_unicode)))
self.ui.splitter.adjustSize()
def setName(self):
self.ui.uniname_output.setText(' '.join(map(str, self.name_unicode)))
self.ui.splitter_2.adjustSize()
def setTail(self):
self.ui.tail_output.setText(self.tail)
self.ui.splitter_3.adjustSize()
def setResultUni(self):
self.ui.uniresult_output.setText(' '.join(map(str, self.result_unicode)))
self.ui.splitter_4.adjustSize()
def setResult(self, text, iswarning=False):
self.ui.result_output.setText(text)
if iswarning == True:
self.ui.result_output.setStyleSheet('color: red;')
self.ui.splitter_5.adjustSize()
class QTextEditLogger(logging.Handler):
def __init__(self, parent):
super().__init__()
self.widget = parent.ui.plainTextEdit
self.widget.setReadOnly(True)
def emit(self, record):
msg = self.format(record)
self.widget.appendPlainText(msg)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
###
self.ui = Main_Ui_MainWindow() # - Ui_MainWindow(), Main_Ui_MainWindow()
self.ui.setupUi(self)
self.datetime = QDateTime.currentDateTime()
self.timer = QtCore.QTimer()
self.logTextBox = QTextEditLogger(self)
self.logTextBox.setFormatter(logging.Formatter('%(asctime)s %(name)s (%(filename)s).%(funcName)s(%(lineno)d) %('
'levelname)s:%(message)s'))
logging.getLogger().addHandler(self.logTextBox)
logging.getLogger().setLevel(logging.DEBUG)
self.initUI()
def initUI(self):
self.ui.action_open.triggered.connect(self.openFile)
self.ui.action_DIS_lab1.triggered.connect(self.open_lr1)
self.timer = QTimer()
self.timer.start()
self.timer.timeout.connect(self.timerUI)
def timerUI(self):
self.datetime = QDateTime.currentDateTime()
self.ui.statusbar.showMessage(self.datetime.toString('dd.MM.yyyy, hh:mm:ss'))
def openFile(self):
try:
file_name = QtWidgets.QFileDialog.getOpenFileName(filter='*.txt')[0]
file = open(file_name, 'r', encoding="utf8")
data = file.read()
###
self.ui.plainTextEdit.appendPlainText(data) # - append, + appendPlainText
except OSError as e:
logging.debug(e)
def open_lr1(self):
self.lr1 = lr1Window(self.logTextBox)
self.lr1.show()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
main1 = MainWindow()
main1.show()
sys.exit(app.exec_())
