Skip to content

Commit e677298

Browse files
committed
feat: 日志加点颜色
1 parent 234af8b commit e677298

2 files changed

Lines changed: 37 additions & 16 deletions

File tree

aao/ui/farm_page.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
2121
QLineEdit,
2222
QListWidget,
2323
QMessageBox,
24-
QPlainTextEdit,
2524
QPushButton,
2625
QRadioButton,
2726
QSplitter,
27+
QTextEdit,
2828
QVBoxLayout,
2929
QWidget,
3030
)
@@ -124,9 +124,9 @@ def _build_ui(self) -> None:
124124

125125
log_box = QGroupBox("日志")
126126
ll = QVBoxLayout(log_box)
127-
self.txt_log = QPlainTextEdit()
127+
self.txt_log = QTextEdit()
128128
self.txt_log.setReadOnly(True)
129-
self.txt_log.setMaximumBlockCount(2000)
129+
self.txt_log.document().setMaximumBlockCount(2000)
130130
ll.addWidget(self.txt_log)
131131
splitter.addWidget(log_box)
132132

@@ -169,8 +169,8 @@ def set_runtime(self, controller: Any, tasker: Any) -> None:
169169
self._tasker = tasker
170170

171171
def set_log_handler(self, handler: QtLogHandler) -> None:
172-
"""接 QtLogHandler 信号到日志面板。"""
173-
handler.log.connect(self.txt_log.appendPlainText)
172+
"""接 QtLogHandler 信号到日志面板(HTML,按日志等级着色)。"""
173+
handler.log_html.connect(self.txt_log.append)
174174

175175
# --- 控制 ---
176176

aao/ui/log_handler.py

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,36 +4,57 @@
44
from aao.utils.logger import add_qt_sink
55
handler = QtLogHandler()
66
add_qt_sink(handler.emit) # loguru sink → handler.emit → Signal → UI
7-
handler.log.connect(text_edit.appendPlainText)
7+
handler.log_html.connect(text_edit.appendHtml)
88
99
loguru sink 在产生日志的线程触发;经 Signal(默认 QueuedConnection)跨线程
10-
投递到 UI 线程槽。显示格式由 logger 配置(仅 {message},去来源)。
10+
投递到 UI 线程槽。显示格式由 logger 配置(仅 {message},去来源),此处按 level
11+
追加 HTML 颜色。
1112
"""
1213

1314
from __future__ import annotations
1415

16+
import html
17+
from typing import Any
18+
1519
from PySide6.QtCore import QObject, Signal, SignalInstance
1620

21+
_LEVEL_COLORS = {
22+
"TRACE": "#6b7280",
23+
"DEBUG": "#6b7280",
24+
"INFO": "#d1d5db",
25+
"SUCCESS": "#4caf50",
26+
"WARNING": "#ff9800",
27+
"ERROR": "#f44336",
28+
"CRITICAL": "#ffffff;background-color:#b91c1c",
29+
}
30+
1731

1832
class _Emitter(QObject):
1933
"""承载 Signal(loguru sink 是普通 callable,需 QObject 转 Signal 跨线程)。"""
2034

21-
log = Signal(str)
35+
log_html = Signal(str)
2236

2337

2438
class QtLogHandler:
25-
"""loguru sink → Signal(str)。
39+
"""loguru sink → Signal(str HTML)。
2640
27-
emit 作为 loguru sink 的 callback,接收格式化后的消息字符串,转 Signal。
41+
emit 作为 loguru sink 的 callback,接收 loguru Message,按 level 着色后转 Signal。
2842
"""
2943

3044
def __init__(self) -> None:
3145
self.emitter = _Emitter()
3246

3347
@property
34-
def log(self) -> SignalInstance:
35-
return self.emitter.log
36-
37-
def emit(self, message: str) -> None: # noqa: A003
38-
"""loguru sink callback:message 是已格式化的日志文本。"""
39-
self.emitter.log.emit(message)
48+
def log_html(self) -> SignalInstance:
49+
return self.emitter.log_html
50+
51+
def emit(self, message: Any) -> None: # noqa: A003
52+
"""loguru sink callback:message 是 loguru Message(含 record)。"""
53+
text = str(message).rstrip("\n")
54+
level = "INFO"
55+
record = getattr(message, "record", None)
56+
if record:
57+
level = record["level"].name
58+
color = _LEVEL_COLORS.get(level, "#d1d5db")
59+
safe = html.escape(text)
60+
self.emitter.log_html.emit(f'<span style="color:{color};">{safe}</span>')

0 commit comments

Comments
 (0)