import sys import os import json import time from datetime import datetime from PyQt6.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QStackedWidget) from PyQt6.QtCore import Qt, QSize, QTimer from PyQt6.QtGui import QIcon, QFont from pages.status_page import StatusPage from pages.control_page import ControlPage from pages.setting_page import SettingPage from utils.aio_print_api import AIOPrrintSystemAPI from utils.auto_fan_status import AutoFanStatus from utils.config_parse import ConfigParse from utils.wifi_manager import WifiManager class MainWindow(QWidget): def __init__(self): super().__init__() # 初始化 API 客户端 self.config_parser = ConfigParse() self.config_parser.config_changed.connect(self._on_config_changed) self.api_client = AIOPrrintSystemAPI( api_url=self.config_parser.api_url, api_key=self.config_parser.api_key ) self.auto_fan_status = AutoFanStatus() self.wifi_manager = WifiManager() self._last_network_check = 0.0 self._is_network_connected = False self.init_ui() # 定时刷新风扇状态显示 self._fan_timer = QTimer(self) self._fan_timer.timeout.connect(self._update_top_bar) self._fan_timer.start(1000) def _check_network(self): """检查网络连接状态(每30秒检测一次,避免频繁调用)""" now = time.time() if now - self._last_network_check < 30: return self._is_network_connected self._last_network_check = now try: status = self.wifi_manager.get_current_status() self._is_network_connected = status.get("wpa_state") == "COMPLETED" except Exception: self._is_network_connected = False return self._is_network_connected def _on_config_changed(self, config_instance): """配置变化时更新 API 客户端等相关设置""" self.api_client = AIOPrrintSystemAPI( api_url=self.config_parser.api_url, api_key=self.config_parser.api_key ) def _update_top_bar(self): """更新风扇状态横条显示""" s = self.auto_fan_status temp = f"{s.cpu_temp:.1f}°C" if s.is_auto_fan_service_running else "--.-°C" speed_pct = min(s.fan_speed / 255 * 100, 100) speed = f"{speed_pct:.1f}%" if s.is_auto_fan_service_running else "--.-%" state = s.fan_state if s.is_auto_fan_service_running else "Auto Fan service is not running" rpm = f"{s.fan_rpm:.1f} r/min" if s.is_auto_fan_service_running else "--.-- r/min" # 根据运行状态改变颜色 if s.is_auto_fan_service_running: if s.fan_state == "Stalled": color = "#e86c60" # 风扇异常-红色 else: color = "#a0d8a0" # 正常-浅绿色 else: color = "#e8a060" # 异常-橙色 self._top_bar.setStyleSheet( f"background-color: #2a2a2a; color: {color}; " f"font-size: 18px; font-weight: 600; padding: 4px 16px;" ) self._fan_label.setText( f"🌡 {temp} {state} 𖣘 {speed} {rpm}" ) # 更新时钟(有网络时显示) if self._check_network(): now = datetime.now() self._clock_label.setText(now.strftime("%H:%M:%S")) self._clock_label.show() else: self._clock_label.hide() def init_ui(self): # 整体布局 main_layout = QVBoxLayout(self) main_layout.setContentsMargins(0, 0, 0, 0) main_layout.setSpacing(0) # 顶部主显示区 (使用 QStackedWidget 切换不同页面) self.stacked_widget = QStackedWidget() self.stacked_widget.setStyleSheet("background-color: #555555;") # 深灰色主显示区 # 添加测试页面 self.page_status = StatusPage(self.api_client) self.page_control = ControlPage(self.api_client) self.page_settings = SettingPage(self.api_client) self.stacked_widget.addWidget(self.page_status) self.stacked_widget.addWidget(self.page_control) self.stacked_widget.addWidget(self.page_settings) # 风扇状态横条 self._top_bar = QWidget() self._top_bar.setFixedHeight(36) self._top_bar.setStyleSheet( "background-color: #2a2a2a; color: #a0d8a0; " "font-size: 18px; font-weight: 600; padding: 4px 16px;" ) top_layout = QHBoxLayout(self._top_bar) top_layout.setContentsMargins(16, 0, 16, 0) self._fan_label = QLabel("🌡 --°C -- 𖣘 --% -- r/min") self._fan_label.setAlignment(Qt.AlignmentFlag.AlignLeft | Qt.AlignmentFlag.AlignVCenter) top_layout.addWidget(self._fan_label) top_layout.addStretch() # 时钟标签(有网络时显示) self._clock_label = QLabel("--:--:--") self._clock_label.setAlignment(Qt.AlignmentFlag.AlignRight | Qt.AlignmentFlag.AlignVCenter) self._clock_label.setStyleSheet("color: #a0d8a0; font-size: 18px; font-weight: 600;") self._clock_label.hide() top_layout.addWidget(self._clock_label) # 底部按钮区 bottom_layout = QHBoxLayout() bottom_layout.setContentsMargins(10, 10, 10, 10) bottom_layout.setSpacing(20) # 定义底部区域背景 bottom_widget = QWidget() bottom_widget.setStyleSheet("background-color: #333333;") bottom_widget.setLayout(bottom_layout) bottom_widget.setFixedHeight(120) # 为触摸优化的按钮高度 # 创建触摸友好的按钮 self.btn_status = self.create_nav_button("状态", self.switchToStatus) self.btn_control = self.create_nav_button("控制", self.switchToControl) self.btn_settings = self.create_nav_button("设置", self.switchToSettings) bottom_layout.addWidget(self.btn_status) bottom_layout.addWidget(self.btn_control) bottom_layout.addWidget(self.btn_settings) # 将主显示区、风扇横条、底部按钮加入整体布局 main_layout.addWidget(self._top_bar) main_layout.addWidget(self.stacked_widget) main_layout.addWidget(bottom_widget) self.setLayout(main_layout) self.setStyleSheet("background-color: #666666;") # 整体灰色背景 def create_nav_button(self, text, callback): # 如果有图标,可以使用 btn.setIcon(QIcon("path/to/icon.png")) btn = QPushButton(text) # 为触摸屏优化:大字体,增加内边距 btn.setStyleSheet(""" QPushButton { background-color: #444444; color: white; border: 2px solid #555555; border-radius: 10px; font-size: 32px; padding: 10px; } QPushButton:pressed { background-color: #222222; border: 2px solid #4CAF50; } """) btn.setSizePolicy(btn.sizePolicy().Policy.Expanding, btn.sizePolicy().Policy.Expanding) btn.clicked.connect(callback) return btn def switchToStatus(self): self.stacked_widget.setCurrentIndex(0) def switchToControl(self): self.stacked_widget.setCurrentIndex(1) def switchToSettings(self): self.stacked_widget.setCurrentIndex(2) def main(): app = QApplication(sys.argv) # 隐藏鼠标光标,针对触摸屏优化 app.setOverrideCursor(Qt.CursorShape.BlankCursor) window = MainWindow() # 全屏无边框显示 window.showFullScreen() sys.exit(app.exec()) if __name__ == "__main__": main()