from PySide6.QtCore import QTimer, Signal, QObject # 导入Qt核心类 from PySide6.QtWidgets import QApplication # 用于获取主线程 import threading from hardware import transmitter from view.main_window import MainWindow from .camera_controller import CameraController from .bottom_control_controller import BottomControlController from hardware.transmitter import TransmitterController from hardware.relay import RelayController # 定义信号类(用于后台线程向 UI主线程传递数据) class Signals(QObject): weight_updated = Signal(int) # 传递上料斗重量 class MainController: def __init__(self): # 主界面 self.main_window = MainWindow() # 1. 用于更新下料斗夹爪角度的QTimer self.timer_angle = QTimer() self.timer_angle.setInterval(1000) # 1秒触发一次 self.timer_angle.timeout.connect(self._onTimer2) # 连接到角度更新函数 self.timer_angle.start() # 下料斗夹具角度相关参数 self.angle = 10 self.max_angle = 60 self.min_angle = 10 self.is_add = True # 2. 用于更新重量的 QTimer self.timer_weight = QTimer() self.timer_weight.setInterval(2000) # 2秒触发一次 self.timer_weight.timeout.connect(self._read_weight_in_background) self.timer_weight.start() # 信号实例(用于后台线程传递数据到主线程) self.signals = Signals() self.signals.weight_updated.connect(self._update_upper_weight) # 主线程更新UI # 初始化子界面和控制器 self._initSubViews() self._initSubControllers() def _read_weight_in_background(self): """在后台线程中读取重量""" def weight_task(): loc_tra = TransmitterController(RelayController()) # 上料斗重量 (目前只有上料斗安装变送器, 可以读取到重量) upper_weight = loc_tra.read_data(1) # 发送信号到主线程更新UI if upper_weight is not None: self.signals.weight_updated.emit(upper_weight) # 启动后台线程执行重量读取操作 threading.Thread(target=weight_task, daemon=True).start() def _update_upper_weight(self, weight): """主线程中 更新界面上料斗重量数据""" self.main_window.hopper_widget.setUpperHopperWeight(weight) def _onTimer2(self): """QTimer触发的 料斗夹爪角度更新""" if self.is_add: self.angle += 1 else: self.angle -= 1 if self.angle > self.max_angle: self.is_add = False self.angle = self.max_angle if self.angle <= self.min_angle: self.is_add = True self.angle = 10 # 直接更新UI self.main_window.hopper_widget.setLowerHopperOpeningAngle(self.angle) def showMainWindow(self): self.main_window.showFullScreen() self.main_window.dispatch_task_widget.set_task_time("task1","15:44 PM") self.main_window.dispatch_task_widget.set_task_time("task2","17:37 PM") self.main_window.segment_task_widget.set_task_time("task1","15:38 PM") self.main_window.segment_task_widget.set_task_time("task2","17:24 PM") def _initSubControllers(self): self.camera_controller = CameraController( video_view=self.main_window.vibration_video ) self.bottom_control_controller = BottomControlController( bottom_control_widget=self.main_window.bottom_control_widget, main_window=self.main_window ) def _initSubViews(self): pass