You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
2.4 KiB
74 lines
2.4 KiB
from PyQt5.QtWidgets import (QTextEdit, QPushButton, QHBoxLayout,
|
|
QVBoxLayout, QWidget, QGroupBox, QComboBox, QLabel)
|
|
from PyQt5.QtCore import pyqtSlot
|
|
from utils.logger import logger
|
|
|
|
|
|
class LogPanel(QWidget):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.init_ui()
|
|
# 注册到全局日志器
|
|
logger.add_listener(self.append_text)
|
|
|
|
def init_ui(self):
|
|
# 设置分组框,界面更好看
|
|
group_box = QGroupBox("运行日志")
|
|
layout = QVBoxLayout()
|
|
|
|
# 1. 日志显示区域
|
|
self.log_text = QTextEdit()
|
|
self.log_text.setReadOnly(True) # 只读
|
|
self.log_text.setStyleSheet("QTextEdit { background-color: #f0f0f0; font-family: Consolas; }")
|
|
|
|
# 2. 控制栏
|
|
ctrl_layout = QHBoxLayout()
|
|
|
|
# 日志级别过滤(可选功能)
|
|
self.level_combo = QComboBox()
|
|
self.level_combo.addItems(["所有", "INFO", "DEBUG", "WARNING", "ERROR"])
|
|
self.level_combo.currentTextChanged.connect(self.on_filter_changed)
|
|
|
|
# 清空按钮
|
|
clear_btn = QPushButton("清空")
|
|
clear_btn.clicked.connect(self.log_text.clear)
|
|
|
|
# 将占用空间大的控件放中间,按钮靠右
|
|
ctrl_layout.addWidget(QLabel("过滤:"))
|
|
ctrl_layout.addWidget(self.level_combo)
|
|
ctrl_layout.addStretch()
|
|
ctrl_layout.addWidget(clear_btn)
|
|
|
|
layout.addLayout(ctrl_layout)
|
|
layout.addWidget(self.log_text)
|
|
group_box.setLayout(layout)
|
|
|
|
main_layout = QVBoxLayout()
|
|
main_layout.addWidget(group_box)
|
|
self.setLayout(main_layout)
|
|
|
|
@pyqtSlot(str, str)
|
|
def append_text(self, message, level):
|
|
"""
|
|
接收日志并显示。
|
|
这里可以做颜色区分
|
|
"""
|
|
# 简单的过滤逻辑
|
|
if self.level_combo.currentText() != "所有" and level != self.level_combo.currentText():
|
|
return
|
|
|
|
# 根据级别设置颜色
|
|
color_map = {
|
|
"INFO": "blue",
|
|
"DEBUG": "gray",
|
|
"WARNING": "orange",
|
|
"ERROR": "red"
|
|
}
|
|
color = color_map.get(level, "black")
|
|
|
|
html_text = f'<span style="color:{color};">[{level}] {message}</span>'
|
|
self.log_text.append(html_text)
|
|
|
|
def on_filter_changed(self):
|
|
# 这里可以实现重新加载日志的逻辑,或者仅作标记
|
|
pass
|