From 5977b29a9cf8e805ebe0a5c4ce0c454ca5a665f7 Mon Sep 17 00:00:00 2001 From: zhu-mengmeng <15588200382@163.com> Date: Sat, 7 Jun 2025 14:10:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=BB=A5=E6=94=AF=E6=8C=81=E7=9B=B8=E6=9C=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E5=88=A0=E9=99=A4=E6=97=A7=E7=9A=84YAML?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=EF=BC=8C=E4=BF=AE=E6=94=B9=E4=B8=BB=E7=AA=97?= =?UTF-8?q?=E5=8F=A3UI=E4=BB=A5=E9=80=82=E5=BA=94=E6=96=B0=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E6=B7=BB=E5=8A=A0=E7=9B=B8=E6=9C=BA=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=92=8C=E8=AE=BE=E7=BD=AE=E7=9A=84=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/app_config.json | 9 +- config/application.yaml | 5 - ui/__pycache__/main_window_ui.cpython-310.pyc | Bin 15939 -> 16342 bytes ui/main_window_ui.py | 29 +++-- .../__pycache__/main_window.cpython-310.pyc | Bin 6351 -> 7400 bytes widgets/main_window.py | 105 ++++++++++++------ 6 files changed, 98 insertions(+), 50 deletions(-) delete mode 100644 config/application.yaml diff --git a/config/app_config.json b/config/app_config.json index bd9d635..25b7a77 100644 --- a/config/app_config.json +++ b/config/app_config.json @@ -4,7 +4,8 @@ "version": "1.0.0", "features": { "enable_serial_ports": false, - "enable_keyboard_listener": false + "enable_keyboard_listener": false, + "enable_camera": false } }, "database": { @@ -15,5 +16,11 @@ "user": "", "password": "", "name": "" + }, + "camera": { + "enabled": false, + "default_exposure": 20000, + "default_gain": 10, + "default_framerate": 30 } } \ No newline at end of file diff --git a/config/application.yaml b/config/application.yaml deleted file mode 100644 index 37e2a29..0000000 --- a/config/application.yaml +++ /dev/null @@ -1,5 +0,0 @@ -app: - debug: true - name: jt-mes-system - version: 1.0.0 - description: 佳腾管理系统 diff --git a/ui/__pycache__/main_window_ui.cpython-310.pyc b/ui/__pycache__/main_window_ui.cpython-310.pyc index 735750309d64c0a8e543db1d2ca37573ade3ea92..463356674f0d3004bffa11732828289a26a7d67a 100644 GIT binary patch delta 3918 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 delta 2593 zcmaJ@Yit`u5Wc;)&-VEdJ8_!Qrj(!>+9VC6q7V>}mO=|@B@mTPRF?4`!RF2mdlwLu zqX7q6j4Tfdu6T65_SE24EL=jN?E5w;05 zMvcb>YS@`M$?B%$PN5h-@WXf6r@<;)um}|_krGRytNBsl8&3+dU}Zt5pO1>8;*SD% z#O<@bPUSh$6iTtCP>ThIAFm}26Cy;jBvm@J8KjVdGe12CtECLgGZ8n7T#CG|rV!+i z-`SN3@>FfpLHA(+wFW&@i?kGiUaB`!;;X_Tv8@11i}91v;3d-q@L=J@GpApCx%KRP z|Azk4uRM18V9~nQkjV4a0T@JG`sz}F7`jOk#3Z_85>-w}36-a`b^Q8R zlK6Z_Y%*U<2jW?OsQ?a;iDH&7#7?C{vr=|#RxZ)1H|3Nc;olfT*A3vgcu*UPK!vGF zqh7Zwe#xs&*2|7}3otzsAT6dzT7m)JoW$3~H+7!?HXJ7egp$q`ivi(&eC@16wK=jy z*t2p*^d+j(*qjKn+>GSQP0|#5g(h$dLa#7KW@ONz1Zq=kN=^ANz7lv-Fg$D>CNU(gq(+`MW3vv-(M&2#!zQ0ZB^GgNVj#ha+_`s* z9L_ssRTFAjG}k-pP{OEZX%;^_^AkbxJjbT9aOUZkPM&#d{@2uzlV?6ZvUvF8#Y1lt zP1eu1q}QrfzNd1y~DcFw^gpn+{c*ouIa!?q#F0AajZzpugE zvR`e~FBptLka`M+rvn%w)Yw?A!1rWV5s&Z74DtQhjbsP^GTS!{S^KZMsGQx7aG?kf z!NLptuk4MRhJm_(f7nOGK#9Ck1Fb1gkxE#ERE7#t_@iAn%$#(?r{A3@>gU+9>;{&czqoy9)hjSMP8*Uzvf|#JJIdAi?rNPj9v-~E%y;H4 zTYvd~%nziYJKuOiDB0b6IHL&>9jTtHP`mM@}#}IKCc4NqsQ#- zJlVCRDk^;|S-C*ngLFILCXl)VVJE_}s=pO@$N9HCe7i^iabi J1kX@T`UkCZH7fuB diff --git a/widgets/main_window.py b/widgets/main_window.py index bc27b86..6d341cb 100644 --- a/widgets/main_window.py +++ b/widgets/main_window.py @@ -1,6 +1,7 @@ import os import sys import logging +import json from datetime import datetime # 导入PySide6 @@ -31,10 +32,21 @@ class MainWindow(MainWindowUI): if user_name and corp_name: self.setWindowTitle(f"腾智微丝产线包装系统 - {user_name} ({corp_name})") + # 加载配置文件 + self.config = self.load_config() + self.camera_enabled = self.config.get('camera', {}).get('enabled', False) - # # 创建相机显示组件并添加到上料区 - # self.camera_display = CameraDisplayWidget() - # self.material_content_layout.addWidget(self.camera_display) + # 只有在相机启用时创建相机显示组件 + if self.camera_enabled: + # 创建相机显示组件并添加到上料区 + self.camera_display = CameraDisplayWidget() + self.material_content_layout.addWidget(self.camera_display) + else: + # 在上料区添加占位标签 + self.material_placeholder = QLabel("相机功能已禁用") + self.material_placeholder.setAlignment(Qt.AlignCenter) + self.material_placeholder.setStyleSheet("color: #888888; background-color: #f0f0f0;") + self.material_content_layout.addWidget(self.material_placeholder) # 为下料区添加占位标签,确保它保持为空 self.output_placeholder = QLabel("下料区 - 暂无内容") @@ -54,7 +66,7 @@ class MainWindow(MainWindowUI): self.setCentralWidget(self.stacked_widget) # 连接信号和槽 - # self.connect_signals() + self.connect_signals() # 默认显示主页面 self.stacked_widget.setCurrentIndex(0) @@ -67,6 +79,18 @@ class MainWindow(MainWindowUI): logging.info(f"主窗口已创建,用户: {user_name}") + def load_config(self): + """加载配置文件""" + config_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "config", "app_config.json") + try: + with open(config_path, 'r', encoding='utf-8') as f: + config = json.load(f) + logging.info(f"已加载配置文件: {config_path}") + return config + except Exception as e: + logging.error(f"加载配置文件失败: {e}") + return {} + def connect_signals(self): # 连接菜单动作 self.main_action.triggered.connect(self.show_main_page) @@ -78,14 +102,15 @@ class MainWindow(MainWindowUI): self.start_button.clicked.connect(self.handle_start) self.stop_button.clicked.connect(self.handle_stop) - # 连接相机显示组件信号 - self.camera_display.signal_camera_status.connect(self.handle_camera_status) + # 只有在相机启用时连接相机信号 + if self.camera_enabled and hasattr(self, 'camera_display'): + self.camera_display.signal_camera_status.connect(self.handle_camera_status) def initialize_data(self): """初始化界面数据""" # 设置订单和批号 self.order_edit.setText("ORD-2025-001") - self.tray_edit.setText("BAT-2025-001") + self.tray_edit.setCurrentText("托盘1") # 初始化项目表格数据示例 project_data = [ @@ -96,8 +121,8 @@ class MainWindow(MainWindowUI): ] for row in range(4): - for col in range(1, 5): # 从第2列开始(跳过项目列) - item = QTableWidgetItem(project_data[row][col-1]) + for col in range(0, 4): # 从第2列开始(跳过项目列) + item = QTableWidgetItem(project_data[row][col]) # item.setTextAlignment(Qt.AlignCenter) # 设置文本居中对齐 self.project_table.setItem(row, col, item) @@ -112,36 +137,40 @@ class MainWindow(MainWindowUI): def show_main_page(self): self.stacked_widget.setCurrentWidget(self.central_widget) - # 如果相机已连接,直接开始显示相机画面 - if self.camera_display.camera_manager.isOpen: - if not self.camera_display.camera_manager.isGrabbing: - self.camera_display.start_display() + # 只有在相机启用时处理相机显示 + if self.camera_enabled and hasattr(self, 'camera_display'): + # 如果相机已连接,直接开始显示相机画面 + if self.camera_display.camera_manager.isOpen: + if not self.camera_display.camera_manager.isGrabbing: + self.camera_display.start_display() logging.info("显示主页面") def show_settings_page(self): - # 延迟创建相机设置组件 - if self.camera_settings is None: - self.camera_settings = CameraSettingsWidget() - # 连接相机设置信号 - self.camera_settings.signal_camera_connection.connect(self.handle_camera_connection) - self.camera_settings.signal_camera_params_changed.connect(self.handle_camera_params_changed) - self.camera_settings.signal_camera_error.connect(self.handle_camera_error) - # 添加到堆叠部件 - self.stacked_widget.addWidget(self.camera_settings) + # 只有在相机启用时才创建相机设置组件 + if self.camera_enabled: + # 延迟创建相机设置组件 + if self.camera_settings is None: + self.camera_settings = CameraSettingsWidget() + # 连接相机设置信号 + self.camera_settings.signal_camera_connection.connect(self.handle_camera_connection) + self.camera_settings.signal_camera_params_changed.connect(self.handle_camera_params_changed) + self.camera_settings.signal_camera_error.connect(self.handle_camera_error) + # 添加到堆叠部件 + self.stacked_widget.addWidget(self.camera_settings) + + # 切换到设置页面 + self.stacked_widget.setCurrentWidget(self.camera_settings) + else: + # 如果相机未启用,显示提示信息 + QMessageBox.information(self, "设置", "相机功能已在配置文件中禁用,无法打开相机设置页面。") - # 切换到设置页面 - self.stacked_widget.setCurrentWidget(self.camera_settings) logging.info("显示设置页面") def handle_input(self): """处理上料按钮点击事件""" logging.info("上料按钮被点击") - # 如果相机已经配置,则开始显示 - if self.camera_display.camera_manager.isOpen and not self.camera_display.camera_manager.isGrabbing: - self.camera_display.start_display() - QMessageBox.information(self, "操作提示", "开始上料操作") # 这里添加上料相关的业务逻辑 @@ -155,9 +184,11 @@ class MainWindow(MainWindowUI): """处理开始按钮点击事件""" logging.info("开始按钮被点击") - # 开始显示相机画面 - if self.camera_display.camera_manager.isOpen: - self.camera_display.start_display() + # 只有在相机启用时处理相机显示 + if self.camera_enabled and hasattr(self, 'camera_display'): + # 开始显示相机画面 + if self.camera_display.camera_manager.isOpen: + self.camera_display.start_display() QMessageBox.information(self, "操作提示", "生产线已启动") # 这里添加启动生产线的业务逻辑 @@ -166,8 +197,10 @@ class MainWindow(MainWindowUI): """处理暂停按钮点击事件""" logging.info("暂停按钮被点击") - # 停止显示相机画面 - self.camera_display.stop_display() + # 只有在相机启用时处理相机显示 + if self.camera_enabled and hasattr(self, 'camera_display'): + # 停止显示相机画面 + self.camera_display.stop_display() QMessageBox.information(self, "操作提示", "生产线已暂停") # 这里添加暂停生产线的业务逻辑 @@ -206,8 +239,10 @@ class MainWindow(MainWindowUI): def closeEvent(self, event): """窗口关闭事件""" - # 停止相机显示 - self.camera_display.stop_display() + # 只有在相机启用时处理相机关闭 + if self.camera_enabled and hasattr(self, 'camera_display'): + # 停止相机显示 + self.camera_display.stop_display() # 接受关闭事件 event.accept() \ No newline at end of file