PYQT实战:智能家居中控

目录

核心功能模块

关键技术特性

运行效果

​编辑


使用PyQt5编写的GUI应用程序。代码中有一个名为SmartHomeApp的类,继承自QMainWindow,说明这是一个主窗口应用程序。里面包含了多个选项卡,如控制中心、系统设计、场景设计和维护预测等。

SmartHomeApp的__init__方法中初始化了主选项卡,并添加了四个不同的选项卡:控制中心、系统设计、场景设计和维护预测。每个选项卡对应不同的功能模块。

控制中心选项卡显示设备概览和能耗监控,使用QGroupBox和QLabel等控件展示设备状态和能耗数据。系统设计选项卡涉及分层架构、通信协议选择和安全设置,用户可以通过复选框进行配置。场景设计选项卡允许用户预设和管理不同的智能场景,如回家模式、影院模式等,并可以设置设备控制参数和触发条件。维护预测选项卡提供设备状态监控、预测性维护分析和系统更新功能。

核心功能模块

  1. 控制中心仪表盘 - 显示设备状态和能耗监控

  2. 系统架构设计 - 配置分层架构和通信协议

  3. 用户场景管理 - 预设和管理智能场景模式

  4. 维护预测系统 - 设备状态监控和预测性维护

关键技术特性

  • 使用QTabWidget实现多选项卡界面

  • 通过QGroupBox组织功能区块

  • 集成滑块(QSlider)、列表框(QListWidget)等交互控件

  • 实现设备状态可视化(在线/离线状态颜色标记)

  • 包含能耗数据统计展示(采用框架布局)

  • 支持场景模式的自定义设置与保存

python 复制代码
import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTabWidget, QWidget, 
                            QVBoxLayout, QHBoxLayout, QPushButton, QLabel, 
                            QLineEdit, QComboBox, QCheckBox, QGroupBox,
                            QTextEdit, QListWidget, QSlider, QFrame, QStackedWidget)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont, QPixmap

class SmartHomeApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("智能家居设计系统")
        self.setGeometry(100, 100, 1200, 800)
        
        # 创建主选项卡
        self.main_tabs = QTabWidget()
        self.setCentralWidget(self.main_tabs)
        
        # 添加系统模块
        self.add_dashboard_tab()
        self.add_system_design_tab()
        self.add_user_scenes_tab()
        self.add_maintenance_tab()
        
        # 状态栏
        self.statusBar().showMessage("就绪 | 智能家居设计系统 v1.0")
        
    def add_dashboard_tab(self):
        """创建仪表盘选项卡"""
        dashboard_tab = QWidget()
        layout = QVBoxLayout()
        
        # 顶部欢迎区
        welcome_box = QGroupBox("智能家居控制中心")
        welcome_layout = QHBoxLayout()
        
        welcome_label = QLabel("智能家居设计系统")
        welcome_label.setFont(QFont("Arial", 18, QFont.Bold))
        welcome_layout.addWidget(welcome_label)
        
        status_indicator = QLabel("🟢 系统运行正常")
        status_indicator.setFont(QFont("Arial", 10))
        welcome_layout.addStretch()
        welcome_layout.addWidget(status_indicator)
        
        welcome_box.setLayout(welcome_layout)
        
        # 设备概览
        devices_group = QGroupBox("设备概览")
        devices_layout = QHBoxLayout()
        
        device_counters = [
            ("智能照明", "12", "lights"),
            ("安防设备", "8", "security"),
            ("环境控制", "6", "environment"),
            ("娱乐系统", "4", "entertainment")
        ]
        
        for name, count, icon in device_counters:
            frame = QFrame()
            frame.setFrameShape(QFrame.StyledPanel)
            frame_layout = QVBoxLayout()
            
            icon_label = QLabel()
            # 实际应用中替换为相应图标
            icon_label.setText(f"🔦 {name}")
            icon_label.setFont(QFont("Arial", 12))
            
            count_label = QLabel(f"{count} 设备在线")
            count_label.setFont(QFont("Arial", 10))
            
            frame_layout.addWidget(icon_label)
            frame_layout.addWidget(count_label)
            frame.setLayout(frame_layout)
            devices_layout.addWidget(frame)
        
        devices_group.setLayout(devices_layout)
        
        # 添加控件
        layout.addWidget(welcome_box)
        layout.addWidget(devices_group)
        
        # 能耗监控
        energy_group = QGroupBox("能耗监控")
        energy_layout = QHBoxLayout()
        
        energy_stats = [
            ("当前功耗", "1.2 kW"),
            ("今日用电", "8.5 kWh"),
            ("月度预算", "253/300 kWh"),
            ("环保等级", "A+")
        ]
        
        for stat, value in energy_stats:
            frame = QFrame()
            frame.setFrameShape(QFrame.StyledPanel)
            frame_layout = QVBoxLayout()
            
            stat_label = QLabel(stat)
            stat_label.setFont(QFont("Arial", 10))
            
            value_label = QLabel(value)
            value_label.setFont(QFont("Arial", 14, QFont.Bold))
            
            frame_layout.addWidget(stat_label)
            frame_layout.addWidget(value_label)
            frame.setLayout(frame_layout)
            energy_layout.addWidget(frame)
        
        energy_group.setLayout(energy_layout)
        layout.addWidget(energy_group)
        
        dashboard_tab.setLayout(layout)
        self.main_tabs.addTab(dashboard_tab, "控制中心")
    
    def add_system_design_tab(self):
        """创建系统设计选项卡"""
        design_tab = QWidget()
        layout = QVBoxLayout()
        
        # 架构设计部分
        architecture_group = QGroupBox("系统架构设计")
        architecture_layout = QHBoxLayout()
        
        # 架构层级选择
        layers_group = QGroupBox("分层架构")
        layers_layout = QVBoxLayout()
        
        layers_list = ["感知层 (传感器)", "网络层 (通信)", "应用层 (控制)"]
        layer_checkboxes = []
        
        for layer in layers_list:
            cb = QCheckBox(layer)
            cb.setChecked(True)
            layers_layout.addWidget(cb)
            layer_checkboxes.append(cb)
        
        layers_group.setLayout(layers_layout)
        
        # 通信协议选择
        protocol_group = QGroupBox("通信协议")
        protocol_layout = QVBoxLayout()
        
        protocols = ["Zigbee 3.0", "Wi-Fi 6", "蓝牙5.0", "KNX"]
        protocol_combos = []
        
        for proto in protocols:
            cb = QCheckBox(proto)
            if proto == "Zigbee 3.0":
                cb.setChecked(True)
            protocol_layout.addWidget(cb)
            protocol_combos.append(cb)
        
        protocol_group.setLayout(protocol_layout)
        
        # 安全设置
        security_group = QGroupBox("安全设置")
        security_layout = QVBoxLayout()
        
        security_items = [
            "AES-128 数据加密",
            "双因素身份验证",
            "固件自动更新",
            "网络防火墙"
        ]
        
        security_checkboxes = []
        
        for item in security_items:
            cb = QCheckBox(item)
            cb.setChecked(True)
            security_layout.addWidget(cb)
            security_checkboxes.append(cb)
        
        security_group.setLayout(security_layout)
        
        # 添加架构组件
        architecture_layout.addWidget(layers_group)
        architecture_layout.addWidget(protocol_group)
        architecture_layout.addWidget(security_group)
        
        architecture_group.setLayout(architecture_layout)
        layout.addWidget(architecture_group)
        
        # 能源优化
        energy_group = QGroupBox("能源效率优化")
        energy_layout = QVBoxLayout()
        
        # 节能策略
        strategy_group = QGroupBox("节能策略")
        strategy_layout = QHBoxLayout()
        
        strategies = [
            ("峰值管理", "非高峰时段运行设备"),
            ("智能照明", "根据自然光自动调节"),
            ("温度优化", "AI学习用户习惯"),
            ("待机切断", "自动关闭待机设备")
        ]
        
        for name, desc in strategies:
            frame = QFrame()
            frame_layout = QVBoxLayout()
            
            cb = QCheckBox(name)
            cb.setChecked(True)
            
            desc_label = QLabel(desc)
            desc_label.setFont(QFont("Arial", 8))
            
            frame_layout.addWidget(cb)
            frame_layout.addWidget(desc_label)
            frame.setLayout(frame_layout)
            strategy_layout.addWidget(frame)
        
        strategy_group.setLayout(strategy_layout)
        energy_layout.addWidget(strategy_group)
        
        # 能耗监控设置
        monitor_group = QGroupBox("能耗监控设置")
        monitor_layout = QHBoxLayout()
        
        devices = ["全部设备", "照明系统", "空调系统", "娱乐系统"]
        monitor_combo = QComboBox()
        monitor_combo.addItems(devices)
        
        frequency_combo = QComboBox()
        frequency_combo.addItems(["实时监控", "每小时", "每天", "每周"])
        
        monitor_layout.addWidget(QLabel("监控设备:"))
        monitor_layout.addWidget(monitor_combo)
        monitor_layout.addStretch()
        monitor_layout.addWidget(QLabel("监控频率:"))
        monitor_layout.addWidget(frequency_combo)
        
        monitor_group.setLayout(monitor_layout)
        energy_layout.addWidget(monitor_group)
        
        energy_group.setLayout(energy_layout)
        layout.addWidget(energy_group)
        
        design_tab.setLayout(layout)
        self.main_tabs.addTab(design_tab, "系统设计")
    
    def add_user_scenes_tab(self):
        """创建用户场景选项卡"""
        scene_tab = QWidget()
        layout = QHBoxLayout()
        
        # 场景列表
        scene_list_group = QGroupBox("预设场景")
        scene_list_layout = QVBoxLayout()
        
        scenes = [
            "回家模式", 
            "离家模式", 
            "影院模式", 
            "睡眠模式", 
            "阅读模式", 
            "会客模式",
            "节能模式",
            "晨起模式"
        ]
        
        self.scene_list = QListWidget()
        self.scene_list.addItems(scenes)
        
        add_button = QPushButton("添加新场景")
        remove_button = QPushButton("删除场景")
        
        scene_list_layout.addWidget(self.scene_list)
        scene_list_layout.addWidget(add_button)
        scene_list_layout.addWidget(remove_button)
        scene_list_group.setLayout(scene_list_layout)
        
        # 场景设置
        scene_settings_group = QGroupBox("场景设置")
        scene_settings_layout = QVBoxLayout()
        
        # 场景名称
        name_group = QGroupBox("场景名称")
        name_layout = QHBoxLayout()
        self.scene_name = QLineEdit("回家模式")
        name_layout.addWidget(QLabel("名称:"))
        name_layout.addWidget(self.scene_name)
        name_group.setLayout(name_layout)
        
        # 设备控制
        device_group = QGroupBox("设备控制")
        device_layout = QVBoxLayout()
        
        devices = [
            ("客厅主灯", QSlider(Qt.Horizontal), "亮度"),
            ("空调温度", QSlider(Qt.Horizontal), "设定温度"),
            ("窗帘位置", QSlider(Qt.Horizontal), "开合度")
        ]
        
        for name, slider, param in devices:
            hbox = QHBoxLayout()
            hbox.addWidget(QLabel(f"{name}:"))
            slider.setMinimum(0)
            slider.setMaximum(100)
            slider.setValue(80)
            hbox.addWidget(slider)
            hbox.addWidget(QLabel(param))
            device_layout.addLayout(hbox)
        
        device_group.setLayout(device_layout)
        
        # 触发条件
        trigger_group = QGroupBox("触发条件")
        trigger_layout = QVBoxLayout()
        
        triggers = [
            "按场景按钮",
            "语音指令",
            "地理位置到家",
            "定时触发",
            "传感器检测"
        ]
        
        trigger_combos = []
        
        for trigger in triggers:
            cb = QCheckBox(trigger)
            if trigger == "按场景按钮":
                cb.setChecked(True)
            trigger_layout.addWidget(cb)
        
        trigger_group.setLayout(trigger_layout)
        
        # 添加场景设置控件
        scene_settings_layout.addWidget(name_group)
        scene_settings_layout.addWidget(device_group)
        scene_settings_layout.addWidget(trigger_group)
        scene_settings_layout.addWidget(QPushButton("保存场景设置"))
        
        scene_settings_group.setLayout(scene_settings_layout)
        
        # 添加主布局
        layout.addWidget(scene_list_group, 1)
        layout.addWidget(scene_settings_group, 2)
        
        scene_tab.setLayout(layout)
        self.main_tabs.addTab(scene_tab, "场景设计")
    
    def add_maintenance_tab(self):
        """创建维护与预测选项卡"""
        maintenance_tab = QWidget()
        layout = QVBoxLayout()
        
        # 设备状态
        status_group = QGroupBox("设备状态监控")
        status_layout = QVBoxLayout()
        
        devices = [
            ("主卧空调", "在线", "CPU: 45%", "内存: 32MB/64MB"),
            ("门厅摄像头", "在线", "CPU: 28%", "存储: 12GB/32GB"),
            ("厨房传感器", "警告", "电池: 12%", "需要更换"),
            ("客厅主灯", "离线", "", "检查网络连接")
        ]
        
        for name, status, info1, info2 in devices:
            hbox = QHBoxLayout()
            status_label = QLabel(f"{name}: {status}")
            if "警告" in status or "离线" in status:
                status_label.setStyleSheet("color: red;")
            
            hbox.addWidget(status_label)
            hbox.addWidget(QLabel(info1))
            hbox.addWidget(QLabel(info2))
            hbox.addStretch()
            
            btn = QPushButton("诊断")
            hbox.addWidget(btn)
            
            status_layout.addLayout(hbox)
        
        status_group.setLayout(status_layout)
        layout.addWidget(status_group)
        
        # 预测维护
        predict_group = QGroupBox("预测性维护分析")
        predict_layout = QVBoxLayout()
        
        analysis = """
        ### 系统健康报告
        - 🟢 80% 的设备状态良好
        - ⚠️ 15% 的设备需要维护
        - 🔴 5% 的设备需要立即维修
        
        ### 维护建议
        1. 厨房传感器电池将在7天内耗尽 - 建议更换
        2. 门厅摄像头存储空间将在15天内用尽 - 建议清理旧文件
        3. 客厅WiFi模块信号减弱 - 建议检查路由器位置
        
        ### 自我优化建议
        - 智能照明使用模式分析:调整21:00后的亮度设置可节能12%
        - 空调使用习惯分析:优化离家模式温度设置可减少能耗
        """
        
        analysis_edit = QTextEdit()
        analysis_edit.setMarkdown(analysis)
        predict_layout.addWidget(analysis_edit)
        
        predict_group.setLayout(predict_layout)
        layout.addWidget(predict_group)
        
        # 系统更新
        update_group = QGroupBox("系统更新")
        update_layout = QHBoxLayout()
        
        update_info = QLabel("当前版本: v2.1.4\n最新版本: v2.2.0")
        
        update_btn = QPushButton("检查更新")
        install_btn = QPushButton("安装更新")
        
        update_layout.addWidget(update_info)
        update_layout.addStretch()
        update_layout.addWidget(update_btn)
        update_layout.addWidget(install_btn)
        
        update_group.setLayout(update_layout)
        layout.addWidget(update_group)
        
        maintenance_tab.setLayout(layout)
        self.main_tabs.addTab(maintenance_tab, "维护预测")
    
 

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = SmartHomeApp()
    window.show()
    sys.exit(app.exec_())

运行效果

相关推荐
Zonda要好好学习几秒前
Python入门Day4
java·网络·python
小龙在山东42 分钟前
Python 包管理工具 uv
windows·python·uv
weixin_307779131 小时前
批量OCR的GitHub项目
python·github·ocr
孤狼warrior2 小时前
灰色预测模型
人工智能·python·算法·数学建模
神仙别闹2 小时前
基于Python实现LSTM对股票走势的预测
开发语言·python·lstm
机器学习之心3 小时前
小波增强型KAN网络 + SHAP可解释性分析(Pytorch实现)
人工智能·pytorch·python·kan网络
JavaEdge在掘金3 小时前
MySQL 8.0 的隐藏索引:索引管理的利器,还是性能陷阱?
python
站大爷IP3 小时前
Python办公自动化实战:手把手教你打造智能邮件发送工具
python
chao_7893 小时前
回溯题解——子集【LeetCode】二进制枚举法
开发语言·数据结构·python·算法·leetcode
zdw3 小时前
fit parse解析佳明.fit 运动数据,模仿zwift数据展示
python