add tests (在测试模块,增加 emv界面测试 和 计量界面测试)

This commit is contained in:
2025-08-29 14:55:00 +08:00
parent 7cb36c75ea
commit 17abd13df7
8 changed files with 407 additions and 0 deletions

17
tests/common.py Normal file
View File

@ -0,0 +1,17 @@
import sys
import os
# 注意: 只在 tests 目录下的 测试文件中使用
# 设置项目目录 为搜索目录
# 通用逻辑:添加项目根目录到搜索路径
def add_project_root_to_path():
# 获取项目根目录tests的上级目录
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if project_root not in sys.path:
sys.path.append(project_root)
# 自动执行(导入时就添加路径)
add_project_root_to_path()

234
tests/test_emv.py Normal file
View File

@ -0,0 +1,234 @@
from common import *
from PySide6.QtWidgets import (
QApplication,
QWidget,
QVBoxLayout,
QHBoxLayout,
QSpacerItem,
QSizePolicy,
QLabel,
)
from PySide6.QtCore import Qt, QTimer, Signal
from qfluentwidgets import (
PushButton,
LineEdit,
BodyLabel,
MessageBox,
setTheme,
Theme,
)
import sys
class DOWidget(QWidget):
# open开关按下
open_btn_clicked_sig = Signal()
# close开关按下
close_btn_clicked_sig = Signal()
def __init__(self, title: str, parent=None):
super().__init__(parent)
self.title = title # DO名称如"DO1"
self.is_open = False # 初始状态:关闭
self.__initWidget()
def __initWidget(self):
# 创建控件
self.__createWidget()
# 设置样式
self.__initStyles()
# 设置布局
self.__initLayout()
# 绑定
self.__bind()
def __createWidget(self):
# Do按钮名称的 label
self.title_label = BodyLabel(self.title)
self.title_label.setAlignment(Qt.AlignCenter)
# 状态指示灯
self.status_light = QLabel()
self.status_light.setFixedSize(40, 40)
# 打开和关闭按钮
self.open_btn = PushButton("打开")
self.close_btn = PushButton("关闭")
def __initStyles(self):
# 状态指示灯样式(初始颜色:灰色(关闭))
self.status_light.setStyleSheet(
"""
border-radius: 20px;
background-color: gray;
"""
)
def __initLayout(self):
# 垂直布局:标题 → 状态灯 → 按钮
main_layout = QVBoxLayout(self)
main_layout.setContentsMargins(15, 15, 15, 15) # 内边距
main_layout.setSpacing(12) # 控件间距
# 按钮布局
btn_layout = QHBoxLayout()
btn_layout.setSpacing(8)
btn_layout.addWidget(self.open_btn)
btn_layout.addWidget(self.close_btn)
main_layout.addWidget(self.title_label) # 添加按钮名称
main_layout.addWidget(self.status_light, alignment=Qt.AlignCenter) # 添加指示灯
main_layout.addLayout(btn_layout)
def __bind(self):
self.open_btn.clicked.connect(self.open_btn_clicked_sig)
self.close_btn.clicked.connect(self.close_btn_clicked_sig)
# def on_open(self):
# """打开按钮点击事件:更新状态灯为绿色"""
# self.is_open = True
# self.status_light.setStyleSheet(
# """
# border-radius: 20px;
# background-color: green; /* 打开 → 绿色 */
# """
# )
# def on_close(self):
# """关闭按钮点击事件:更新状态灯为灰色"""
# self.is_open = False
# self.status_light.setStyleSheet(
# """
# border-radius: 20px;
# background-color: gray; /* 关闭 → 灰色 */
# """
# )
class EmvTestUi(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("继电器调试")
self.resize(1000, 600)
self.setStyleSheet("background-color: white;") # 背景颜色,根据主题来变化
self.__initWidget()
def __initWidget(self):
# 创建控件
self.__createWidget()
# 设置样式
self.__initStyles()
# 设置布局
self.__initLayout()
# 绑定
self.__bind()
def __createWidget(self):
# Tcp连接控件
# IP控件
self.ip_label = BodyLabel("设备IP: ")
self.ip_edit = LineEdit()
self.ip_edit.setText("192.168.0.18") # 默认IP
# 端口控件
self.port_label = BodyLabel("设备端口号: ")
self.port_edit = LineEdit()
self.port_edit.setText("50000") # 默认端口
# 连接按钮
self.connect_btn = PushButton("连接")
# 功能测试按钮
self.test_btn = PushButton("功能测试")
# 三个Do模块
self.do1_model = DOWidget("DO1")
self.do2_model = DOWidget("DO2")
self.do3_model = DOWidget("DO3")
def __initStyles(self):
# 设置样式 to do
pass
def __initLayout(self):
# 顶部的连接布局
top_layout = QHBoxLayout()
top_layout.addWidget(self.ip_label)
top_layout.addWidget(self.ip_edit)
top_layout.addWidget(self.port_label)
top_layout.addWidget(self.port_edit)
top_layout.addWidget(self.connect_btn)
top_layout.addWidget(self.test_btn)
# 三个Do开关区域布局
do_layout = QHBoxLayout()
do_layout.setSpacing(60) # DO模块之间的间距
do_layout.setAlignment(Qt.AlignCenter) # 水平居中
do_layout.addWidget(self.do1_model)
do_layout.addWidget(self.do2_model)
do_layout.addWidget(self.do3_model)
# 主布局
main_layout = QVBoxLayout(self)
main_layout.setContentsMargins(60, 60, 60, 60)
main_layout.setSpacing(30)
main_layout.addLayout(top_layout)
main_layout.addLayout(do_layout)
main_layout.addItem(
QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding)
)
def __bind(self):
pass
self.connect_btn.clicked.connect(self.on_connect)
def on_connect(self):
"""连接按钮点击事件:切换状态为“连接中...”,模拟连接过程"""
# 禁用按钮 + 修改文字
self.connect_btn.setEnabled(False)
self.connect_btn.setText("连接中...")
# 模拟连接过程实际应替换为真实的网络请求如socket连接
self.timer = QTimer(self)
self.timer.setSingleShot(True)
self.timer.timeout.connect(self.simulate_connection_result)
self.timer.start(2000) # 模拟2秒连接耗时
def simulate_connection_result(self):
"""模拟连接结果(这里固定返回失败,实际需根据真实逻辑修改)"""
# 模拟连接失败实际中通过try-except或网络返回判断
connection_success = False # TODO: 替换为真实连接结果
if not connection_success:
# 弹出连接失败对话框
# 正确创建警告对话框:通过 type 参数指定为警告类型
msg_box = MessageBox(
"连接失败", # 标题
"无法连接到设备, 请检查IP和端口是否正确!!", # 内容
self, # 父窗口
)
msg_box.exec() # 显示对话框
# 恢复按钮状态
self.connect_btn.setEnabled(True)
self.connect_btn.setText("连接")
if __name__ == "__main__":
app = QApplication(sys.argv)
setTheme(Theme.LIGHT)
window = EmvTestUi()
window.show()
sys.exit(app.exec())

View File

@ -1,3 +1,5 @@
from common import *
import sys
from PySide6.QtWidgets import (
QApplication,

View File

@ -1,3 +1,5 @@
from common import *
import sys
from PySide6.QtWidgets import (
QApplication,

View File

@ -1,3 +1,5 @@
from common import *
from PySide6.QtWidgets import (
QApplication,
QWidget,

View File

@ -1,3 +1,5 @@
from common import *
from PySide6.QtWidgets import (
QApplication,
QWidget,

View File

@ -1,3 +1,5 @@
from common import *
import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget
from PySide6.QtWebEngineWidgets import QWebEngineView

146
tests/test_weight.py Normal file
View File

@ -0,0 +1,146 @@
from common import *
from PySide6.QtWidgets import (
QApplication,
QWidget,
QFormLayout,
QHBoxLayout,
QVBoxLayout,
QLabel,
QSpacerItem,
QSizePolicy,
)
from PySide6.QtCore import Qt
from qfluentwidgets import LineEdit, PushButton, StrongBodyLabel
class WeightControlUI(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
# ========== 1. 窗口基础设置 ==========
self.setWindowTitle("计量一体机调试")
self.resize(800, 600) # 窗口大小
self.setStyleSheet("background-color: white;") # 背景颜色,根据主题来变化
self.__initWidget()
def __initWidget(self):
# 创建控件
self.__createWidget()
# 设置样式
self.__initStyles()
# 设置布局
self.__initLayout()
def __createWidget(self):
# ========== 创建表单控件 ==========
# 右侧编辑栏
self.target_weight_edit = LineEdit()
self.target_weight_edit.setPlaceholderText("目标重量")
self.current_weight_edit = LineEdit()
self.current_weight_edit.setPlaceholderText("当前重量")
self.current_weight_edit.setReadOnly(True) # 只读
self.error_edit = LineEdit()
self.error_edit.setPlaceholderText("误差")
self.error_edit.setReadOnly(True) # 只读
# ========== 按钮 ==========
self.calibrate_btn = PushButton("重量标定")
self.confirm_btn = PushButton("确认")
self.compensate_btn = PushButton("补称")
self.motor_forward_btn = PushButton("电机正转")
self.motor_reverse_btn = PushButton("电机反转")
def __initStyles(self):
# 设置按钮大小
# 固定大小为 160x46
for btn in [
self.calibrate_btn,
self.confirm_btn,
self.compensate_btn,
self.motor_forward_btn,
self.motor_reverse_btn,
]:
btn.setFixedSize(160, 46) # 固定按钮尺寸
def __initLayout(self):
# ========== 布局设计 ==========
# 表单布局(标签+输入框,右对齐)
form_layout = QFormLayout()
form_layout.addRow(StrongBodyLabel("目标重量:"), self.target_weight_edit)
form_layout.addRow(StrongBodyLabel("当前重量:"), self.current_weight_edit)
form_layout.addRow(StrongBodyLabel("误差:"), self.error_edit)
form_layout.setRowWrapPolicy(QFormLayout.DontWrapRows) # 禁止换行
form_layout.setVerticalSpacing(20) # 行间距
form_layout.setLabelAlignment(Qt.AlignLeft | Qt.AlignVCenter) # 标签左对齐
# 用QHBoxLayout 包裹 form_layout两侧加弹簧
form_horizontal_layout = QHBoxLayout()
# 左侧弹簧:占据左边多余空间
form_horizontal_layout.addItem(
QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Minimum)
)
# 添加表单布局
form_horizontal_layout.addLayout(form_layout)
# 右侧弹簧:占据右边多余空间
form_horizontal_layout.addItem(
QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Minimum)
)
# 按钮布局(第一行:重量标定 + 确认;第二行:补称 + 电机正转 + 电机反转)
# 第一行按钮布局(中间留空,让按钮居中)
btn_row1_layout = QHBoxLayout()
btn_row1_layout.addSpacerItem(
QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Minimum)
)
btn_row1_layout.addWidget(self.calibrate_btn)
btn_row1_layout.addSpacerItem(
QSpacerItem(160, 0, QSizePolicy.Fixed, QSizePolicy.Minimum)
) # 两个按钮之间的间距为160
btn_row1_layout.addWidget(self.confirm_btn)
btn_row1_layout.addSpacerItem(
QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Minimum)
)
# 第二行按钮布局(均匀分布)
btn_row2_layout = QHBoxLayout()
btn_row2_layout.addWidget(self.compensate_btn)
btn_row2_layout.addSpacerItem(
QSpacerItem(60, 0, QSizePolicy.Fixed, QSizePolicy.Minimum)
)
btn_row2_layout.addWidget(self.motor_forward_btn)
btn_row2_layout.addSpacerItem(
QSpacerItem(60, 0, QSizePolicy.Fixed, QSizePolicy.Minimum)
)
btn_row2_layout.addWidget(self.motor_reverse_btn)
btn_row2_layout.setContentsMargins(0, 0, 0, 0) # 清除边距
# 主布局(垂直排列:表单 + 按钮行1 + 按钮行2
main_layout = QVBoxLayout(self)
main_layout.addLayout(form_horizontal_layout)
main_layout.addSpacing(40) # 表单与按钮的间距
main_layout.addLayout(btn_row1_layout)
main_layout.addSpacing(30) # 两行按钮的间距
main_layout.addLayout(btn_row2_layout)
main_layout.setContentsMargins(80, 60, 80, 60) # 窗口内边距
# main_layout.setAlignment(Qt.AlignTop | Qt.AlignHCenter) # 整体上对齐,水平居中
main_layout.setAlignment(Qt.AlignVCenter | Qt.AlignHCenter) # 垂直、水平居中
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
# 设置qfluentwidgets全局主题如浅色主题
from qfluentwidgets import setTheme, Theme
setTheme(Theme.LIGHT)
window = WeightControlUI()
window.show()
sys.exit(app.exec())