from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel, QPushButton, QLayout, \ QHBoxLayout, QComboBox, QLineEdit, QSpacerItem, QSizePolicy, QGridLayout, QMessageBox, QSplitter, QFrame import re class forceButton(QPushButton): def __init__(self, number = None, valueLabel = None, valueEdit = None): super().__init__() self.valueEdit = valueEdit self.valueLabel = valueLabel self.number = number self.setObjectName('forceBtn') self.setText('强制') class RightAreaWidgets(QWidget): def __init__(self, areaWidget, order, byteLineEdit, dataType, deviceName): super().__init__() self.areaLineEditValue = [] self.areaLabel = {} self.areaWidget = areaWidget self.devicesManange = self.areaWidget.devicesManange self.order = order self.byteLineEdit = byteLineEdit self.dataType = dataType self.deviceName = deviceName self.addLayout() # self.setStyleSheet("background-color: black") def addLayout(self): self.setLayout(self.areaLayout()) def areaLayout(self): areaLayout = QVBoxLayout() if self.dataType in ['AI','AO']: hLayout = QHBoxLayout() hLayout.addWidget(QSplitter()) hLayout.addLayout(self.dateLayout(1)) hLayout.addWidget(QSplitter()) areaLayout.addWidget(QSplitter()) areaLayout.addLayout(hLayout) areaLayout.addWidget(QSplitter()) else: byteLineEdit = int(self.byteLineEdit) * 4 areaLayout.addWidget(QSplitter()) for i in range(int(byteLineEdit)): hLayout = QHBoxLayout() hLayout.addWidget(QSplitter(), 1) hLayout.addLayout(self.dateLayout(number = (i + 1)), 3) hLayout.addWidget(QSplitter(), 1) hLayout.addLayout(self.dateLayout(number = (i + 1) + 8), 3) hLayout.addWidget(QSplitter(), 1) areaLayout.addLayout(hLayout) areaLayout.addWidget(QSplitter()) return areaLayout def dateLayout(self, number, force = True): number = number forceLayout = QHBoxLayout() areaMessLabel = QLabel(str(self.dataType) + "{:<{}}".format(str(number), 2) + ": " + '字节长度: ' + str(self.byteLineEdit) + ' 当前值:' ) areaMessLabel.setObjectName('areaMessLabel') areaValueLabel = QLabel('0') areaValueLabel.setObjectName('areaValueLabel') forceLayout.addWidget(areaMessLabel) forceLayout.addWidget(areaValueLabel) if '主站' in self.deviceName and self.dataType == 'AI' or ('从站' in self.deviceName and self.dataType == 'AO'): force = False self.areaLabel[number - 1] = areaValueLabel elif '主站' in self.deviceName and self.dataType == 'DI' or ('从站' in self.deviceName and self.dataType == 'DO'): force = False self.areaLabel[number - 1] = areaValueLabel if force: areaLineEdit = QLineEdit('0') areaLineEdit.setObjectName('areaLineEdit') areaLineEdit.setFixedSize(80, 33) forceBtn = forceButton(number = number, valueLabel=areaValueLabel, valueEdit=areaLineEdit) forceBtn.clicked.connect(self.forceValues) # forceBtn.setFixedSize(50, 27) forceLayout.addWidget(areaLineEdit) forceLayout.addWidget(forceBtn) self.areaLineEditValue.append(0) if self.deviceName[-2:] + self.dataType in ['从站DI','主站DO']: areaMessLabel.setObjectName('wirteDIDOareaMessLabel') areaValueLabel.setObjectName('wirteDIDOareaValueLabel') areaLineEdit.setObjectName('wirteDIDOareaLineEdit') areaLineEdit.setFixedSize(30, 27) forceBtn.setObjectName('wirteDIDOforceBtn') if self.deviceName[-2:] + self.dataType in ['主站DI','从站DO']: areaMessLabel.setObjectName('readDIDOareaMessLabel') areaValueLabel.setObjectName('readDIDOareaValueLabel') # forceLayout.setSpacing(10) return forceLayout def wirteAreaLineEditValue(self,dataTypeAndModel, valueLabel, number, value): if dataTypeAndModel in ['主站AO','从站AI']: pattern = re.compile(r'^\d+(\.\d+)?$') match = pattern.match(value) if not match: QMessageBox.warning(self, '提示', '请输入数字。') return else: valueLabel.setText(value) self.areaLineEditValue[number -1] = float(value) #判断输入值是否为0和1 elif dataTypeAndModel in ['主站DO','从站DI']: pattern = re.compile(r'^[01]$') match = pattern.match(value) if not match: QMessageBox.warning(self, '提示', '请输入0或1。') return else: valueLabel.setText(value) self.areaLineEditValue[number -1] = value return self.areaLineEditValue def readValues(self, curIndex): print(curIndex) if self.areaLabel is None or self.areaLabel == dict(): return # elif curIndex == -1: # return else: print(self.deviceName, curIndex) device = self.devicesManange.getDevice(self.deviceName) values = device.getAreaValues(curIndex) for index, value in enumerate(values): self.areaLabel[index].setText(str(value)) # print(self.areaLabel[index],values) def forceValues(self): sender = self.sender() number = sender.number valueLabel = sender.valueLabel value = sender.valueEdit.text() dataTypeAndModel = self.deviceName[-2:] + self.dataType curIndex = self.areaWidget.areaTabWidget.currentIndex() valueList = self.wirteAreaLineEditValue(dataTypeAndModel=dataTypeAndModel, valueLabel=valueLabel,number=number, value=value) print(valueList, curIndex) if valueList is None: return else: self.devicesManange.writeAreas(deviceName = self.deviceName, areaIndex = curIndex, values = valueList)