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 ButtonWidgets(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() print(self.dataType) 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(), 2) hLayout.addLayout(self.dateLayout(number = (i + 1)), 6) hLayout.addWidget(QSplitter(), 2) hLayout.addLayout(self.dateLayout(number = (i + 1) + 8), 6) hLayout.addWidget(QSplitter(), 2) 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] = areaValueLabel elif '主站' in self.deviceName and self.dataType == 'DI' or ('从站' in self.deviceName and self.dataType == 'DO'): force = False self.areaLabel[number] = areaValueLabel if force: areaLineEdit = QLineEdit('0') areaLineEdit.setObjectName('areaLineEdit') forceBtn = forceButton(number = number, valueLabel=areaValueLabel, valueEdit=areaLineEdit) forceBtn.clicked.connect(self.forceValues) forceLayout.addWidget(areaLineEdit) forceLayout.addWidget(forceBtn) self.areaLineEditValue.append('0') 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] = 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,deviceName, curIndex): if self.areaLabel is None: return elif curIndex == -1: return else: device = self.devicesManange.getDevice(deviceName) # print(id(device)) values = device.getAreaValues(curIndex) for index, value in enumerate(values): self.areaLabel[index+1].setText(str(value)) 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) if valueList is None: return else: self.areaWidget.wirteValue(deviceName = self.deviceName, curIndex = curIndex, valueList = valueList)