Files
zjsh_ui_sysytem/main.py
2025-09-10 11:20:31 +08:00

378 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import sys
from PySide6.QtWidgets import (
QApplication, QWidget, QVBoxLayout, QHBoxLayout,
QLabel, QFrame, QSizePolicy, QPushButton
)
from PySide6.QtCore import Qt, QTimer
from PySide6.QtGui import QFont
from datetime import datetime
class StatusMonitor(QWidget):
"""
中交三航精准布料浇筑要料系统 - 主界面类
"""
def __init__(self, parent=None):
"""构造函数初始化主界面的UI布局、控件和定时器"""
super().__init__(parent=parent)
self.is_running = False # 系统运行状态标记
# 窗口基础设置
self.setWindowTitle("中交三航精准布料浇筑要料系统")
self.setGeometry(100, 100, 800, 500) # 设置窗口位置和大小
# 初始化主布局(垂直布局)
self.mainLayout = QVBoxLayout(self)
self.mainLayout.setContentsMargins(10, 10, 10, 10) # 设置布局的内边距
self.mainLayout.setSpacing(10) # 相邻控件的间距
# 初始化界面组件
self._init_title_label()
self._init_time_label()
self._init_status_container()
self._init_timers()
def _init_title_label(self):
"""初始化系统标题标签"""
titleLabel = QLabel("中交三航精准布料浇筑要料系统")
titleLabel.setStyleSheet("""
QLabel {
background-color: #66BB6A;
color: white;
font-size: 24px;
font-weight: bold;
padding: 15px;
border-radius: 8px;
border: 2px solid #E8F5E9;
}
""")
titleLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)
titleLabel.setFont(QFont("Microsoft YaHei", 24, QFont.Bold))
self.mainLayout.addWidget(titleLabel)
def _init_time_label(self):
"""初始化实时时间显示标签"""
self.timeLabel = QLabel(self.get_current_time())
self.timeLabel.setStyleSheet("""
background-color: #E8F5E9;
color: #2E7D32;
font-size: 16px;
padding: 8px 12px;
border-radius: 6px;
border: 1px solid #C8E6C9;
""")
self.timeLabel.setFont(QFont("Arial", weight=QFont.Bold))
self.timeLabel.setAlignment(Qt.AlignmentFlag.AlignRight)
self.timeLabel.setSizePolicy(
QSizePolicy.Policy.Expanding, # 水平方向尽可能的占据布局中可用的空间
QSizePolicy.Policy.Fixed # 垂直方向固定为固定高度
)
self.mainLayout.addWidget(self.timeLabel, 0)
def _init_status_container(self):
"""初始化核心状态监控容器(包含状态组和操作按钮)"""
self.bigContainer = QFrame()
self.bigContainer.setStyleSheet("""
QFrame {
background-color: #f0f0f0;
border: 2px solid #cccccc;
border-radius: 8px;
}
""")
self.bigContainer.setSizePolicy(
QSizePolicy.Policy.Expanding,
QSizePolicy.Policy.Expanding
)
containerLayout = QVBoxLayout(self.bigContainer)
containerLayout.setContentsMargins(20, 20, 20, 20)
self._init_status_groups(containerLayout)
self._init_operation_buttons(containerLayout)
self.mainLayout.addWidget(self.bigContainer, 1)
def _init_status_groups(self, parent_layout):
"""初始化左右状态组包含4个状态项"""
statusWidget = QWidget()
statusLayout = QHBoxLayout(statusWidget)
statusLayout.setContentsMargins(0, 0, 0, 0)
statusLayout.setSpacing(30)
leftGroup = QWidget()
leftLayout = QVBoxLayout(leftGroup)
leftLayout.setSpacing(15)
leftLayout.setContentsMargins(0, 0, 0, 0)
rightGroup = QWidget()
rightLayout = QVBoxLayout(rightGroup)
rightLayout.setSpacing(15)
rightLayout.setContentsMargins(0, 0, 0, 0)
statusNames = ["盖板状态", "液压对齐状态", "LED状态", "按键状态"]
self.statusWidgets = []
for i, name in enumerate(statusNames):
statusItem = QFrame()
statusItem.setStyleSheet("""
QFrame {
background-color: white;
border: 1px solid #d0d0d0;
border-radius: 6px;
padding: 10px;
}
""")
statusItem.setFixedHeight(80)
itemLayout = QHBoxLayout(statusItem)
itemLayout.setContentsMargins(10, 5, 10, 5)
# 状态指示灯
indicator = QLabel()
indicator.setFixedSize(20, 20)
indicator.setStyleSheet("""
QLabel {
background-color: #9E9E9E;
border-radius: 10px;
border: 2px solid #757575;
}
""")
# 状态名称标签
nameLabel = QLabel(name)
nameLabel.setStyleSheet("font-size: 14px; color: #333333;")
nameLabel.setFont(QFont("Microsoft YaHei", 12))
# 状态值标签
valueLabel = QLabel("")
valueLabel.setStyleSheet("""
QLabel {
font-size: 18px;
font-weight: bold;
color: #D32F2F;
background-color: #FFEBEE;
padding: 5px 10px;
border-radius: 4px;
border: 1px solid #FFCDD2;
}
""")
valueLabel.setAlignment(Qt.AlignmentFlag.AlignCenter)
valueLabel.setMinimumWidth(60)
itemLayout.addWidget(indicator)
itemLayout.addSpacing(10)
itemLayout.addWidget(nameLabel)
itemLayout.addStretch()
itemLayout.addWidget(valueLabel)
self.statusWidgets.append({
'indicator': indicator,
'nameLabel': nameLabel,
'valueLabel': valueLabel,
'status': False
})
if i % 2 == 0:
leftLayout.addWidget(statusItem)
else:
rightLayout.addWidget(statusItem)
statusLayout.addWidget(leftGroup)
statusLayout.addStretch(1)
statusLayout.addWidget(rightGroup)
parent_layout.addWidget(statusWidget)
def _init_operation_buttons(self, parent_layout):
"""初始化操作按钮(开始/重启/停止)"""
buttonContainer = QWidget()
buttonLayout = QHBoxLayout(buttonContainer)
buttonLayout.setContentsMargins(0, 20, 0, 0)
buttonLayout.setSpacing(30)
self.startButton = QPushButton("开始")
self.restartButton = QPushButton("重启")
self.stopButton = QPushButton("停止")
button_base_style = """
QPushButton {
font-size: 16px;
font-weight: bold;
padding: 10px 20px;
border-radius: 6px;
border: 1px solid;
min-width: 100px;
}
QPushButton:hover {
opacity: 0.9;
}
QPushButton:pressed {
opacity: 0.8;
}
"""
self.startButton.setStyleSheet(button_base_style + """
QPushButton {
background-color: #4CAF50;
color: white;
border-color: #2E7D32;
}
""")
self.restartButton.setStyleSheet(button_base_style + """
QPushButton {
background-color: #FF9800;
color: white;
border-color: #F57C00;
}
""")
self.stopButton.setStyleSheet(button_base_style + """
QPushButton {
background-color: #F44336;
color: white;
border-color: #D32F2F;
}
""")
button_font = QFont("Microsoft YaHei", 12, QFont.Bold)
self.startButton.setFont(button_font)
self.restartButton.setFont(button_font)
self.stopButton.setFont(button_font)
self.startButton.clicked.connect(self.on_start_clicked)
self.restartButton.clicked.connect(self.on_restart_clicked)
self.stopButton.clicked.connect(self.on_stop_clicked)
buttonLayout.addStretch(1)
buttonLayout.addWidget(self.startButton)
buttonLayout.addWidget(self.restartButton)
buttonLayout.addWidget(self.stopButton)
buttonLayout.addStretch(1)
parent_layout.addWidget(buttonContainer)
def _init_timers(self):
"""初始化定时器(时间更新+状态模拟)"""
# 时间更新定时器(每秒更新一次)
self.time_timer = QTimer()
self.time_timer.timeout.connect(self.update_time)
self.time_timer.start(1000)
# 状态模拟定时器每3秒更新一次
self.status_timer = QTimer()
self.status_timer.timeout.connect(self.simulate_mcu_query)
self.status_timer.start(3000)
def get_current_time(self):
"""获取格式化的当前时间"""
return f"🕒 当前时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
def update_time(self):
"""更新时间显示"""
self.timeLabel.setText(self.get_current_time())
def simulate_mcu_query(self):
"""模拟单片机状态查询"""
import random # 仅用于模拟,实际项目替换为真实通信逻辑
if self.is_running:
for widget in self.statusWidgets:
status = random.choice([True, False])
widget['status'] = status
if status:
# 状态为"是"时的样式
widget['valueLabel'].setText("")
widget['valueLabel'].setStyleSheet("""
QLabel {
font-size: 18px;
font-weight: bold;
color: #2E7D32;
background-color: #E8F5E9;
padding: 5px 10px;
border-radius: 4px;
border: 1px solid #C8E6C9;
min-width: 60px;
}
""")
widget['indicator'].setStyleSheet("""
QLabel {
background-color: #4CAF50;
border-radius: 10px;
border: 2px solid #2E7D32;
}
""")
else:
# 状态为"否"时的样式
widget['valueLabel'].setText("")
widget['valueLabel'].setStyleSheet("""
QLabel {
font-size: 18px;
font-weight: bold;
color: #D32F2F;
background-color: #FFEBEE;
padding: 5px 10px;
border-radius: 4px;
border: 1px solid #FFCDD2;
min-width: 60px;
}
""")
widget['indicator'].setStyleSheet("""
QLabel {
background-color: #F44336;
border-radius: 10px;
border: 2px solid #D32F2F;
}
""")
def on_start_clicked(self):
"""开始按钮点击事件"""
if not self.is_running:
self.is_running = True
print("系统已启动,开始监控状态...")
self.simulate_mcu_query() # 启动时立即更新一次状态
def on_stop_clicked(self):
"""停止按钮点击事件"""
if self.is_running:
self.is_running = False
print("系统已停止,状态监控暂停...")
def on_restart_clicked(self):
"""重启按钮点击事件"""
print("系统正在重启...")
self.is_running = False
# 重置所有状态为"否"
for widget in self.statusWidgets:
widget['status'] = False
widget['valueLabel'].setText("")
widget['valueLabel'].setStyleSheet("""
QLabel {
font-size: 18px;
font-weight: bold;
color: #D32F2F;
background-color: #FFEBEE;
padding: 5px 10px;
border-radius: 4px;
border: 1px solid #FFCDD2;
min-width: 60px;
}
""")
widget['indicator'].setStyleSheet("""
QLabel {
background-color: #F44336;
border-radius: 10px;
border: 2px solid #D32F2F;
}
""")
# 重启后自动开始
QTimer.singleShot(1000, self.on_start_clicked)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = StatusMonitor()
window.show()
sys.exit(app.exec())