ISEE小语
“巷子里的猫很自由,却没有归宿;围墙里的狗有归宿,却终身都要低头,人生这道选择题,怎么选都会有遗憾。”
——网友
通过使用PySide6制作日志监控应用工具。
首先,了解一下这个三方库。
PySide6 是一个用于创建图形用户界面 (GUI) 的 Python 库,它是 Qt for Python 的一部分。Qt 是一个跨平台的应用程序和用户界面框架,它允许开发者在 Windows、macOS、Linux、iOS 和 Android 上使用几乎相同的代码库来创建应用程序。PySide6 绑定了 Qt6,这是 Qt 框架的最新主要版本。
环境:
Pycharm
Python 3.9.16
安装:
pip install PySide6==6.6.2
先看实际效果
基本用法
创建一个应用程序实例
# -*- coding: utf-8 -*-
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QLabel
# 创建一个应用程序实例
app = QApplication(sys.argv)
# 创建一个窗口
window = QMainWindow()
# 设置窗口标题
window.setWindowTitle('Log Monitor')
# 设置窗口大小和样式
window.resize(800, 400)
window.setStyleSheet("background-color: black; color: white;")
# 创建标签并设置文本
label = QLabel('创建一个应用实例', window)
# 设置标签位置
label.move(350, 100)
# 显示窗口
window.show()
# 运行应用程序
sys.exit(app.exec())
(左右滑动查看完整代码)
运行,结果:
了解一下简单的使用,那么接下来就开始做日志监控的工具的实例吧
实现原理
使用PySide6库制作[日志监控]小工具,主要实现步骤:
界面设计:设置窗口标题、大小、样式、布局和文本编辑控件等。
逻辑处理:通过读取日志文件,输出到监控窗口中。
关键点:
创建定时器用于定期更新日志,本次设置的是每秒更新一次。
考虑性能问题,界面窗口显示最新1000行日志。
项目结构
新创建一个log_monitor项目,具体结构如下:
```结构
log_monitor
├─log_monitor.py
├─logs.log
├─main.py
└─requirements.txt
```
(左右滑动查看完整代码)
主要代码
实现逻辑log_monitor.py
# -*- coding: utf-8 -*-
from PySide6.QtCore import QFile, QIODevice, QTimer
from PySide6.QtGui import QTextCursor
from PySide6.QtWidgets import QMainWindow, QTextEdit, QVBoxLayout, QWidget
class LogMonitor(QMainWindow):
def __init__(self, log_file_path, parent=None):
super().__init__(parent)
self.log_file_path = log_file_path
# 设置窗口标题、大小和样式
self.setWindowTitle("Log Monitor")
self.resize(800, 400)
self.setStyleSheet("background-color: black; color: white;")
# 创建一个布局和文本编辑控件来显示日志
layout = QVBoxLayout()
self.log_display = QTextEdit(readOnly=True)
layout.addWidget(self.log_display)
# 创建一个中央控件
central_widget = QWidget()
central_widget.setLayout(layout)
self.setCentralWidget(central_widget)
# 定时器用于定期更新日志
self.timer = QTimer()
self.timer.timeout.connect(self.update_log)
# 每秒更新一次
self.timer.start(1000)
# 初始化文件位置为0
self.last_pos = 0
def update_log(self):
# 创建一个QFile对象
log_file = QFile(self.log_file_path)
# 打开日志文件
if log_file.open(QIODevice.ReadOnly):
# 定位到上次读取的位置
log_file.seek(self.last_pos)
# 读取新内容
new_bytes = log_file.readAll()
new_text = bytes(new_bytes).decode('gbk', errors='replace')
# 更新最后读取的位置
self.last_pos = log_file.pos()
# 手动关闭文件
log_file.close()
# 如果有新内容,则追加到文本编辑器中
if new_text:
self.log_display.moveCursor(QTextCursor.End)
self.log_display.insertPlainText(new_text)
self.log_display.ensureCursorVisible()
# 默认显示最新1000行数据
self.trim_log_lines(1000)
def trim_log_lines(self, trim_lines):
# 获取文本编辑器的当前内容
all_text = self.log_display.toPlainText()
scrollbar = self.log_display.verticalScrollBar()
scrollbar_value = scrollbar.value()
is_at_bottom = scrollbar_value == scrollbar.maximum()
lines = all_text.split('\n')
# 如果行数超过1000,只保留最后的1000行
if len(lines) > trim_lines:
trimmed_text = '\n'.join(lines[-trim_lines:])
self.log_display.setPlainText(trimmed_text)
# 如果之前滚动条在最底部,添加新文本后继续保持在最底部
if is_at_bottom:
scrollbar.setValue(scrollbar.maximum())
else:
scrollbar.setValue(scrollbar_value)
(左右滑动查看完整代码)
这里面有两个地方是可以根据自己实现场景自定义的,如下:
一是显示最新日志的更新时间,目前设定的是1秒,如果需要设置其他间隔时间,可以在这里修改
二是界面窗口显示的日志内容,目前设定的是显示最新的1000行,如果想设置显示内容行数,可以在这里修改
启动程序main.py
# -*- coding: utf-8 -*-
import sys
from PySide6.QtWidgets import QApplication
from log_monitor import LogMonitor
app = QApplication(sys.argv)
# 日志路径
log_file_path = "logs.log"
monitor = LogMonitor(log_file_path=log_file_path)
monitor.show()
sys.exit(app.exec())
(左右滑动查看完整代码)
其中,日志路径根据实际情况定义即可
启动运行
在自己电脑上启动,直接切换到venv下,输入:
python main.py
即可,这时会弹出【日志监控】的窗口,看一下效果:
总结
小栈通过PySide6制作一个简单的日志监控工具,目前只是简单的显示,后续会逐步添加一些小功能。
PySide6 是一个强大的库,用于创建复杂和功能齐全的跨平台 GUI 应用程序。它提供丰富的控件,如按钮、文本框、标签和复杂的布局,可以帮助您构建专业级的应用程序。
有兴趣的同学可以进一步探索。
源码已整理:
有兴趣的朋友点个“赞”和“在看”,谢谢支持~!
后台回复“log_monitor”即可获取!
文章就分享到这儿,喜欢就点个赞吧!