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

528 lines
21 KiB
Python

2 years ago
import re
from socket import AI_ADDRCONFIG
2 years ago
import sys
2 years ago
import json
2 years ago
from tkinter import N
from functools import partial
from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel, QPushButton, QLayout, \
QHBoxLayout, QComboBox, QLineEdit, QSpacerItem, QSizePolicy, QGridLayout, QMessageBox, QSplitter, QFrame
from PyQt5.QtCore import QLine
from PyQt5.QtGui import QIcon
from numpy import add, byte, delete
from model.ProjectModel.AreaManage import Area
from model.ProjectModel.DeviceWidgetManage import DeviceWidgetManage
from UI.AreaMansge import AreaWidgetManage
from model.ProjectModel.DeviceManage import Device, DevicesManange
class forceButton(QPushButton):
def __init__(self, valueEdit):
super().__init__()
self.valueEdit = valueEdit
self.setText('强制')
2 years ago
2 years ago
class ButtonLayout(QWidget):
def __init__(self):
2 years ago
super().__init__()
2 years ago
# self.index = index
self.addLayout()
l = []
def addLayout(self):
self.setLayout(self.areaLayout())
def areaLayout(self):
areaLayout = QVBoxLayout()
for i in range(8):
hLayout = QHBoxLayout()
hLayout.addLayout(self.dateLayout())
hLayout.addWidget(QSplitter())
hLayout.addLayout(self.dateLayout())
areaLayout.addLayout(hLayout)
return areaLayout
def dateLayout(self, force = True):
forceLayout = QHBoxLayout()
areaMessLabel = QLabel('DO' + str(1) + ": " + '字节长度: ' + '22' + ' 当前值: ' )
areaValueLabel = QLabel('0')
forceLayout.addWidget(areaMessLabel)
forceLayout.addWidget(areaValueLabel)
if force:
areaLineEdit = QLineEdit('0')
forceBtn = forceButton(areaLineEdit)
forceBtn.clicked.connect(self.forceValues)
forceLayout.addWidget(areaLineEdit)
forceLayout.addWidget(forceBtn)
return forceLayout
def forceValues(self):
sender = self.sender()
print(sender.valueEdit.text())
class AreaTabWidget(QTabWidget):
def __init__(self, deviceWidget):
super().__init__()
self.deviceWidget = deviceWidget
2 years ago
self.initUI()
2 years ago
2 years ago
def initUI(self):
2 years ago
self.areaWidgetmanage = AreaWidgetManage()
self.deviceName = self.deviceWidget.deviceName
2 years ago
# 创建一个 QTabWidget
2 years ago
self.setTabPosition(QTabWidget.South)
self.tabBar().setObjectName('areaTabBar')
self.addAreaButton = QPushButton("添加区域")
self.addAreaButton.setObjectName('addareabutton')
self.addAreaButton.setIcon(QIcon('Static/add.png'))
self.addAreaButton.setFlat(True)
2 years ago
2 years ago
self.setCornerWidget(self.addAreaButton)
self.addAreaButton.clicked.connect(self.addAreaTab)
self.initWidget() #初始化界面
2 years ago
2 years ago
# self.tabCloseRequested.connect(self.closeTab)
# self.setTabPosition(QTabWidget.West)
# self.setTabsClosable(True)
# 设置主窗口的中心部分为 QTabWidget
2 years ago
2 years ago
def initWidget(self):
alldevices = DevicesManange.getAllDevice()
if alldevices:
for devices in alldevices:
if self.deviceName in devices:
areas = json.loads(devices[3])
if areas:
self.removeTab(0)
for area in areas:
dataType, order = self.tran(area["type"], area["order"])
channelBytes = area["bytes"]
settingValue = [dataType, order, channelBytes]
self.addAreaTab(settingValue=settingValue)
else:
widget = QWidget()
layout = QHBoxLayout()
addButton = QPushButton('添加区域')
addButton.clicked.connect(lambda: self.addAreaTab(True))
layout.addWidget(QSplitter())
layout.addWidget(addButton)
layout.addWidget(QSplitter())
widget.setLayout(layout)
self.addTab(widget,'')
self.tabBar().setHidden(True)
def addAreaTab(self, init = False, settingValue = None):
if settingValue is None:
if init:
self.removeTab(0)
tabIndex = self.count()
areaWidget = AreaWidget(self, areaWidgetManage = self.areaWidgetmanage)
self.addTab(areaWidget, '通道' + str(tabIndex + 1))
self.setCurrentIndex(tabIndex)
self.tabBar().setHidden(False)
else:
tabIndex = self.count()
areaWidget = AreaWidget(self, settingValue, areaWidgetManage = self.areaWidgetmanage)
self.addTab(areaWidget, '通道' + str(tabIndex + 1))
self.tabBar().setHidden(False)
def tran(self, dataType, order):
if dataType == 'AI':
dataType = 0
if dataType == 'AO':
dataType = 1
if dataType == 'DI':
dataType = 2
if dataType == 'DO':
dataType = 3
if order == 'ABCD':
order = 0
if order == 'DCBA':
order = 1
if order == 'CDAB':
order = 2
if order == 'BADC':
order = 3
return dataType, order
class AreaWidget(QWidget):
def __init__(self, areaTabWidget, settingValue = None, areaWidgetManage = None):
super().__init__()
self.areaTabWidget = areaTabWidget
self.settingValue = settingValue
self.areaWidgetManage = areaWidgetManage
self.initUI()
2 years ago
2 years ago
def initUI(self):
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
self.mainLayout = QHBoxLayout()
self.leftLayout = QGridLayout()
self.rightLayout = QGridLayout()
self.dataTypeLabel = QLabel('数据类型:')
# self.dataTypeLabel.setFixedSize(90, 27)
self.dataTypeCombox = QComboBox()
self.dataTypeCombox.addItems(['AI', 'AO', 'DI', 'DO'])
self.dataTypeCombox.setObjectName('dataTypeCombox')
# self.dataTypeCombox.setFixedSize(90, 27)
self.dataOrderLabel = QLabel('数据格式:')
# self.dataOrderLabel.setFixedSize(90, 27)
self.orderCombox = QComboBox()
self.orderCombox.addItems(['不转换', '字节转换', '字转换', '字内转换'])
# self.orderCombox.setFixedSize(90, 27)
self.byteLineLabel = QLabel('字节长度:')
# self.byteLineLabel.setFixedSize(90, 27)
self.byteLineEdit = QLineEdit()
self.byteLineEdit.setPlaceholderText('字节长度')
self.byteLineEdit.setObjectName('byteLineEdit')
# self.byteLineEdit.setFixedSize(90, 27)
self.okBtn = QPushButton('确定')
# self.okBtn.setFixedSize(90, 27)
self.okBtn.clicked.connect(self.addAreaWidget)
self.obBtnValue = True
self.delAreaBtn = QPushButton('删除')
# self.delAreaBtn.setFixedSize(90, 27)
self.delAreaBtn.clicked.connect(self.removeAreaTab)
self.leftLayout.addWidget(self.dataTypeLabel, 0, 0, 1, 1)
self.leftLayout.addWidget(self.dataTypeCombox, 0, 1, 1, 1)
self.leftLayout.addWidget(self.dataOrderLabel,1, 0, 1, 1 )
self.leftLayout.addWidget(self.orderCombox,1, 1, 1, 1 )
self.leftLayout.addWidget(self.byteLineLabel,2, 0, 1, 1 )
self.leftLayout.addWidget(self.byteLineEdit,2, 1, 1, 1 )
self.leftLayout.addWidget(self.okBtn, 3, 0, 1, 1)
self.leftLayout.addWidget(self.delAreaBtn, 3, 1, 1, 1)
self.rightWidget = ButtonLayout()
# self.rightLayout.addWidget(self.rightWidget)
line = QFrame()
line.setFrameShape(QFrame.VLine)
line.setLineWidth(2)
self.mainLayout.addLayout(self.leftLayout, 1)
self.mainLayout.addWidget(line)
self.mainLayout.addWidget(self.rightWidget, 9)
self.mainLayout.setSpacing(20)
# self.deviceWidgetManage.addArea(mainLayout=mainLayout, leftLayoutWidget=leftLayoutWidgets)
self.setLayout(self.mainLayout)
if self.settingValue is not None:
self.addAreaWidget()
self.settingValue = None
2 years ago
2 years ago
def removeAreaTab(self):
# 获取 QTabWidget 并从中删除标签页
2 years ago
deviceName = self.areaTabWidget.deviceName
2 years ago
2 years ago
index = self.areaTabWidget.currentIndex()
tabCount = self.areaTabWidget.count()
# alldevices = DevicesManange.getAllDevice()
# for device in alldevices:
# if deviceName in device:
# areas = device[3]
# if areas is not None:
# areas = json.loads(areas)
# if index >= len(areas):
# self.areaTabWidget.removeTab(index)
# return
2 years ago
2 years ago
if index != -1:
self.areaTabWidget.removeTab(index)
2 years ago
2 years ago
Device.delAreas(deviceName, index)
2 years ago
# self.mainwindow.devicesManange.getDevice(deviceName).delArea(index, type)
# self.mainwindow.devicesManange.recalculateAddress()
if tabCount == 1:
self.areaTabWidget.initWidget()
2 years ago
2 years ago
2 years ago
2 years ago
def addAreaWidget(self):
curIndex = self.areaTabWidget.currentIndex()
#获取左侧配置布局的参数
areaWidgets = []
areaLayout = self.rightLayout
deviceName = self.areaTabWidget.deviceName
#开启软件时判断数据库是否有存在设备信息,并执行相应的操作
if self.settingValue is None:
dataType = self.dataTypeCombox.currentText()
order = self.dataTypeTranslate(self.orderCombox.currentText())
byteLineEdit = self.byteLineEdit.text()
else:
dataTypeIndex = self.settingValue[0]
orderIndex = self.settingValue[1]
byteLineEditIndex = self.settingValue[2]
self.dataTypeCombox.setCurrentIndex(dataTypeIndex)
self.orderCombox.setCurrentIndex(orderIndex)
self.byteLineEdit.setText(byteLineEditIndex)
dataType = self.dataTypeCombox.currentText()
order = self.dataTypeTranslate(self.orderCombox.currentText())
byteLineEdit = self.byteLineEdit.text()
#判断字节长度的输入是否是数字
pattern = re.compile(r'^\d+$')
match = pattern.match(byteLineEdit)
if not match:
QMessageBox.warning(self, '提示', '请输入数字。')
2 years ago
return
2 years ago
else:
2 years ago
#设置点击确定后无法编辑,点击编辑后才能编辑
if self.obBtnValue:
self.okBtn.setText('编辑')
self.dataTypeCombox.setEnabled(False )
self.orderCombox.setEnabled(False )
self.byteLineEdit.setEnabled(False )
self.obBtnValue = False
2 years ago
else:
2 years ago
self.okBtn.setText('确定')
self.dataTypeCombox.setEnabled(True )
self.orderCombox.setEnabled(True )
self.byteLineEdit.setEnabled(True )
self.obBtnValue = True
2 years ago
return
2 years ago
#删除布局内容
if self.settingValue is None:
self.areaWidgetManage.delareaWidget(curIndex)
while areaLayout.count():
items = areaLayout.takeAt(0)
if isinstance(items, QSpacerItem):
areaLayout.removeItem(items)
if isinstance(items, QHBoxLayout):
while items.count():
item = items.takeAt(0)
widget = item.widget()
print(widget)
if widget:
widget.setParent(None)
widget.deleteLater()
items.deleteLater()
# #添加布局
# if dataType in ['AI', 'AO']:
# if '主站' in deviceName and dataType == 'AI' or ('从站' in deviceName and dataType == 'AO'):
# buttonLayout = ButtonLayout(index = 1, dataType = dataType, byteLineEdit = byteLineEdit, devicetype = '主站AI')
# areaLayout.addLayout(buttonLayout, 0, 0)
# areaLayout.addItem(self.horizontalSpacer, 0, 1)
# areaLayout.addItem(self.verticalSpacer, 1, 0)
# areaWidgets.append([buttonLayout.areaLabe2])
# elif '主站' in deviceName and dataType == 'AO' or ('从站' in deviceName and dataType == 'AI'):
# buttonLayout = ButtonLayout(index = 0, dataType = dataType, byteLineEdit = byteLineEdit, devicetype = '主站AO' )
# areaLayout.addLayout(buttonLayout, 0, 0)
# areaLayout.addItem(self.horizontalSpacer, 0, 4)
# areaLayout.addItem(self.verticalSpacer, 1, 0)
# areaLineEdit = buttonLayout.areaLineEdit
# buttonLayout.editbtn.clicked.connect(lambda: self.wirteValue(areaLineEdit, dataType='主站AO'))
# areaWidgets.append([buttonLayout.areaLabe2, areaLineEdit,buttonLayout.editbtn])
# self.areaWidgetManage.addWidgets(areaWidgets)
# else:
# channelNumber = int(byteLineEdit) * 8
# if '主站' in deviceName and dataType == 'DI' or (
# '从站' in deviceName and dataType == 'DO'):
# for i in range(int(channelNumber)):
# buttonLayout = ButtonLayout(index = i + 1, dataType = dataType, byteLineEdit = byteLineEdit, devicetype = '主站DI' ) # type: ignore
# if i % 2 == 0:
# areaLayout.addLayout(buttonLayout, i // 2, i % 2)
# else:
# areaLayout.addLayout(buttonLayout, i // 2, i % 2 + 1 )
# areaWidgets.append([buttonLayout.areaLabe2])
# areaLayout.addItem(self.verticalSpacer, int(channelNumber) // 2 + 1, 0)
# self.areaWidgetManage.addWidgets(areaWidgets)
# if '主站' in deviceName and dataType == 'DO' or (
# '从站' in deviceName and dataType == 'DI'):
# for i in range(int(channelNumber)):
# buttonLayout = ButtonLayout(index = i + 1, dataType = dataType, byteLineEdit = byteLineEdit, devicetype = '主站DO' ) # type: ignore
# if i % 2 == 0:
# areaLayout.addLayout(buttonLayout, i // 2, i % 2)
# areaLineEdit = buttonLayout.areaLineEdit
# buttonLayout.editbtn.clicked.connect(partial(self.wirteValue, areaLineEdit, '主站DO'))
# else:
# areaLayout.addLayout(buttonLayout, i // 2, i % 2 + 1 )
# areaLineEdit = buttonLayout.areaLineEdit
# buttonLayout.editbtn.clicked.connect(partial(self.wirteValue, areaLineEdit, '主站DO'))
# areaWidgets.append([buttonLayout.areaLabe2, areaLineEdit,buttonLayout.editbtn])
# areaLayout.addItem(self.verticalSpacer, int(channelNumber) // 2 + 1, 0)
# self.areaWidgetManage.addWidgets(areaWidgets)
# index = curIndex + 1
# areaId = DevicesManange.getAreaID(deviceName)
# if self.settingValue is not None:
# return
# elif areaId is not None and index in areaId:
# DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, index)
# else:
# DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName)
# if areaId is not None and index in areaId:
# # if loacl:
# # del self.widgetList[index - 1]
# if init:
# return
# DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, index)
# self.mainwindow.devicesManange.getDevice(deviceName).editArea(index = index - 1, type = dataType, order = order, bytes = int(byteLineEdit))
# self.mainwindow.devicesManange.recalculateAddress()
# self.mainwindow.readVarTimer.start(500)
# else:
# DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName)
# self.mainwindow.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1)
# self.mainwindow.devicesManange.recalculateAddress()
# self.mainwindow.readVarTimer.start(500)
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, dataType = None):
#判断输入值是否为数字
if dataType == '主站AO':
editbtnText = editbtn.text()
print(editbtn, editbtnText)
pattern = re.compile(r'^\d+(\.\d+)?$')
match = pattern.match(editbtnText)
if not match:
QMessageBox.warning(self, '提示', '请输入数字。')
return
#判断输入值是否为0和1
elif dataType == '主站DO':
editbtnText = editbtn.text()
print(editbtn, editbtnText, 'sssss')
pattern = re.compile(r'^[01]+$')
match = pattern.match(editbtnText)
if not match:
QMessageBox.warning(self, '提示', '请输入0或1。')
return
areaWidgets = self.areaWidgetManage.getAllWidgets()
2 years ago
valueList = []
2 years ago
didoValueList = []
2 years ago
if areaWidgets:
for areaWidget in areaWidgets:
if editbtn in areaWidget:
areaWidget[0].setText(areaWidget[1].text())
if isinstance(areaWidget[1], QLineEdit):
didoValueList.append(float(areaWidget[1].text()))
print(didoValueList)
if didoValueList:
valueList.append(didoValueList)
2 years ago
didoValueList = []
2 years ago
# self.mainwindow.devicesManange.writeAreas(deviceName = deviceName, values = valueList)
# valueList = []
# didoValueList = []
# if len(self.widgetList) > 0:
# for widgetLists in self.widgetList:
# for widgetList in widgetLists:
# if editBtn in widgetList:
# widgetList[0].setText(widgetList[1].text())
# if isinstance(widgetList[1], QLineEdit):
# dataType = widgetList[-1].text()[0:2]
# # if dataType in ['DI', "DO"]:
# didoValueList.append(float(widgetList[1].text()))
# if didoValueList:
# valueList.append(didoValueList)
# didoValueList = []
# self.mainwindow.devicesManange.writeAreas(deviceName = deviceName, values = valueList)
2 years ago
2 years ago
2 years ago
def readValue(self):
2 years ago
deviceName = self.mainwindow.devicesManange.getDeviceName(self)
2 years ago
curIndex = -1
areaIndex = self.areaTabWidget.currentIndex()
2 years ago
if len(self.widgetList) > 0:
2 years ago
inputIndex = 0
for index, widgetLists in enumerate(self.widgetList): #获取所有区域的所有的widgetlist
for widgetList in widgetLists:
#获取单个widgetlist
if isinstance(widgetList[1], QLineEdit):
pass
else:
# areaWidgets.append(widgetList)
if areaIndex == index:
curIndex = inputIndex
inputIndex += 1
break
if curIndex == -1:
return
else:
device = self.mainwindow.devicesManange.getDevice(deviceName)
values = device.getAreaValues(curIndex)
areaWidgets = self.widgetList[areaIndex]
for value, widgets in zip(values, areaWidgets):
widgets[0].setText(str(value))
2 years ago
2 years ago
if __name__ == '__main__':
app = QApplication(sys.argv)
window = AreaTabWidget()
window.show()
sys.exit(app.exec_())