You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PROFIBUS/UI/RightAreaWidget.py

170 lines
6.6 KiB
Python

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()
areaLayout.setContentsMargins(0, 0, 0, 0)
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()
forceLayout.setContentsMargins(0, 0, 0, 0)
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:
device = self.devicesManange.getDevice(self.deviceName)
values = device.getAreaValues(curIndex)
# print(self.deviceName, curIndex, values)
if len(values) > len(self.areaLabel):
return
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)