以下是一个使用Python、PyQt5、logging和threading模块实现的简单示例,展示了如何实时显示日志信息的窗口:
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QPlainTextEdit
import logging
import threading
# 创建一个QWidget窗口,并添加一个QPlainTextEdit用于显示日志
class LogWindow(QWidget):
def __init__(self):, parent=None):
super().__init__(parent)
self.log_text = QPlainTextEdit(self)
self.log_text.setReadOnly(True)
layout = QVBoxLayout()
layout.addWidget(self.log_text)
self.setLayout(layout)
def write(self, message):
self.log_text.appendPlainText(message)
# 定义一个全局日志处理器,将日志输出到LogWindow
def setup_logging(log_window):
root_logger = logging.getLogger()
root_logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler(log_window)
handler.setFormatter(logging.Formatter('%(message)s'))
root_logger.addHandler(handler)
# 创建一个线程安全的日志记录函数
def thread_safe_log(level, message):
logger = logging.getLogger()
if asyncio.iscoroutinefunction(level) or asyncio.iscoroutinefunction(message):
asyncio.run(asyncio.wait_for(logger.log(level, message), 10))
else:
logger.log(level, message)
# 在PyQt5应用中设置和使用日志
def main():
app = QApplication(sys.argv)
log_window = LogWindow()
log_window.show()
setup_logging(log_window)
# 测试日志输出
threading.Thread(target=lambda: thread_safe_log(logging.INFO, "这是一条实时日志信息")).start()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
这段代码首先创建了一个基本的PyQt5应用窗口,并添加了一个QPlainTextEdit
用于显示日志信息。然后定义了一个setup_logging
函数,该函数配置了全局的日志处理器,将日志信息输出到这个窗口。thread_safe_log
函数确保了在多线程环境中安全地记录日志。最后,在主函数main
中,我们启动了一个线程来模拟日志的实时生成,并通过日志处理器将其显示在窗口中。