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/AreaTabWidget.py

278 lines
11 KiB
Python

2 years ago
import sys
2 years ago
import json
2 years ago
from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel, QPushButton, \
QHBoxLayout, QComboBox, QLineEdit, QSpacerItem, QSizePolicy, QGridLayout, QMessageBox
from PyQt5 import QtCore
from model.ProjectModel.DeviceManage import DevicesManange, Device
class AreaTabWidget(QMainWindow):
2 years ago
def __init__(self, mainwindow):
2 years ago
super().__init__()
self.initUI()
2 years ago
self.mainwindow = mainwindow
2 years ago
def initUI(self):
# 创建一个 QTabWidget
self.widgetList = []
self.areaTabWidget = QTabWidget(self)
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
# 设置主窗口的中心部分为 QTabWidget
self.setCentralWidget(self.areaTabWidget)
2 years ago
def initAreaTab(self, dataType, order, channelBytes):
widgetList = self.addAreaTab()
2 years ago
widgetList[0].setCurrentIndex(dataType)
widgetList[1].setCurrentIndex(order)
widgetList[2].setText(channelBytes)
2 years ago
2 years ago
self.addAreaWidget(widgetList, loacl = False, init = True)
2 years ago
2 years ago
def addAreaTab(self):
2 years ago
areaTabWidget = QWidget()
tabIndex = self.areaTabWidget.count()
# 将标签页添加到 QTabWidget 中
self.areaTabWidget.addTab(areaTabWidget, str(tabIndex))
self.areaTabWidget.setCurrentIndex(int(tabIndex))
self.setCentralWidget(self.areaTabWidget)
widgetList = []
mainLayout = QVBoxLayout()
topLayout = QHBoxLayout()
areaLayout = QGridLayout()
dataTypeCombox = QComboBox()
dataTypeCombox.addItems(['AI', 'AO', 'DI', 'DO'])
dataTypeCombox.setObjectName('dataTypeCombox')
orderCombox = QComboBox()
orderCombox.addItems(['不转换', '字节转换', '字转换', '字内转换'])
byteLineEdit = QLineEdit()
byteLineEdit.setPlaceholderText('字节长度')
byteLineEdit.setObjectName('byteLineEdit')
okBtn = QPushButton('确定')
delAreaBtn = QPushButton('删除')
topLayout.addWidget(dataTypeCombox, 1)
topLayout.addWidget(orderCombox, 1)
# topLayout.addWidget(byteLabel)
topLayout.addWidget(byteLineEdit, 2)
topLayout.addWidget(okBtn, 1)
topLayout.addItem(self.horizontalSpacer)
topLayout.addItem(self.horizontalSpacer)
topLayout.addItem(self.horizontalSpacer)
topLayout.addItem(self.horizontalSpacer)
topLayout.addWidget(delAreaBtn, 1)
widget = QWidget()
areaLayout.addWidget(widget)
mainLayout.addLayout(topLayout, 1)
mainLayout.addLayout(areaLayout, 9)
2 years ago
okBtn.clicked.connect(lambda checked, btn=okBtn: self.addAreaWidget(widgetList))
2 years ago
delAreaBtn.clicked.connect(self.removeAreaTab)
2 years ago
widgetList.extend([dataTypeCombox, orderCombox, byteLineEdit, areaLayout])
2 years ago
areaTabWidget.setLayout(mainLayout)
2 years ago
return widgetList
2 years ago
def removeAreaTab(self):
# 获取 QTabWidget 并从中删除标签页
deviceName = self.areaTabWidget.parent().parent().parent().parent().parent().windowTitle()
index = self.areaTabWidget.currentIndex()
2 years ago
2 years ago
alldevices = DevicesManange.getAllDevice()
for device in alldevices:
if deviceName in device:
areas = device[3]
if areas is not None:
areas = json.loads(areas)
area = areas[index]
type = area["type"]
2 years ago
# print(area, type,'ssss')
2 years ago
2 years ago
if index != -1:
self.areaTabWidget.removeTab(index)
2 years ago
del self.widgetList[index]
2 years ago
Device.delAreas(deviceName, index)
2 years ago
self.mainwindow.devicesManange.getDevice(deviceName).delArea(index, type)
2 years ago
self.mainwindow.devicesManange.recalculateAddress()
2 years ago
2 years ago
def addAreaWidget(self, widgetList, loacl = True, init = False):
2 years ago
dataType = widgetList[0].currentText()
2 years ago
# print(widgetList)
2 years ago
order = self.dataTypeTranslate(widgetList[1].currentText())
byteLineEdit = widgetList[2].text()
areaLayout = widgetList[3]
2 years ago
deviceName = self.areaTabWidget.parent().parent().parent().parent().parent().windowTitle()
2 years ago
widgetLists = []
2 years ago
2 years ago
while areaLayout.count():
item = areaLayout.takeAt(0)
widget = item.widget()
if widget:
widget.setParent(None)
2 years ago
2 years ago
if len(byteLineEdit) == 0:
QMessageBox.warning(self, '警告', '请输入字节长度。')
2 years ago
2 years ago
else:
2 years ago
widgetList[0].setEnabled(False)
2 years ago
if dataType in ['AI', 'AO']:
2 years ago
areaLabel = QLabel(dataType + str(1) + ": " + byteLineEdit + 'Byte' )
areaLabel2 =QLabel('0')
2 years ago
if '主站' in deviceName and dataType == 'AI' or ('从站' in deviceName and dataType == 'AO'):
areaLayout.addWidget(areaLabel, 0, 0)
areaLayout.addWidget(areaLabel2, 0, 1)
areaLayout.addItem(self.horizontalSpacer, 0, 4)
2 years ago
widgetLists.append([areaLabel2, areaLayout])
2 years ago
elif '主站' in deviceName and dataType == 'AO' or ('从站' in deviceName and dataType == 'AI'):
areaLineEdit = QLineEdit('0')
editbtn = QPushButton('强制')
areaLayout.addWidget(areaLabel, 0, 0)
areaLayout.addWidget(areaLabel2, 0, 1 )
areaLayout.addWidget(areaLineEdit, 0, 2 )
areaLayout.addWidget(editbtn, 0, 3)
areaLayout.addItem(self.horizontalSpacer, 0, 4)
editbtn.clicked.connect(lambda checked, btn=editbtn: self.wirteValue(btn))
2 years ago
widgetLists.append([areaLabel2, areaLineEdit, editbtn, areaLayout])
self.widgetList.append(widgetLists)
2 years ago
2 years ago
else:
channelNumber = int(byteLineEdit) * 8
2 years ago
if '主站' in deviceName and dataType == 'DI' or (
'从站' in deviceName and dataType == 'DO'):
for i in range(int(channelNumber)):
if i % 2 == 0:
areaLabel = QLabel(dataType + str(i + 1) + ": " + byteLineEdit + 'Byte')
areaLabel2 = QLabel('0')
areaLayout.addWidget(areaLabel, i // 2, i % 2)
areaLayout.addWidget(areaLabel2, i // 2, i % 2 + 1)
2 years ago
widgetLists.append([areaLabel2, areaLayout])
2 years ago
else:
areaLabel = QLabel(dataType + str(i + 1) + ": " + byteLineEdit + 'Byte')
areaLabel2 = QLabel('0')
areaLayout.addWidget(areaLabel, i // 2, i % 2 + 2)
areaLayout.addWidget(areaLabel2, i // 2, i % 2 + 3)
2 years ago
widgetLists.append([areaLabel2, areaLayout])
self.widgetList.append(widgetLists)
2 years ago
if '主站' in deviceName and dataType == 'DO' or (
'从站' in deviceName and dataType == 'DI'):
for i in range(int(channelNumber)):
if i % 2 == 0:
areaLabel = QLabel(dataType + str(i + 1) + ": " + byteLineEdit + 'Byte')
areaLabel2 = QLabel('0')
areaLineEdit = QLineEdit('0')
editbtn = QPushButton('强制')
areaLayout.addWidget(areaLabel, i // 2, i % 2)
areaLayout.addWidget(areaLabel2, i // 2, i % 2 + 1)
areaLayout.addWidget(areaLineEdit, i // 2, i % 2 + 2)
areaLayout.addWidget(editbtn, i // 2, i % 2 + 3)
editbtn.clicked.connect(lambda checked, btn=editbtn: self.wirteValue(btn))
2 years ago
widgetLists.append([areaLabel2, areaLineEdit, editbtn])
2 years ago
else:
areaLabel = QLabel(dataType + str(i + 1) + ": " + byteLineEdit + 'Byte')
areaLabel2 = QLabel('0')
areaLineEdit = QLineEdit('0')
editbtn = QPushButton('强制')
areaLayout.addWidget(areaLabel, i // 2, i % 2 + 4)
areaLayout.addWidget(areaLabel2, i // 2, i % 2 + 5)
areaLayout.addWidget(areaLineEdit, i // 2, i % 2 + 6)
areaLayout.addWidget(editbtn, i // 2, i % 2 + 7)
editbtn.clicked.connect(lambda checked, btn=editbtn: self.wirteValue(btn))
2 years ago
widgetLists.append([areaLabel2, areaLineEdit, editbtn])
self.widgetList.append(widgetLists)
2 years ago
areaLayout.addItem(self.verticalSpacer, int(byteLineEdit) * 8 ,0)
2 years ago
2 years ago
index = self.areaTabWidget.currentIndex() + 1
areaId = DevicesManange.getAreaID(deviceName)
if areaId is not None and index in areaId:
if loacl:
2 years ago
2 years ago
del self.widgetList[index - 1]
2 years ago
if init:
return
2 years ago
DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, index)
2 years ago
self.mainwindow.devicesManange.getDevice(deviceName).editArea(index = index - 1, type = dataType, order = order, bytes = int(byteLineEdit))
self.mainwindow.devicesManange.recalculateAddress()
2 years ago
else:
DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName)
2 years ago
self.mainwindow.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), nums = 1)
self.mainwindow.devicesManange.recalculateAddress()
2 years ago
2 years ago
2 years ago
def dataTypeTranslate(self, order):
self.dataTypeDict = {'不转换': 'ABCD', '字节转换': 'DCBA', '字转换': 'CDAB', '字内转换': 'BADC'}
return self.dataTypeDict[order]
2 years ago
def wirteValue(self, editBtn):
2 years ago
deviceName = self.areaTabWidget.parent().parent().parent().parent().parent().windowTitle()
2 years ago
# index = self.areaTabWidget.currentIndex()
2 years ago
valueList = []
if len(self.widgetList) > 0:
for widgetLists in self.widgetList:
for widgetList in widgetLists:
2 years ago
if editBtn in widgetList:
widgetList[0].setText(widgetList[1].text())
2 years ago
if isinstance(widgetList[1], QLineEdit):
2 years ago
valueList.append(float(widgetList[1].text()))
self.mainwindow.devicesManange.writeAreas(deviceName = deviceName, values = valueList)
2 years ago
2 years ago
2 years ago
def readValue(self):
deviceList = []
areaIdList = []
devices = DevicesManange.getAllDevice()
2 years ago
2 years ago
for device in devices:
deviceName = device[0]
areas = device[3]
if areas is not None:
areas = json.loads(areas)
for area in areas:
areaId = area["id"]
areaIdList.append(areaId)
deviceList.append([deviceName, areaIdList])
2 years ago
index = self.areaTabWidget.currentIndex()
2 years ago
2 years ago
if len(self.widgetList) > 0:
2 years ago
widgetLists = self.widgetList[index]
for widgetList in widgetLists:
widgetList[0].setText('AAA')
2 years ago
2 years ago
2 years ago
if __name__ == '__main__':
app = QApplication(sys.argv)
window = AreaTabWidget()
window.show()
sys.exit(app.exec_())