231 lines
8.7 KiB
Python
231 lines
8.7 KiB
Python
|
|
from PySide6.QtWidgets import (
|
|||
|
|
QWidget, QLabel, QPushButton, QVBoxLayout, QHBoxLayout,
|
|||
|
|
QFormLayout, QSpinBox, QGroupBox, QFrame
|
|||
|
|
)
|
|||
|
|
from PySide6.QtCore import Qt, Signal, QTimer
|
|||
|
|
from PySide6.QtGui import QFont
|
|||
|
|
from datetime import datetime, timedelta
|
|||
|
|
from utils.electricity_monitor import ElectricityMonitor
|
|||
|
|
from dao.electricity_dao import ElectricityDAO
|
|||
|
|
import logging
|
|||
|
|
|
|||
|
|
class ElectricitySettingsUI(QWidget):
|
|||
|
|
"""电力监控设置UI组件"""
|
|||
|
|
|
|||
|
|
# 定义信号
|
|||
|
|
settings_changed = Signal()
|
|||
|
|
|
|||
|
|
def __init__(self, parent=None):
|
|||
|
|
super().__init__(parent)
|
|||
|
|
self.parent = parent
|
|||
|
|
self.electricity_monitor = ElectricityMonitor.get_instance()
|
|||
|
|
self.electricity_dao = ElectricityDAO()
|
|||
|
|
|
|||
|
|
# 确保电力消耗表已创建
|
|||
|
|
self.electricity_dao.create_table_if_not_exists()
|
|||
|
|
|
|||
|
|
self.init_ui()
|
|||
|
|
|
|||
|
|
# 创建定时器,用于更新UI
|
|||
|
|
self.update_timer = QTimer(self)
|
|||
|
|
self.update_timer.timeout.connect(self.update_status)
|
|||
|
|
self.update_timer.start(1000) # 每秒更新一次
|
|||
|
|
|
|||
|
|
# 初始更新状态
|
|||
|
|
self.update_status()
|
|||
|
|
|
|||
|
|
def init_ui(self):
|
|||
|
|
"""初始化UI"""
|
|||
|
|
# 设置字体
|
|||
|
|
self.title_font = QFont("微软雅黑", 14, QFont.Bold)
|
|||
|
|
self.normal_font = QFont("微软雅黑", 10)
|
|||
|
|
self.small_font = QFont("微软雅黑", 9)
|
|||
|
|
|
|||
|
|
# 创建主布局
|
|||
|
|
main_layout = QVBoxLayout(self)
|
|||
|
|
main_layout.setContentsMargins(20, 20, 20, 20)
|
|||
|
|
main_layout.setSpacing(15)
|
|||
|
|
|
|||
|
|
# 创建标题
|
|||
|
|
title_label = QLabel("电力监控设置")
|
|||
|
|
title_label.setFont(self.title_font)
|
|||
|
|
title_label.setAlignment(Qt.AlignCenter)
|
|||
|
|
title_label.setStyleSheet("color: #1a237e; margin-bottom: 10px;")
|
|||
|
|
main_layout.addWidget(title_label)
|
|||
|
|
|
|||
|
|
# 创建状态组
|
|||
|
|
status_group = QGroupBox("监控状态")
|
|||
|
|
status_group.setFont(self.normal_font)
|
|||
|
|
status_layout = QFormLayout()
|
|||
|
|
|
|||
|
|
# 监控状态
|
|||
|
|
self.status_label = QLabel("未知")
|
|||
|
|
self.status_label.setFont(self.normal_font)
|
|||
|
|
status_layout.addRow("监控状态:", self.status_label)
|
|||
|
|
|
|||
|
|
# 当前电量
|
|||
|
|
self.electricity_label = QLabel("--")
|
|||
|
|
self.electricity_label.setFont(self.normal_font)
|
|||
|
|
status_layout.addRow("当前电量:", self.electricity_label)
|
|||
|
|
|
|||
|
|
# 上次监听时间
|
|||
|
|
self.last_time_label = QLabel("--")
|
|||
|
|
self.last_time_label.setFont(self.normal_font)
|
|||
|
|
status_layout.addRow("上次监听时间:", self.last_time_label)
|
|||
|
|
|
|||
|
|
# 下次监听时间
|
|||
|
|
self.next_time_label = QLabel("--")
|
|||
|
|
self.next_time_label.setFont(self.normal_font)
|
|||
|
|
status_layout.addRow("下次监听时间:", self.next_time_label)
|
|||
|
|
|
|||
|
|
status_group.setLayout(status_layout)
|
|||
|
|
main_layout.addWidget(status_group)
|
|||
|
|
|
|||
|
|
# 创建设置组
|
|||
|
|
settings_group = QGroupBox("监控设置")
|
|||
|
|
settings_group.setFont(self.normal_font)
|
|||
|
|
settings_layout = QFormLayout()
|
|||
|
|
|
|||
|
|
# 监听间隔
|
|||
|
|
self.interval_spinbox = QSpinBox()
|
|||
|
|
self.interval_spinbox.setFont(self.normal_font)
|
|||
|
|
self.interval_spinbox.setRange(1, 60) # 1-60分钟
|
|||
|
|
self.interval_spinbox.setValue(self.electricity_monitor.interval_minutes) # 使用当前设置的值
|
|||
|
|
self.interval_spinbox.setSuffix(" 分钟")
|
|||
|
|
self.interval_spinbox.valueChanged.connect(self.on_interval_changed)
|
|||
|
|
settings_layout.addRow("监听间隔:", self.interval_spinbox)
|
|||
|
|
|
|||
|
|
settings_group.setLayout(settings_layout)
|
|||
|
|
main_layout.addWidget(settings_group)
|
|||
|
|
|
|||
|
|
# 创建按钮组
|
|||
|
|
button_layout = QHBoxLayout()
|
|||
|
|
button_layout.setSpacing(20)
|
|||
|
|
|
|||
|
|
# 开始监听按钮
|
|||
|
|
self.start_button = QPushButton("开始监听")
|
|||
|
|
self.start_button.setFont(self.normal_font)
|
|||
|
|
self.start_button.setMinimumHeight(40)
|
|||
|
|
self.start_button.setStyleSheet("background-color: #4CAF50; color: white;")
|
|||
|
|
self.start_button.clicked.connect(self.start_monitoring)
|
|||
|
|
button_layout.addWidget(self.start_button)
|
|||
|
|
|
|||
|
|
# 暂停监听按钮
|
|||
|
|
self.stop_button = QPushButton("暂停监听")
|
|||
|
|
self.stop_button.setFont(self.normal_font)
|
|||
|
|
self.stop_button.setMinimumHeight(40)
|
|||
|
|
self.stop_button.setStyleSheet("background-color: #F44336; color: white;")
|
|||
|
|
self.stop_button.clicked.connect(self.stop_monitoring)
|
|||
|
|
button_layout.addWidget(self.stop_button)
|
|||
|
|
|
|||
|
|
main_layout.addLayout(button_layout)
|
|||
|
|
|
|||
|
|
# 添加分隔线
|
|||
|
|
separator = QFrame()
|
|||
|
|
separator.setFrameShape(QFrame.HLine)
|
|||
|
|
separator.setFrameShadow(QFrame.Sunken)
|
|||
|
|
main_layout.addWidget(separator)
|
|||
|
|
|
|||
|
|
# 添加历史数据标签
|
|||
|
|
history_label = QLabel("历史数据")
|
|||
|
|
history_label.setFont(self.title_font)
|
|||
|
|
history_label.setAlignment(Qt.AlignCenter)
|
|||
|
|
history_label.setStyleSheet("color: #1a237e; margin: 10px 0;")
|
|||
|
|
main_layout.addWidget(history_label)
|
|||
|
|
|
|||
|
|
# 占位符,用于未来扩展
|
|||
|
|
placeholder = QLabel("历史数据功能将在未来版本中提供")
|
|||
|
|
placeholder.setFont(self.normal_font)
|
|||
|
|
placeholder.setAlignment(Qt.AlignCenter)
|
|||
|
|
placeholder.setStyleSheet("color: #888888; padding: 20px;")
|
|||
|
|
main_layout.addWidget(placeholder)
|
|||
|
|
|
|||
|
|
# 添加弹性空间
|
|||
|
|
main_layout.addStretch(1)
|
|||
|
|
|
|||
|
|
def update_status(self):
|
|||
|
|
"""更新状态显示"""
|
|||
|
|
try:
|
|||
|
|
# 检查监控器状态
|
|||
|
|
is_monitoring = self.electricity_monitor.is_monitoring()
|
|||
|
|
|
|||
|
|
# 更新状态标签
|
|||
|
|
if is_monitoring:
|
|||
|
|
self.status_label.setText("正在监听")
|
|||
|
|
self.status_label.setStyleSheet("color: green; font-weight: bold;")
|
|||
|
|
self.start_button.setEnabled(False)
|
|||
|
|
self.stop_button.setEnabled(True)
|
|||
|
|
else:
|
|||
|
|
self.status_label.setText("已暂停")
|
|||
|
|
self.status_label.setStyleSheet("color: red; font-weight: bold;")
|
|||
|
|
self.start_button.setEnabled(True)
|
|||
|
|
self.stop_button.setEnabled(False)
|
|||
|
|
|
|||
|
|
# 获取最新电力数据
|
|||
|
|
latest_data = self.electricity_dao.get_latest_electricity_data()
|
|||
|
|
if latest_data:
|
|||
|
|
self.electricity_label.setText(str(latest_data['electricity_number']))
|
|||
|
|
self.last_time_label.setText(latest_data['sync_time'])
|
|||
|
|
|
|||
|
|
# 计算下次监听时间
|
|||
|
|
if is_monitoring:
|
|||
|
|
next_time = self.electricity_monitor.get_next_read_time()
|
|||
|
|
if next_time:
|
|||
|
|
self.next_time_label.setText(next_time.strftime('%Y-%m-%d %H:%M:%S'))
|
|||
|
|
else:
|
|||
|
|
self.next_time_label.setText("计算中...")
|
|||
|
|
else:
|
|||
|
|
self.next_time_label.setText("监听已暂停")
|
|||
|
|
else:
|
|||
|
|
self.electricity_label.setText("--")
|
|||
|
|
self.last_time_label.setText("--")
|
|||
|
|
if is_monitoring:
|
|||
|
|
self.next_time_label.setText("等待首次读取...")
|
|||
|
|
else:
|
|||
|
|
self.next_time_label.setText("监听已暂停")
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
logging.error(f"更新电力监控状态时发生错误: {str(e)}")
|
|||
|
|
|
|||
|
|
def on_interval_changed(self, value):
|
|||
|
|
"""监听间隔变更处理
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
value: 新的间隔值(分钟)
|
|||
|
|
"""
|
|||
|
|
try:
|
|||
|
|
# 更新监控器间隔
|
|||
|
|
self.electricity_monitor.set_interval(value)
|
|||
|
|
|
|||
|
|
# 发出设置变更信号
|
|||
|
|
self.settings_changed.emit()
|
|||
|
|
except Exception as e:
|
|||
|
|
logging.error(f"设置电力监控间隔时发生错误: {str(e)}")
|
|||
|
|
|
|||
|
|
def start_monitoring(self):
|
|||
|
|
"""开始监听"""
|
|||
|
|
try:
|
|||
|
|
# 启动电力监控器
|
|||
|
|
self.electricity_monitor.start()
|
|||
|
|
|
|||
|
|
# 更新UI
|
|||
|
|
self.update_status()
|
|||
|
|
|
|||
|
|
# 发出设置变更信号
|
|||
|
|
self.settings_changed.emit()
|
|||
|
|
except Exception as e:
|
|||
|
|
logging.error(f"启动电力监控时发生错误: {str(e)}")
|
|||
|
|
|
|||
|
|
def stop_monitoring(self):
|
|||
|
|
"""暂停监听"""
|
|||
|
|
try:
|
|||
|
|
# 停止电力监控器
|
|||
|
|
self.electricity_monitor.stop()
|
|||
|
|
|
|||
|
|
# 更新UI
|
|||
|
|
self.update_status()
|
|||
|
|
|
|||
|
|
# 发出设置变更信号
|
|||
|
|
self.settings_changed.emit()
|
|||
|
|
except Exception as e:
|
|||
|
|
logging.error(f"停止电力监控时发生错误: {str(e)}")
|