import time from PyQt6 import QtCore, QtGui, QtWidgets from ui import Ui_Controller import controller.controller_reifined as controller class Window(QtWidgets.QMainWindow): def __init__(self): QtWidgets.QMainWindow.__init__(self) self.ui = Ui_Controller() self.ui.setupUi(self) # controller self.controller = controller.ControllerInterface(controller.ControllerRefined(0xFFFFFFFFFFFF, 0x112233445542)) # dev selection self.hoverFilter = self.ComboBoxHoverEventFilter(self.ui.DeviceSelection, self.refreshDeviceList) self.connected = False # qt styles self.redLineEdit = "QLineEdit { background: rgb(255, 0, 0); selection-background-color: rgb(111, 136, 222); }" self.defLineEdit = "QLineEdit { }" # object containers self.currentFields = [ self.ui.Current1Field, self.ui.Current2Field, self.ui.Current3Field, self.ui.Current4Field, ] # modes, currents, etc self.modes = [] # connect signals self.connectMethods() class ComboBoxHoverEventFilter(QtCore.QObject): def __init__(self, parent, onEnter): super().__init__(parent) self.parent = parent self.onEnter = onEnter def eventFilter(self, obj, event): if event.type() == QtCore.QEvent.Type.Enter: self.onEnter() return super().eventFilter(obj, event) def connectMethods(self): self.ui.DeviceSelection.activated.connect(self.deviceSelected) self.ui.DeviceSelection.installEventFilter(self.hoverFilter) def resetAllStyles(self) -> None: for f in self.currentFields: f.setStyleSheet(self.defLineEdit) def clearAllFields(self) -> None: for f in self.currentFields: f.setText("") def setStatus(self, text: str) -> None : print(text) self.ui.Status.setText(text) self.repaint() def deviceSelected(self, deviceIndex: int): device = self.ui.DeviceSelection.itemText(deviceIndex) self.connected = False self.resetAllStyles() self.clearAllFields() self.setStatus(f'Подключение к {device}...') self.controller.close() self.controller.connect(device) print(device) if self.readControllerCurrentsAndData(): self.setStatus(f'Выбранный порт: {device}') self.connected = True else: self.setStatus(f'Не удалось подключиться к {device}') self.ui.DeviceSelection.clear() self.connected = False self.controller.close() def readControllerCurrentsAndData(self) -> bool: self.setStatus(f'Чтение токов {self.controller.controller.ser.port}...') values = self.controller.readCurrents() if not values: for f in self.currentFields: f.setStyleSheet(self.redLineEdit) else: for i, f in enumerate(self.currentFields): f.setStyleSheet(self.defLineEdit) f.setText(str(values[i] * 10)) self.setStatus(f'Чтение адреса {self.controller.controller.ser.port}...') address = self.controller.readAddress() if address == -1: self.ui.DmxAddressField.setStyleSheet(self.redLineEdit) else: self.ui.DmxAddressField.setStyleSheet(self.defLineEdit) self.ui.DmxAddressField.setText(str(address)) self.modes = [] self.setStatus(f'Чтение режимов {self.controller.controller.ser.port}...') dev_info = self.controller.readDeviceInfo() if dev_info: mode_count = dev_info[2] for index in range(mode_count): self.setStatus(f'Чтение режима {index + 1} {self.controller.controller.ser.port}...') mode = self.controller.readMode(index) if not mode: self.modes = [] break self.modes.append(mode) time.sleep(0.05) if not self.modes: self.ui.ModeSelection.clear() self.ui.ModeSelection.setCurrentText('ERROR') else: self.ui.ModeSelection.setStyleSheet('QComboBox {}') self.ui.ModeSelection.clear() for m in self.modes: self.ui.ModeSelection.addItem(m[1]) mode_names = [] for index, m in enumerate(self.modes): mode_names.append(f'{index + 1}:{m[1]}') self.ui.ModeSelection.setCurrentText(mode_names[dev_info[1] - 1]) self.ui.ModeSelection.clear() self.ui.ModeSelection.addItems(mode_names) return values or address != -1 or self.modes def refreshDeviceList(self): self.ui.DeviceSelection.clear() self.ui.DeviceSelection.addItems(self.controller.readComPorts()) if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec())