From ccc794d158407b511de95dfb5c32aadee45fe86d Mon Sep 17 00:00:00 2001 From: pengqi Date: Sun, 16 Nov 2025 11:58:22 +0800 Subject: [PATCH] V1.0 --- .idea/.gitignore | 3 + .idea/inspectionProfiles/Project_Default.xml | 18 ++ .../inspectionProfiles/profiles_settings.xml | 6 + .idea/misc.xml | 7 + .idea/modules.xml | 8 + .idea/中交三航背景界面.iml | 8 + bottom_control_widget.py | 41 ++++ config/config.json | 4 + config/tcp_server.py | 157 ++++++++++++ main_window.py | 129 ++++++++++ system_nav_bar.py | 141 +++++++++++ tcp_client.py | 174 +++++++++++++ weight_dialog.py | 228 ++++++++++++++++++ 主界面背景.png | Bin 0 -> 2354 bytes 关闭图标.png | Bin 0 -> 229 bytes 底部背景.png | Bin 0 -> 14745 bytes 数字.png | Bin 0 -> 443 bytes 系统logo.png | Bin 0 -> 2158 bytes 系统主界面导航栏.png | Bin 0 -> 23632 bytes 系统总标题.png | Bin 0 -> 6262 bytes 系统消息喇叭.png | Bin 0 -> 348 bytes 系统消息背景.png | Bin 0 -> 3267 bytes 选择_实时.png | Bin 0 -> 2616 bytes 选择_未实时.png | Bin 0 -> 2022 bytes 重量背景.png | Bin 0 -> 18021 bytes 25 files changed, 924 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/inspectionProfiles/profiles_settings.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/中交三航背景界面.iml create mode 100644 bottom_control_widget.py create mode 100644 config/config.json create mode 100644 config/tcp_server.py create mode 100644 main_window.py create mode 100644 system_nav_bar.py create mode 100644 tcp_client.py create mode 100644 weight_dialog.py create mode 100644 主界面背景.png create mode 100644 关闭图标.png create mode 100644 底部背景.png create mode 100644 数字.png create mode 100644 系统logo.png create mode 100644 系统主界面导航栏.png create mode 100644 系统总标题.png create mode 100644 系统消息喇叭.png create mode 100644 系统消息背景.png create mode 100644 选择_实时.png create mode 100644 选择_未实时.png create mode 100644 重量背景.png diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..359bb53 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..78dfc6d --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,18 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..62ef35e --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..56ad756 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/中交三航背景界面.iml b/.idea/中交三航背景界面.iml new file mode 100644 index 0000000..53e58ed --- /dev/null +++ b/.idea/中交三航背景界面.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/bottom_control_widget.py b/bottom_control_widget.py new file mode 100644 index 0000000..49b3025 --- /dev/null +++ b/bottom_control_widget.py @@ -0,0 +1,41 @@ +from PySide6.QtWidgets import (QWidget, QHBoxLayout, QLabel, QPushButton, + QMessageBox, QSpacerItem, QSizePolicy) +from PySide6.QtGui import QPixmap, QPainter, QFont, QPen +from PySide6.QtCore import Qt, QDateTime, QEvent, QSize + +class BottomControlWidget(QWidget): + def __init__(self, parent=None): + super().__init__(parent) + self.initUI() + + def initUI(self): + # 1. 加载背景图并设置控件尺寸 + bg_path = "底部背景.png" + self.bg_pixmap = QPixmap(bg_path) + if self.bg_pixmap.isNull(): + print("警告:底部背景.png 加载失败,请检查路径!") + self.setFixedSize(1280, 66) + else: + self.setFixedSize(self.bg_pixmap.size()) + + # 2. 主布局(水平布局,组件间距6px) + main_layout = QHBoxLayout(self) + main_layout.setContentsMargins(10, 10, 10, 10) # 适当留白避免贴边 + main_layout.setSpacing(6) + + def paintEvent(self, event): + """绘制背景图""" + super().paintEvent(event) + if not self.bg_pixmap.isNull(): + painter = QPainter(self) + painter.drawPixmap(0, 0, self.bg_pixmap) + +if __name__ == "__main__": + import sys + from PySide6.QtWidgets import QApplication + + app = QApplication(sys.argv) + widget = BottomControlWidget() + widget.show() + sys.exit(app.exec()) + \ No newline at end of file diff --git a/config/config.json b/config/config.json new file mode 100644 index 0000000..476559d --- /dev/null +++ b/config/config.json @@ -0,0 +1,4 @@ +{ + "hopper_up_weight": 1111, + "hopper_down_weight": 6524 +} diff --git a/config/tcp_server.py b/config/tcp_server.py new file mode 100644 index 0000000..5789f02 --- /dev/null +++ b/config/tcp_server.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +''' +# @Time : 2025/9/19 09:48 +# @Author : reenrr +# @File : mock_server.py +''' +import socket +import json +import threading +import time +from datetime import datetime +import os + +class TCPServerSimulator: + def __init__(self, host='127.0.0.1', port=8888, config_file='config.json'): + self.host = host + self.port = port + self.server_socket = None + self.is_running = False + self.client_sockets = [] + self.config_file = config_file + + # 初始状态为None + self.data_template = None + + # 从配置文件中加载固定数据 + self.load_config_data() + + # 模拟数据模板 + if self.data_template is None: + self.data_template = { + "hopper_up_weight": 0.0, # 上料斗重量 + "hopper_down_weight": 0.0 # 下料斗重量 + } + + def load_config_data(self): + """从配置文件中加载固定数据""" + try: + if os.path.exists(self.config_file): + with open(self.config_file, 'r', encoding='utf-8') as f: + self.data_template = json.load(f) + print(f"成功从 {self.config_file} 加载配置数据") + else: + print(f"配置文件 {self.config_file} 不存在") + except Exception as e: + print(f"加载配置文件时发生错误:{e},将使用默认数据") + self.data_template = None + + def start(self): + """启动服务器""" + self.is_running = True + self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + self.server_socket.bind((self.host, self.port)) + self.server_socket.listen(5) + print(f"服务器已启动,监听 {self.host}:{self.port}...") + + # 启动接受连接的线程 + accept_thread = threading.Thread(target=self.accept_connections, daemon=True) + accept_thread.start() + + try: + while self.is_running: + time.sleep(1) + except KeyboardInterrupt: + print("\n服务器正在关闭...") + self.stop() + + def accept_connections(self): + """接受客户端连接""" + while self.is_running: + try: + client_socket, client_address = self.server_socket.accept() + self.client_sockets.append(client_socket) + print(f"客户端 {client_address} 已连接") + + # 发送数据 + data = self.generate_simulated_data() + self.send_data(client_socket, data) + print(f"已向客户端 {client_address} 发送数据:{data}") + + # 启动一个线程监听客户端发送的指令 + threading.Thread( + target=self.listen_client_commands, + args=(client_socket,client_address), + daemon=True + ).start() + + except Exception as e: + if self.is_running: + print(f"接受连接时发生错误: {e}") + break + + def listen_client_commands(self, client_socket, client_address): + """监听客户端发送的指令""" + while self.is_running and client_socket in self.client_sockets: + try: + # 接收客户端发送的指令 + data = client_socket.recv(1024).decode('utf-8').strip() + if data: + print(f"客户端 {client_address} 发送指令: {data}") + else: + print(f"客户端 {client_address} 已断开连接") + self.client_sockets.remove(client_socket) + client_socket.close() + break + except Exception as e: + print(f"监听客户端 {client_address} 指令时发生错误: {e}") + self.client_sockets.remove(client_socket) + client_socket.close() + break + + def generate_simulated_data(self): + """生成模拟的状态数据""" + if self.data_template is None: + return None + + data = self.data_template.copy() + data["timestamp"] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + + return data + + def send_data(self, client_socket, data): + """向客户端发送数据""" + try: + # 转换为JSON字符串并添加换行符作为结束标记 + if data is None: + data_str = json.dumps(None) + "\n" + else: + data_str = json.dumps(data) + "\n" + client_socket.sendall(data_str.encode('utf-8')) + except Exception as e: + print(f"向客户端 {client_socket.getpeername()} 发送数据时发生错误: {e}") + + def stop(self): + """停止服务器""" + self.is_running = False + + # 关闭所有客户端连接 + for sock in self.client_sockets: + try: + sock.close() + except Exception as e: + print(f"关闭客户端连接时发生错误: {e}") + + # 关闭服务器套接字 + if self.server_socket: + try: + self.server_socket.close() + except Exception as e: + print(f"关闭服务器套接字时发生错误: {e}") + + print("服务器已关闭") + +if __name__ == '__main__': + server = TCPServerSimulator(host='127.0.0.1', port=8888) + server.start() diff --git a/main_window.py b/main_window.py new file mode 100644 index 0000000..eae48b4 --- /dev/null +++ b/main_window.py @@ -0,0 +1,129 @@ +# coding: utf-8 +from typing import List +from PySide6.QtCore import Qt, Signal, QEasingCurve, QUrl, QSize, QTimer, QEvent +from PySide6.QtGui import QIcon, QDesktopServices, QColor, QPalette, QBrush, QImage +from PySide6.QtWidgets import (QApplication, QHBoxLayout, QVBoxLayout, + QFrame, QWidget, QSpacerItem, QSizePolicy, QMainWindow, QPushButton) + +from system_nav_bar import SystemNavBar +from bottom_control_widget import BottomControlWidget +from weight_dialog import WeightDetailsDialog +from tcp_client import TcpClient + + +class MainWindow(QWidget): + def __init__(self): + super().__init__() + self.initWindow() + self.createSubWidgets() # 创建子部件 + self.setupLayout() # 设置布局 + self.tcp_client = TcpClient(self) # 创建 TCP 客户端 + self.bind_signals() # 绑定信号槽 + + def initWindow(self): + """初始化窗口基本属性""" + self.setWindowTitle("中交三航主界面") # 设置窗口标题 + # 触摸屏尺寸为 1280*800 + self.setMinimumSize(1280, 800) + self.setObjectName("MainWindow") + + # Qt.FramelessWindowHint + self.setWindowFlags(Qt.FramelessWindowHint) # 无边框窗口 + + # 设置主界面背景图片 + try: + self.background_image = QImage("主界面背景.png") + if self.background_image.isNull(): + raise Exception("图片为空,可能路径错误或格式不支持") + # print("图片加载成功") + except Exception as e: + print(f"主界面背景图片加载失败: {e}") + self.background_image = None + return # 加载背景失败 + + self.update_background() + + def createSubWidgets(self): + """创建所有子部件实例""" + self.system_nav_bar = SystemNavBar() # 最上方:系统导航栏 + self.bottom_control_widget = BottomControlWidget() # 最下方: 控制的按钮 (系统诊断、系统中心等) + + # 上料斗、下料斗重量显示 + self.weight_dialog1 = WeightDetailsDialog(self, title="上料斗重量") + self.weight_dialog2 = WeightDetailsDialog(self, title="下料斗重量") + + def setupLayout(self): + """设置垂直布局,从上到下排列部件""" + main_layout = QVBoxLayout(self) # 主布局:垂直布局 + main_layout.setSpacing(0) # 部件间距0px + main_layout.setContentsMargins(0, 0, 0, 0) # 左上右下边距0px + + # 添加最上方的 系统导航栏(包括系统标题、中交三航的logo等) + main_layout.addWidget(self.system_nav_bar, alignment=Qt.AlignTop) + # 添加中间内容区 + main_layout.addWidget(self.weight_dialog1, alignment=Qt.AlignCenter) + main_layout.addWidget(self.weight_dialog2, alignment=Qt.AlignCenter) + # 关闭按钮 + self.system_nav_bar.msg_container.close_btn.clicked.connect(self.close) + # 将布局应用到主窗口 + self.setLayout(main_layout) + + def update_background(self): + """更新主界面背景图片""" + if self.background_image and not self.background_image.isNull(): + palette = self.palette() + # 按当前窗口尺寸缩放图片 + scaled_image = self.background_image.scaled( + self.size(), + Qt.IgnoreAspectRatio, + Qt.SmoothTransformation + ) + palette.setBrush(QPalette.Window, QBrush(scaled_image)) + self.setPalette(palette) + self.setAutoFillBackground(True) + + def resizeEvent(self, e): + """窗口大小变化时的回调""" + super().resizeEvent(e) + self.update_background() # 重新加载背景图片 + + def keyPressEvent(self, event): + if event.key() == Qt.Key_Escape: # 按下Esc键, 退出界面 + self.close() + super().keyPressEvent(event) + + # --------------- + # TCP更新重量信息 + # --------------- + def bind_signals(self): + """绑定TCP信号到弹窗更新函数""" + self.tcp_client.weight_updated.connect(self.update_weight_dialogs) # 绑定更新重量信息的信号槽 + # 连接状态信号:更新按钮状态和弹窗图标 + self.tcp_client.connection_status_changed.connect(self.update_connection_status) + # 启动 TCP 连接 + print(f"客户端启动,自动连接服务端{self.tcp_client.tcp_server_host}:{self.tcp_client.tcp_server_port}...") + self.tcp_client._connect_to_server() + + def update_connection_status(self, is_connected): + """更新连接状态""" + self.weight_dialog1._update_status_icon(is_connected) + self.weight_dialog2._update_status_icon(is_connected) + + def update_weight_dialogs(self, data): + """更新上料斗、下料斗重量显示""" + # 上料斗重量(对应字段 hopper_up_weight,需与服务器一致) + up_weight = data.get("hopper_up_weight", 0) + self.weight_dialog1.update_weight(up_weight) + + # 下料斗重量(对应字段 hopper_down_weight,需与服务器一致) + down_weight = data.get("hopper_down_weight", 0) + self.weight_dialog2.update_weight(down_weight) + + +if __name__ == "__main__": + import sys + app = QApplication([]) + window = MainWindow() + # window.show() # 显示主界面 + window.showFullScreen() # 全屏显示主界面 + sys.exit(app.exec()) diff --git a/system_nav_bar.py b/system_nav_bar.py new file mode 100644 index 0000000..35ed612 --- /dev/null +++ b/system_nav_bar.py @@ -0,0 +1,141 @@ +from PySide6.QtWidgets import (QWidget, QLabel, QHBoxLayout, + QSpacerItem, QSizePolicy, QPushButton) +from PySide6.QtGui import QPixmap, QFont, QPainter, QIcon +from PySide6.QtCore import Qt, QTimer, QDateTime + +# 自定义消息容器, 显示系统消息 +class MsgContainer(QWidget): + def __init__(self, parent=None): + super().__init__(parent) + self.setFixedSize(770, 24) + + # 加载消息区域背景图 + self.bg_pixmap = QPixmap("系统消息背景.png") # 替换为实际路径 + if self.bg_pixmap.isNull(): + print("警告:系统消息背景.png 加载失败") + + # 消息区域内部布局(喇叭+文本) + msg_layout = QHBoxLayout(self) + msg_layout.setContentsMargins(0, 0, 0, 0) # 调整内边距,避免内容贴边 + msg_layout.setSpacing(3) # 喇叭和文本的间距 + + # 消息喇叭图标 + self.msg_icon = QLabel() + self.msg_icon.setFixedSize(13, 18) + # self.msg_icon.setStyleSheet("background-color:red;") + self.msg_icon.setPixmap(QPixmap("系统消息喇叭.png")) # 替换为实际路径 + msg_layout.addWidget(self.msg_icon, alignment=Qt.AlignVCenter | Qt.AlignLeft) + + # 消息文本 + current_time = QDateTime.currentDateTime().toString("hh:mm:ss") + self.msg_text = QLabel(f"{current_time} 开始启动智能浇筑系统") + self.msg_text.setFixedWidth(740) + # self.msg_text.setStyleSheet("color: white; font-size: 14px;background-color:red;") # 文本样式 + self.msg_text.setStyleSheet("color: white; font-size: 16px;font-weight:Bold;") + self.msg_text.setAlignment(Qt.AlignLeft | Qt.AlignVCenter) + msg_layout.addWidget(self.msg_text) + + # 关闭按钮 + self._create_close_button(msg_layout) + + def _create_close_button(self, parent_layout): + self.close_btn = QPushButton() + self.close_btn.setFixedSize(20, 20) + + close_icon = QPixmap("关闭图标.png") + if not close_icon.isNull(): + self.close_btn.setIcon(QIcon(close_icon)) + + self.close_btn.setStyleSheet( + """ + QPushButton { + background-color: transparent; + border: none; + padding: 0px; + } + QPushButton:hover { + background-color: red; + border-radius: 2px; + } + """ + ) + + parent_layout.addWidget(self.close_btn) + + def paintEvent(self, event): + # 绘制消息区域背景图 + super().paintEvent(event) # 确保子控件正常绘制 + if self.bg_pixmap.isNull(): + return # 图片加载失败则不绘制 + + painter = QPainter(self) + painter.setRenderHint(QPainter.SmoothPixmapTransform) # 缩放平滑 + painter.drawPixmap(self.rect(), self.bg_pixmap) + +class SystemNavBar(QWidget): + def __init__(self, parent=None): + super().__init__(parent) + # 设置尺寸 + self.setFixedSize(1280, 80) + + # 1. 加载背景图 + self.bg_pixmap = QPixmap("系统主界面导航栏.png") # 替换为实际图片路径 + if self.bg_pixmap.isNull(): + print("警告:背景图加载失败,请检查路径!") + + main_layout = QHBoxLayout(self) + main_layout.setContentsMargins(9, 9, 9, 19) + main_layout.setSpacing(100) # 注意:左侧的logo+系统标题的容器 和 系统消息的间隔 + + # 左侧区域:logo + 系统标题 + left_container = QWidget() + left_container.setFixedSize(400, 53) + left_layout = QHBoxLayout(left_container) # 容器内部的水平布局 + left_layout.setContentsMargins(0, 0, 0, 0) # 容器内边距 + left_layout.setSpacing(6) # 设置logo和标题之间的间隙为6px + # 系统logo + self.logo = QLabel() + self.logo.setFixedSize(53, 53) + self.logo.setPixmap(QPixmap("系统logo.png")) + left_layout.addWidget(self.logo, alignment=Qt.AlignTop) + # 系统总标题 + self.title = QLabel() + self.title.setPixmap(QPixmap("系统总标题.png")) + left_layout.addWidget(self.title, alignment=Qt.AlignCenter) + main_layout.addWidget(left_container, alignment=Qt.AlignTop) + + # 中间区域:系统消息(喇叭+文本+背景) + self.msg_container = MsgContainer() + main_layout.addWidget(self.msg_container, alignment=Qt.AlignBottom | Qt.AlignRight) + + # 右侧区域:实时时间 + self.time_label = QLabel() + self.time_label.setStyleSheet("color: white; font-size: 16px;font-weight:Bold;") + main_layout.addWidget(self.time_label, alignment= Qt.AlignTop | Qt.AlignRight) + + # 启动时间更新定时器 + self.timer = QTimer(self) + self.timer.timeout.connect(self.update_time) + self.timer.start(1000) # 每秒更新一次 + + def paintEvent(self, event): + super().paintEvent(event) + + painter = QPainter(self) + painter.setRenderHint(QPainter.SmoothPixmapTransform) # 缩放时平滑 + + painter.drawPixmap(0, 0, self.bg_pixmap) + + def update_time(self): + current_time = QDateTime.currentDateTime().toString("yyyy/MM/dd hh:mm:ss") + self.time_label.setText(current_time) + +# 测试代码 +if __name__ == "__main__": + import sys + from PySide6.QtWidgets import QApplication, QMainWindow + + app = QApplication(sys.argv) + nav_bar = SystemNavBar() + nav_bar.show() + sys.exit(app.exec()) \ No newline at end of file diff --git a/tcp_client.py b/tcp_client.py new file mode 100644 index 0000000..1a534c5 --- /dev/null +++ b/tcp_client.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +''' +# @Time : 2025/11/13 11:05 +# @Author : reenrr +# @File : tcp_client.py +''' +import json +from PySide6.QtCore import QTimer, Slot, Signal, QObject +from PySide6.QtNetwork import QTcpSocket, QAbstractSocket +from datetime import datetime + +# ----------- +# 参数配置 +# ----------- +tcp_server_host = "127.0.0.1" +tcp_server_port = 8888 + +RECONNECT_INTERVAL = 2000 # 重连间隔(毫秒) + +class TcpClient(QObject): + # 信号,用于向主窗口/重量弹窗发送最新重量数据 + weight_updated = Signal(dict) # 重量更新信号 + connection_status_changed = Signal(bool) # 连接状态更新信号 + + def __init__(self, parent=None): + super().__init__(parent) + + self.is_running = False # 系统运行状态标记 + self.latest_json_data = {} # 缓存服务端发送的最新JSON数据 + + self.statusWidgets = [] # 存储api_field + 对应的value标签 + + # --------------- + # TCP客户端核心配置 + # --------------- + self.tcp_socket = QTcpSocket(self) # TCP socket实例 + self.tcp_server_host = tcp_server_host + self.tcp_server_port = tcp_server_port + self.is_tcp_connected = False # TCP连接状态标记 + self.has_connected_once = False # 连接至服务器至少一次标记(区别首次连接和断开后重连) + self.reconnect_count = 0 # 重连次数计数器 + + # 重连定时器,每隔RECONNECT_INTERVAL毫秒重连一次 + self.reconnect_timer = QTimer(self) + self.reconnect_timer.setInterval(RECONNECT_INTERVAL) + self.reconnect_timer.timeout.connect(self._reconnect_to_server) # 绑定重连函数 + + # 绑定TCP信号与槽(事件驱动) + self._bind_tcp_signals() + + # --------------------- + # TCP连接相关函数 + # --------------------- + def _connect_to_server(self): + """主动发起连接(仅在未连接状态下有效""" + if not self.is_tcp_connected: + self.tcp_socket.abort() # 终止现有连接 + self.tcp_socket.connectToHost(self.tcp_server_host, self.tcp_server_port) + print(f"发起连接请求:{self.tcp_server_host}:{self.tcp_server_port}") + + def _reconnect_to_server(self): + """重连执行函数:仅在未连接且未达最大次数时触发""" + if not self.is_tcp_connected: + self.reconnect_count += 1 + # 日志优化:每10次重连提示一次,避免日志刷屏 + if self.reconnect_count % 10 == 0: + print(f"已连续重连{self.reconnect_count}次,仍未连接服务端,请检查服务端状态...") + else: + print(f"第{self.reconnect_count}次重连请求:{self.tcp_server_host}:{self.tcp_server_port}") + self._connect_to_server() + + def _bind_tcp_signals(self): + """绑定TCP socket的核心信号(连接、断开、接收数据、错误)""" + # 连接成功信号 + self.tcp_socket.connected.connect(self._on_tcp_connected) + # 断开连接信号 + self.tcp_socket.disconnected.connect(self._on_tcp_disconnected) + # 接收数据信号(有新数据时触发) + self.tcp_socket.readyRead.connect(self._on_tcp_data_received) + # 错误信号(连接/通信出错时触发) + self.tcp_socket.errorOccurred.connect(self._on_tcp_error) + + # ------------------ + # TCP客户端核心功能 + # ------------------ + @Slot() + def _on_tcp_connected(self): + """TCP连接成功回调""" + self.is_tcp_connected = True + self.has_connected_once = True + self.reconnect_timer.stop() # 停止重连定时器 + self.reconnect_count = 0 # 重连计数器清零 + self.is_running = True + print(f"TCP连接成功:{self.tcp_server_host}:{self.tcp_server_port}") + + # 发送连接状态信号 + self.connection_status_changed.emit(True) + # 连接成功后,向服务器发送“请求初始数据”指令 + self._send_tcp_request("get_initial_data") + + @Slot() + def _on_tcp_disconnected(self): + """TCP连接断开回调""" + self.is_tcp_connected = False + self.is_running = False + print(f"TCP连接断开:{self.tcp_server_host}:{self.tcp_server_port}") + + # 发送连接状态信号 + self.connection_status_changed.emit(False) + + # 发送重量清零信号 + self.weight_updated.emit({"hopper_up_weight": 0, "hopper_down_weight": 0}) + + if not self.reconnect_timer.isActive(): # 未启动重连定时器时才启动 + print(f"连接断开,将在{RECONNECT_INTERVAL / 1000}秒后启动重连...") + self.reconnect_timer.start() + + @Slot() + def _on_tcp_data_received(self): + """TCP数据接收回调(服务器发送数据时触发)""" + tcp_data = self.tcp_socket.readAll().data().decode("utf-8").strip() + print(f"TCP数据接收:{tcp_data}") + + # 解析数据 + try: + status_data = json.loads(tcp_data) + self.latest_json_data = status_data + self.weight_updated.emit(status_data) + except json.JSONDecodeError as e: + print(f"TCP数据解析失败(非JSON格式):{e}, 原始数据:{tcp_data}") + except Exception as e: + print(f"TCP数据处理异常:{e}") + + @Slot(QAbstractSocket.SocketError) + def _on_tcp_error(self, error): + """TCP错误回调""" + if not self.is_tcp_connected: + error_str = self.tcp_socket.errorString() + print(f"TCP错误:{error_str}") + self.is_tcp_connected = False + self.is_running = False + + # 发送连接断开信号 + self.connection_status_changed.emit(False) + + # 首次连接失败时,启动重连定时器 + if not self.reconnect_timer.isActive(): + print(f"将在{RECONNECT_INTERVAL / 1000}秒后启动重连") + self.reconnect_timer.start() + + def _send_tcp_request(self, request_cmd="get_status"): + """向TCP服务器发送请求指令""" + if not self.is_tcp_connected: + print("TCP连接未建立,无法发送请求") + return + + # 构造请求数据 + request_data = json.dumps({ + "cmd": request_cmd, + "timestamp": self.get_current_time(), + "client_info": "布料系统客户端" + }) + "\n" # 增加换行符作为数据结束标识 + + # 发送请求数据 + self.tcp_socket.write(request_data.encode("utf-8")) + print(f"TCP请求发送:{request_data.strip()}") + + # ------------------ + # 时间相关的通用方法 + # ------------------ + def get_current_time(self): + """获取格式化的当前时间""" + return datetime.now().strftime('%Y-%m-%d %H:%M:%S') \ No newline at end of file diff --git a/weight_dialog.py b/weight_dialog.py new file mode 100644 index 0000000..80f4ee3 --- /dev/null +++ b/weight_dialog.py @@ -0,0 +1,228 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +''' +# @Time : 2025/11/10 11:29 +# @Author : reenrr +# @Description : 重量显示界面,显示上料斗重量、下料斗重量 +''' + +from PySide6.QtWidgets import ( + QApplication, + QDialog, + QVBoxLayout, + QHBoxLayout, + QGridLayout, + QLabel, + QWidget, + QPushButton, +) +from PySide6.QtGui import QPixmap, QFont, QPainter, QIcon +from PySide6.QtCore import Qt, QEvent, QSize, QTimer, Slot +from PySide6.QtNetwork import QTcpSocket, QAbstractSocket +import sys +import json +from datetime import datetime + +class WeightDetailsDialog(QDialog): + """ + 上料斗、下料斗重量显示界面 + """ + def __init__(self, parent=None, title="上料斗重量" ): + super().__init__(parent) + self.setAttribute(Qt.WA_TranslucentBackground) + + self.digit_labels = [] #用于存储数字标签的列表 + self.default_icon_path = "选择_未实时.png" # 未连接图标 + self.connected_icon_path = "选择_实时.png" # 已连接图标 + self.check_label = None # 状态图标标签 + + self.is_running = False # 定时器是否运行 + self.latest_json_data = {} + self.statusWidgets = [] # 状态显示控件列表 + + self._init_ui(title) + + # ----------------------- + # 界面初始化函数 + # ----------------------- + def _init_ui(self, title): + self.setWindowFlags(Qt.FramelessWindowHint) + self._load_background() + + main_layout = QVBoxLayout(self) + main_layout.setContentsMargins(32, 20, 32, 50) + main_layout.setSpacing(0) + + # 1. 顶部区域(标题 + 关闭按钮) + self._add_top_area(main_layout, title) + + # 2. 状态显示+重量框 + self._add_state_weight_area(main_layout) + + def _load_background(self): + self.bg_pixmap = QPixmap("重量背景.png") # 修改为派单任务背景图 + if self.bg_pixmap.isNull(): + print("错误:重量背景.png 加载失败,请检查路径!") + self.setFixedSize(800, 500) + else: + self.setFixedSize(self.bg_pixmap.size()) + + def _add_top_area(self, parent_layout, title): + top_layout = QHBoxLayout() + top_layout.setContentsMargins(0, 0, 0, 36) + + top_layout.addStretch() + + title_label = QLabel(title) + font = QFont() + font.setPixelSize(24) + font.setLetterSpacing(QFont.AbsoluteSpacing, 2) + font.setBold(True) + title_label.setFont(font) + title_label.setStyleSheet("color: #13fffc; font-weight: Bold;") + title_label.setAlignment(Qt.AlignCenter) + top_layout.addWidget(title_label, alignment=Qt.AlignTop) + + # 关闭按钮 + top_layout.addStretch() + + parent_layout.addLayout(top_layout) + + def _add_state_weight_area(self, parent_layout): + grid_layout = QGridLayout() + grid_layout.setSpacing(12) + + weight_widget = self._create_info_weight() + grid_layout.addWidget(weight_widget) + + parent_layout.addLayout(grid_layout) + + def _create_info_weight(self): + # 1、创建最外层水平布局(容纳所有元素) + weight_layout = QHBoxLayout() + weight_layout.setContentsMargins(0, 0, 0, 0) + weight_layout.setSpacing(0) + + # 2、创建确认图标 + self.check_label = QLabel() + self._update_status_icon(False) + weight_layout.addWidget(self.check_label) + weight_layout.setSpacing(50) + + # 3、创建“6个数字单元格” + digit_font = QFont() + digit_font.setPixelSize(70) + digit_font.setLetterSpacing(QFont.AbsoluteSpacing, 2) + digit_font.setBold(False) + + digit_pixmap = QPixmap("数字.png") + digit_size = digit_pixmap.size() + + for i in range(6): + # 数字标签 + digit_label = QLabel("") + digit_label.setFixedSize(digit_size) + digit_label.setFont(digit_font) + digit_label.setAlignment(Qt.AlignCenter) + digit_label.setStyleSheet("color: white") + # 若图片存在,设置背景图片 + if not digit_pixmap.isNull(): + digit_label.setStyleSheet(""" + QLabel { + color: white; + background-image: url(数字.png); + background-repeat: no-repeat; + background-position: center; + } + """) + weight_layout.addWidget(digit_label) + self.digit_labels.append(digit_label) + if i < 5: + weight_layout.addSpacing(5) + + # 4、创建“kg”单位单元格 + unit_label = QLabel("kg") + unit_label.setFixedSize(digit_size) + unit_label.setFont(digit_font) + unit_label.setAlignment(Qt.AlignCenter) + if not digit_pixmap.isNull(): + unit_label.setStyleSheet(""" + QLabel { + color: white; + background-image: url(数字.png); + background-repeat: no-repeat; + background-position: center; + } + """) + weight_layout.addSpacing(5) + weight_layout.addWidget(unit_label) + + # 5、将主布局设置到父控件 + weight_widget = QWidget() + weight_widget.setLayout(weight_layout) + weight_widget.setObjectName("infoWeight") + return weight_widget + + def eventFilter(self, obj, event): + """ + 实现事件过滤器,动态修改右侧值颜色 + """ + # 只处理父控件(infoCell)的事件 + if obj.objectName() == "infoCell": + # 鼠标进入父控件 → 改#13f0f3 + if event.type() == QEvent.Enter: + if hasattr(obj, "value"): # 确保存在value控件 + obj.value.setStyleSheet("background: none; color: #13f0f3;") + # 鼠标离开父控件 → 恢复默认色 + elif event.type() == QEvent.Leave: + if hasattr(obj, "value"): + obj.value.setStyleSheet("background: none; color: #9fbfd4;") + return super().eventFilter(obj, event) + + def paintEvent(self, event): + if not self.bg_pixmap.isNull(): + painter = QPainter(self) + painter.drawPixmap(self.rect(), self.bg_pixmap) + super().paintEvent(event) + + def update_weight(self, weight_data): + """根据TCP获取的数据更新重量显示""" + # 更新6个数字标签(补零为6位,超过6位取后6位) + try: + weight_int = int(weight_data) + weight_str = f"{weight_int:06d}"[-6:] + except (ValueError, TypeError): + weight_str = "000000" + + for i in range(min(len(self.digit_labels), 6)): + self.digit_labels[i].setText(weight_str[i] if i < len(weight_str) else "0") + + def _update_status_icon(self, is_connected): + """根据连接状态切换图标""" + if not self.check_label: + return + icon_path = self.connected_icon_path if is_connected else self.default_icon_path + pixmap = QPixmap(icon_path) + if not pixmap.isNull(): + self.check_label.setPixmap(pixmap.scaled( + pixmap.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation)) + else: + print(f"错误:{icon_path} 加载失败,请检查路径!") + + # -------------------- + # 清空界面信息的通用方法 + # -------------------- + def _clear_ui_info(self): + """清空管片ID和网格信息""" + if self.id_value_label: + self.id_value_label.setText("") + for widget in self.statusWidgets: + widget['valueLabel'].setText("") + print("ℹ️ 界面信息已清空") + +# 测试代码 +if __name__ == "__main__": + app = QApplication(sys.argv) + dialog = WeightDetailsDialog() + dialog.show() + sys.exit(app.exec()) diff --git a/主界面背景.png b/主界面背景.png new file mode 100644 index 0000000000000000000000000000000000000000..dc65b12a12f9a5b9c756fea55721793913efeb90 GIT binary patch literal 2354 zcmbVOeQZ-z6fYlRA21fMf`V+%w>b*fzSp;|ACDC*>tx;5(QS>}h=5(+Tl==Que5Kp zD>$VXA|{A95S)xuCQ>Ka9|A@on+e1a5{P3~q9bA^L|`}|CL06;c<$@kfI*3zr0xCq z-QPLqch0@(7E9&w%#1l15{V?!RBEh-U#&zkS&}vpMvKFl9q^OxEv@%UBvYS3p9zwV zJTJ6giMN%X|Y6vAMrzo0K(}e}txZ&W<$28K_ z##hIE!Ay@k1;I-bL?94Q1PT1Y1z<@#iKOjI7`8yMsOduE$w0Q}ofSc*)*3Y;2>}<(8 z2s0OD*2aLMeu8Hq$1LU$A-XtjVayK^z6g zF?3<0M#B_pD7jjrQ^_f?Lyn^=o;v8JE}j+;N#2OQ!5as4LDgK{g1wg z!~A@s5U}}Jg9FrhV&4%EJb^B3JP+cZDT;d!UG4-NUJNu$K2WrbcQi)Q9nPo|E>*6%K=i1c*`$BnSiTjm+WfnyZU{RyU~G7q1}0irF*DcOmf5|W;px8-imyb@qu?mtqkVR zC!XrODFchnSO{A5fBaW;Y%&~d%GrrlWziZVI_bWH^k@b2pX=`mZ&x$*A~mEPUC~0_ik8jFdUf=(-D&>q9@;S zsEs^~bRNsADo+=^&p`Cu+ZOg-s@yl&9*@~zaNOwnXr{6TW1GdE82+YRbeowYm8wp4KzHO? zQTn4*qTt!TR@_DVV9`rGmpiU3M!}WAdF%RWsJX>b8y)y$6iJoQM44is0a`q?I-vu7 zV@Ec01h@w~vZFM1HV+V)YZC2e(TF*2wTOA3a?cBtWpxiB0Y$sN2R~ngIQuQ_r>CZ& z5!jWlM2W-4uD=AHho#%&F{1CQL%;ozG8v7W2Txz#IUS84_~|I=!zWPxUx?QS=vS7( z^#DuVYI&H{t3N3xYBpBh?R+_Jr}Rw1D-n#auc4&HE0)HI^24Gm%5>= z+|zeU8e<(j61r?o%hp~j^Gn%a@ACL`6Gxb9og%;SM5&ZS-y=;~5yF{{L2*XOzAoRr z-fR{8d1}4u664j)@o%=dZSk+-=l)8VEO%v@oj9)U!c1gJYD@<);T3K0RY{-S^oe4 literal 0 HcmV?d00001 diff --git a/底部背景.png b/底部背景.png new file mode 100644 index 0000000000000000000000000000000000000000..3a66c09eecf9e9bc4d85a3f6f8e7a2a4755c7c56 GIT binary patch literal 14745 zcmdse`9GB3`#%Ylki4QHrYI^Tre?BJmI|Q|DZ3eE#$;cIqJv?sH$)<388(dYms(DUnlbY;3#_ z?rT40W8?h$$aePx*Wc?2g8&E{+eNkq+FGW*DJv*MfvkR_x%Qwsiko(?e#}mnY7R>g zc&DXpXMAQOd+d;l#hZO7z?zp|D3J*1%LqH&c>*CLhaU6Zsht~#rnr*E6Y!+s!e@Ik z^ulrp0z+wMxmujOoZlI?EhHmhu3Z$lJi+Q6IQ9N+rt#H({`c({@pmS*{QrLQx83(= z9&f|{``z6?oY`PDo_|RTM^f2j|Btf&5wX7cilg-33LF1FSGbz*_AlGmmaImBqS6xD zRxz3yR9^0_nvU7o+p7;z^H{^@N{JJ7@)XBXfML-ac>Kh8|C#L*um2w}yZa}!rDhLO zdw5XYpIZ|AddSJE+gd|Bs&!(IwzgAU4e4jGfwSnTVH>P%J!1|FAA(T z+KnGnAML>=-gedlkdRU4*v9Un)x>V?e*cEd3Tfh?84EmGt~cD_NB)M6YJ(Yy7=LS_ z$s9usO(!;?|IOF`p;(>jO-%67%sP>zt^_+Q0xvPg{;ckfOdN!I&?ZX6t%ElwY)}Iu zN_1pPjaF{=LIil7{4)rm^WTbYz3Hq^7pWDd1h7_pcNV9S2VQY|JGqUR;N`BGQ~l$u z{&8C)mN^~&W_e9u*xzm>8G=6V?SwuBZr|IVzdj^M4C@CU@4i zRbefFqyy{(BLJ8z?T>4fBOI)oIIXQT&{_X2`8=$W)oqIju4jiGj;YN7 zP@!Snr=Qmve^vbVm?SSWaWsxaRtz2PDbd$*wMk1OK_#%mE=+JVav$*s3T!F@pEAp_ z`Jg^t@?TsaHr4EL!wxA)UNy~srIBUT)f3Lcprds}JqbN%6_$$DtGE;<8Y=AnUwrd* z`-{oMThNivyie=X67|EDHEd_ShGEJc^7%X=UfCA&~fe?Q|#2*DyirP_lu!n50i)MCx*3s?uy6m!LD79j@O%cl)W8 z>7go6dZBDubb929nvHno%2>2#N8hJo_S+T)k}MyI9T2|saHV}TEY-wSwh4dy5mcaY z@oM$O+R&f0_S@_l<;Hg2PEO|$I<3cqA6bF*;O9b@YztXwRnJa+ZLr=!4e&Nt>NyhWoyd-M57^9>1I^a@{i6Z$ zqg-fS{B!W$;WjlC9coguJ#RDdWffRAUJTo%?6VH+ssd3SN5V8j{kZD<2D*jMthKtB zc8@eJo47{|Wy+p$V$*%w6s7>u#SM#KE>gv;1Z}?<;CNn|W=<>Z=NT)s6612VmFP6%G3RU>%i7mks1U_dWH4bx3jfx21$A?C1YPn|mWm4TqaUxzvbnhr zVoCSa{rDah?V=XujZ^5V#p!UXOP98D;6}pR=$c#0zs$uBd?e~#OJH@-xcFhm*eL#6`0XgUk3pZ9-Z8uiu}here^zKV>Ed-kswt}@PyHbety|*h zJJOg{V36TBBSN+IPIzVn!xYCe{oT`%t`x;Vd>8;?tKZLVWBe;~_(h*OAg=+_Cm8!Y z_-l!Koeki%*V9FfIl0tM=!EFNQ*7jqy*b3t)HZTWAt?3VVbHfE8FG{}oF2UMpCH5P zK-P85I9R&LijIx=KA~jER>wLmF=X}TU-=JE_Tt~+H@wx8f5r`- zAeV>Vxhc~lL9l}@5VBR^FOCOjUs#yhd4XgP3Ow01VY<@>`*ymT)B$~YUD=wl^I}!# zKyL-qL66XMDTuOx2Cc;n35jhyjaFkFq7twggtx*kOYaS=l-Ev6KeDw*`W6Y>Y6>mV zo4+(448r|wAnU_1GVnn;LhZB;&>crjvx18CLG5L~MfF$aUB41V#O zYDPG4qWAOUaxdNc|PR9Iopt1jV zoU}f&Xkdw?k*bbjg+H-Im+&Zt2aVjfnp86%T9WR#5oxYpcJ#3L}ydY1xER0-If}3fvRY!bzuz9_JU&SK0FUZO{P+;5tDMCFzNpCt4Wsk&; zw7WYR_&vfXre{z73=e->JE-)zNhVs+ab8#O%5;}dqj8ls{;Ps%^UtHf>vKx2+>1^~pPm4kL03 zi%BQo91L$$hSc;4a$O;spqQ^dgWex&D{=;B#%-z@se7$lw!ZrIfKcIt{ct|ccHe16 zFTEwGxdTtW#xa;q*1wmW0;rV;fYR_`-on_)@trvl9z_TA7d;7^NU$C`Il^;U?RNUJ zbaUh|lnKqCiAUdmsH+M!?8hA$d=)}(t2 zj&@h9ARaQEp1DfcK!U9&OTDJ_f?oY`^(!YZ0M*Y_R$^n@m*2J*d*bkfNg~guAKm)m z)>xfwOpUpD{6|i^wrrIuC(n+=pXU_c`kRYiD9P3|AJj>E6^a|dT@4W{V2)fqbWzSZ-e;T?qu;NJSoQ-7In#fR-i%F`pW=BW-H^GI3L9F4AwNJX|HPF~ z3juUru9llr9NyP#SVRv@NTlo0U+kKIlN(Ro=sy&aou9z}0YAHOPr85A(ysBQD0kZi$qoa=H{;qYQn532J?OwI+U$ zpZ2FKBr9?>+j~0%iWF>#1zM#⪙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 t#^p!H2f}$`LJTOu$HC@O1TaS?83{1OVnNuGRnm literal 0 HcmV?d00001 diff --git a/系统logo.png b/系统logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e50db7328fdf3b83da3565461df467c43fade506 GIT binary patch literal 2158 zcmV-!2$A=RP)y^5E!yp{GRj9n|tqjzx$cr z`Q6|9-S-qi2!5bA;8|cU5CypX@Pa{BCr}0C0~>*FubEB)?mj$(5FZF3Y~uEj#Ii{U z;dO=ciig!e9&qoE>`hm70C)f}E4y!a_cn%=G^d+U_HZn40#N<`xo#*MFiG<8@}B@K z-Hgj650?Yu2g0J=WhIlh;c5+1kMZ_EEZU(M@Hwn287rW5%>N`BD$h!F$#Wh-I5lP~UVJi`ilB&3B5> zgsKSe_aGrQoTQlpvP5L{%flU=MqdA;mWN(0q`IM<;6NX_-`fiU0(|K**?DhsB@35n zdF>4?Mw6xAz*3fQDkfaf2V3^@Nxp%}Lm?$Ol&Mp~_)nRE1zXB7XQap${*`lphkr4L zgN0}KM`k&t9gsSE2+uw-ug}1J3W+DyXenxjEvsUgF-?OIR_beYSgm$>yx_<=Ufx(r zm>a}SILoZN$H_-QQ3X$Ks-)zkmcOT`^a=QuLt@EFEoYjcJR?Phl~h;XB9&1nRSt7s z<(E?oq^(KBTdhE+YmobsW{jsYBZcx-cyyI^@PXglkV{!76l7fM9fd*;uAa89ucv(0 z>pM`nyP;5CJI$et6iyfu|M58{=B7ChN8!q{0AhT+XZ&J6`vuV zPWR+*n9D~e;B-ax-~g}RP{NBdy$B2#;xtxPb^(boEFws58#>JLIWjUx{v)T$E;`*4 z6zIzf)77kd>-fL}msQr#V1~4(?{^wIexd?{p^cEx(fnq8f!vo6;{Z>4?GU3PG_}aF5%9xj^76hOYl%BQMr3!>@p%0g8T3L z8H<)_*$@0K9zuL<{B}J2xdI+prscDY6u!(nenHDJI4RvM_npt$5g3YB!jF z&jddI@+2$r8Zpu+U!#(%>QnOXmnOi{WDSv;XjCdCw&4Lh^@tJm?kdvHLBKP4a{Sq^ zV_yoOW*`*!Jd~DBM zDwT?flP0m))J06Rfy!^YaQ9cqtHy4%5fJQ)0(VYVv~aKq7Kgy%C6l--A+m447K@Fi z*5;Dg>S*s=y$>mQX}VXc9U(`ev~OwYXd}>D&FHaR-6_r?W5;DK>AU!*po?MysB3I; zzm!8pVBpIw3s9)sc!MUYGk-SeN<0lQ#0#7ZjjqMmyP4$xzS{0 zeNA8WP+>^Q0}o@d5n$9}f0-6)@vrbco8%vq9VCE(%Vymfr_?ZYfeRN-}i5{PA|7rN=H!E*6Zc0;ihta?UAvwfYT=U{py7-!*VOY z3Z;T=Y4JS2tB%9P=dKwun=EpL=I!Mnw=EWPH@Fh3&5qS}?W!s~c9s`*H^jPV_sjU~ z$!HQ|Z~TzBuKMy~wctpFh)K;6kFCrR)jGXnVVXL{(iJ)4Z`%%t^WW9Wi*C>Ua?#RQ zBaiE9TSV&9IbvdJjwmWV--Jt&7tU)ASb^A&wx-Nd%-hqzb;z5!q~L2Z-cWpnYm zyQrrgFHfzra_kv(rpXot~oN3vyMbef$n)Civq&bmTxyAul@9 zKpFG)Rx?gBf(he>%k7|`0QCAcbhY&ZHHG{J-u3;7iy9ps#AqOW;}Ohe3&BBw17-Sx z1iW{kfrkeNP?$c4duO^4Juc?DPq{v7uN1=*L9SDN3ZD!TBoCJYn{ET3n@M6Uz526P zE^yy%3cC-OfAwcC>ESO`A@9qZxZ6ik7<>pk*v;7UVex9kbbncrKIDy&N`oI6U#d-| k%q1m*kEQoGJtM$>0a@j)Og_BNNB{r;07*qoM6N<$g3j6~DF6Tf literal 0 HcmV?d00001 diff --git a/系统主界面导航栏.png b/系统主界面导航栏.png new file mode 100644 index 0000000000000000000000000000000000000000..7db6d8b2ef44ce7e7a48a1a5f6c6ce574611d7df GIT binary patch literal 23632 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 literal 0 HcmV?d00001 diff --git a/系统总标题.png b/系统总标题.png new file mode 100644 index 0000000000000000000000000000000000000000..64f34be3e06c40a65fd53ea4f523cebbfe4850e2 GIT binary patch literal 6262 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 BcfbGu literal 0 HcmV?d00001 diff --git a/选择_实时.png b/选择_实时.png new file mode 100644 index 0000000000000000000000000000000000000000..0599656c4e20311f027f09de20b222098c609875 GIT binary patch literal 2616 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 Ef_fg=2LJ#7 literal 0 HcmV?d00001 diff --git a/重量背景.png b/重量背景.png new file mode 100644 index 0000000000000000000000000000000000000000..41d07972c1c4bcf74400dc78d24356785a4a69c3 GIT binary patch literal 18021 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 V3K8x{9d#b#+t6D@H-CQgzW^m7Bxe8s literal 0 HcmV?d00001