Anmelden in Pyside6 GUI mit Rich.Logging RichHandler und Qtextedit HTML -Text verursachen Abstands- und AusrichtungsprobPython

Python-Programme
Anonymous
 Anmelden in Pyside6 GUI mit Rich.Logging RichHandler und Qtextedit HTML -Text verursachen Abstands- und Ausrichtungsprob

Post by Anonymous »

Ich möchte das Anwendungsprotokoll in der GUI in irgendeiner Weise anzeigen. Es wird zur Anmeldung als Handler bei init. < /P>
hinzugefügt, wenn ich den Text als Klartext in das Widget einfüge, druckt es fein. Die Linie ist in Ordnung. Dafür mache ich einfach < /p>

Code: Select all

class QTextEditLogger(QTextEdit, logging.Handler):
def __init__(self, parent, level=NOTSET):
QTextEdit.__init__(self, parent)
logging.Handler.__init(self, level=level)

def emit(self, record):
msg = self.format(record)
self.append(msg)
< /code>
Wenn ich versuche, Rich.richHandler -Formatierung zu verwenden, um farbigen Text zu erhalten und dies als HTML in die QTExtedit einfügt, funktioniert die Farbe einwandfrei. Der Text ist jedoch nicht ordnungsgemäß verteilt/Aligned.
 
Wie können Sie. Die Konsole. < /p>
Hier ist das MRE, ich füge ein RichHandler als Mitglied meiner Klasse und ein Konsolenobjekt hinzu, das sich an os.devnull < /code> und aufzeichnet. Dann greife ich den Konsolentext über export_html () 
, was wiederum über INSERTHTML () zum textedit hinzugefügt wird. Ich habe sogar versucht, die Konsolengröße auf die Widget-Breite einzustellen, aber das hat nicht wirklich geholfen.

Code: Select all

import sys
import os
from time import sleep
import logging
from logging import Handler, NOTSET
from rich.logging import RichHandler
from rich.console import Console
from PySide6.QtWidgets import QTextEdit, QApplication, QMainWindow
from PySide6.QtGui import QTextCursor, QTextOption

class QTextEditLogger(QTextEdit, Handler):
"""A QTextEdit logger that uses RichHandler to format log messages."""
def __init__(self, parent=None, level=NOTSET):
QTextEdit.__init__(self, parent)
Handler.__init__(self,level=level)
self.console = Console(file=open(os.devnull, "wt"), record=True,width=42, height=12, soft_wrap=False)
self.rich_handler = RichHandler(show_time=False, show_path=False, show_level=True, markup=True, console=self.console, log_time_format="[%X]", level=self.level)
self.rich_handler.setLevel(self.level)
QTextEdit.setWordWrapMode(self, QTextOption.WrapMode.NoWrap)
self.setAcceptRichText(True)
self.setReadOnly(True)

def showEvent(self, arg__1):
self.console.width = self.width()//self.fontMetrics().averageCharWidth()  # Approximate character width
self.console.height = self.height()//self.fontMetrics().height()  # Approximate character height
return super().showEvent(arg__1)

def emit(self, record) -> None:
"""Override the emit method to handle log records."""

self.rich_handler.emit(record)
html = self.console.export_html(clear=True, inline_styles=True)
self.insertHtml(html)
self.verticalScrollBar().setSliderPosition(self.verticalScrollBar().maximum())
c = self.textCursor()
c.movePosition(QTextCursor.End)
self.setTextCursor(c)

class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("QTextEdit Example")

# Create a QTextEdit widget
self.text_edit = QTextEditLogger(self)
self.setCentralWidget(self.text_edit)

if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
# Set up logging
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logger.addHandler(window.text_edit)
logger.info("This is an info message.")
sleep(.5)
logger.warning("This is a warning message.")
sleep(.5)
for i in range(10):
logger.debug(f"This is a debug message {i}.")
logger.error("This is an error message.")
sys.exit(app.exec_())

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post