class MainWindow(QMainWindow): def __init__(self) -> None: super().__init__() self.ui = MainWindowUI() # action self.action_run = QAction(parent=self, text="Run") self.action_stop = QAction(parent=self, text="Stop") self.action_run.triggered.connect(self.start_plot) # type:ignore self.action_stop.triggered.connect(self.stop_plot) # type:ignore self.action_run.setEnabled(False) self.action_stop.setEnabled(False) # setup ui self.ui.setup_ui(self) self.ui.port_combobox.currentTextChanged.connect( self.change_port_combobox) # setup toolbar self.addToolBar(self.ui.toolbar) self.ui.toolbar.addAction(self.action_run) # type:ignore self.ui.toolbar.addSeparator() self.ui.toolbar.addAction(self.action_stop) # type:ignore self.ui.toolbar.addSeparator() self.ui.toolbar.addWidget(self.ui.port_combobox) def start_plot(self): self.action_run.setEnabled(False) self.action_stop.setEnabled(True) try: port = self.ui.port_combobox.get_current_port_info().device with serial.Serial(port, 9600, parity=serial.PARITY_ODD) as ser: ser.close() ser.parity = serial.PARITY_NONE ser.open() time = 0 while self.action_stop.isEnabled(): time = time + 0.1 analog_value = ser.readline().decode().rstrip() voltage = float(analog_value) * 5 / 1024 self.ui.graph_voltage.curve.append_data(time, voltage) except Exception as e: QMessageBox.critical(self, "ERROR", str(e)) self.action_run.setEnabled(False) self.action_stop.setEnabled(False) def stop_plot(self): self.action_run.setEnabled(True) self.action_stop.setEnabled(False) def change_port_combobox(self) -> None: if self.ui.port_combobox.get_current_port_info() is not None: self.action_run.setEnabled(True)
class MainWindow(QMainWindow): def __init__(self) -> None: super().__init__() self.ui = MainWindowUI() # action self.action_run = QAction(parent=self, text="Run") self.action_stop = QAction(parent=self, text="Stop") self.action_run.triggered.connect(self.start_plot) # type:ignore self.action_stop.triggered.connect(self.stop_plot) # type:ignore self.action_run.setEnabled(False) self.action_stop.setEnabled(False) # setup ui self.ui.setup_ui(self) self.resize(1100, 600) self.move(50, 50) self.ui.port_combobox1.currentTextChanged.connect( self.change_port_combobox1) self.ui.port_combobox2.currentTextChanged.connect( self.change_port_combobox2) self.ui.btn_clear_monitor1.clicked.connect( self.clear_monitor1) # type:ignore self.ui.btn_clear_monitor2.clicked.connect( self.clear_monitor2) # type:ignore # setup toolbar self.ui.toolbar.addAction(self.action_run) # type:ignore self.ui.toolbar.addSeparator() self.ui.toolbar.addAction(self.action_stop) # type:ignore self.ui.toolbar.addSeparator() self.ui.toolbar.addWidget(self.ui.baudrate_combobox) self.ui.toolbar.addSeparator() self.ui.toolbar.addWidget(self.ui.port_combobox1) self.ui.toolbar.addSeparator() self.ui.toolbar.addWidget(self.ui.port_combobox2) def start_plot(self): self.action_run.setEnabled(False) self.action_stop.setEnabled(True) try: port1_info = self.ui.port_combobox1.get_current_port_info() port1 = port1_info.device if port1_info is not None else port1_info port2_info = self.ui.port_combobox2.get_current_port_info() port2 = port2_info.device if port2_info is not None else port2_info baudrate = self.ui.baudrate_combobox.currentText() with Serial(port1, baudrate) as ser1, Serial(port2, baudrate) as ser2: while self.action_stop.isEnabled(): if port1 is not None: data = ser1.readline().decode().rstrip() self.ui.monitor1.appendPlainText(data) if port2 is not None: data = ser2.readline().decode().rstrip() self.ui.monitor2.appendPlainText(data) QApplication.processEvents() except Exception as e: QMessageBox.critical(self, "ERROR", str(e)) self.action_run.setEnabled(False) self.action_stop.setEnabled(False) def stop_plot(self): self.action_run.setEnabled(True) self.action_stop.setEnabled(False) def change_port_combobox1(self) -> None: port_info = self.ui.port_combobox1.get_current_port_info() if port_info is not None: self.action_run.setEnabled(True) self.ui.group_monitor1.setTitle(port_info.device) def change_port_combobox2(self) -> None: port_info = self.ui.port_combobox2.get_current_port_info() if port_info is not None: self.action_run.setEnabled(True) self.ui.group_monitor2.setTitle(port_info.device) def clear_monitor1(self) -> None: self.ui.monitor1.clear() def clear_monitor2(self) -> None: self.ui.monitor2.clear()