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

353 lines
13 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
2 years ago
2 years ago
from PyQt5.QtGui import QIcon
from model.ProjectModel.DeviceWidgetManage import DeviceWidgetManage
2 years ago
from UI.AreaValueManage import AreaValueManage
2 years ago
from model.ProjectModel.DeviceManage import Device, DevicesManange
2 years ago
from UI.ButtonLayoutWidget import ButtonLayout
2 years ago
class AreaTabWidget(QTabWidget):
def __init__(self, deviceWidget):
super().__init__()
self.deviceWidget = deviceWidget
2 years ago
self.areaValueManage = AreaValueManage()
2 years ago
self.initUI()
2 years ago
2 years ago
def initUI(self):
2 years ago
2 years ago
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
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()
2 years ago
areaWidget = AreaWidget(self)
2 years ago
self.addTab(areaWidget, '通道' + str(tabIndex + 1))
self.setCurrentIndex(tabIndex)
self.tabBar().setHidden(False)
else:
tabIndex = self.count()
2 years ago
areaWidget = AreaWidget(self, settingValue)
2 years ago
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):
2 years ago
def __init__(self, areaTabWidget, settingValue = None):
2 years ago
super().__init__()
self.areaTabWidget = areaTabWidget
self.settingValue = settingValue
2 years ago
self.areaValueManage = self.areaTabWidget.areaValueManage
2 years ago
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('数据类型:')
2 years ago
self.dataTypeLabel.setObjectName('dataTypeLabel')
2 years ago
# 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('数据格式:')
2 years ago
self.dataOrderLabel.setObjectName('dataOrderLabel')
2 years ago
# self.dataOrderLabel.setFixedSize(90, 27)
self.orderCombox = QComboBox()
self.orderCombox.addItems(['不转换', '字节转换', '字转换', '字内转换'])
2 years ago
self.orderCombox.setObjectName('orderCombox')
2 years ago
# self.orderCombox.setFixedSize(90, 27)
self.byteLineLabel = QLabel('字节长度:')
2 years ago
self.byteLineLabel.setObjectName('byteLineLabel')
2 years ago
# 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)
2 years ago
self.okBtn.setObjectName('okBtn')
2 years ago
self.okBtn.clicked.connect(self.addAreaWidget)
self.obBtnValue = True
self.delAreaBtn = QPushButton('删除')
2 years ago
self.delAreaBtn.setObjectName('delAreaBtn')
2 years ago
# 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)
2 years ago
self.rightWidget = QWidget()
self.rightLayout.addWidget(self.rightWidget)
2 years ago
line = QFrame()
line.setFrameShape(QFrame.VLine)
line.setLineWidth(2)
self.mainLayout.addLayout(self.leftLayout, 1)
self.mainLayout.addWidget(line)
2 years ago
self.mainLayout.addLayout(self.rightLayout, 9)
2 years ago
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()
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.areaValueManage.delArea(deviceName = deviceName, curIndex = 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()
#获取左侧配置布局的参数
2 years ago
2 years ago
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('确定')
2 years ago
self.dataTypeCombox.setEnabled(True)
self.orderCombox.setEnabled(True)
self.byteLineEdit.setEnabled(True)
2 years ago
self.obBtnValue = True
2 years ago
return
2 years ago
2 years ago
#修改配置后刷新布局内容
2 years ago
if self.settingValue is None:
while areaLayout.count():
items = areaLayout.takeAt(0)
2 years ago
widget = items.widget()
if widget:
widget.setParent(None)
widget.deleteLater()
2 years ago
2 years ago
#添加按钮布局
buttonLayout = ButtonLayout(self, order = order, byteLineEdit = byteLineEdit, dataType = dataType, deviceName = deviceName)
areaLayout.addWidget(buttonLayout)
2 years ago
2 years ago
2 years ago
2 years ago
areaId = DevicesManange.getAreaID(deviceName)
if self.settingValue is not None:
return
elif areaId is not None and curIndex in areaId:
DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, curIndex)
else:
DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName)
2 years ago
# 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, deviceName, dataTypeAndModel ):
deviceValuelist = self.areaValueManage.getAreaValueList(deviceName = deviceName, dataTypeAndModel = dataTypeAndModel)
print(deviceValuelist)
2 years ago
# self.mainwindow.devicesManange.writeAreas(deviceName = deviceName, values = valueList)
2 years ago
2 years ago
2 years ago
def readValue(self,deviceName, dataTypeAndModel):
areaWidgets = self.areaValueManage.getAreaValueList(deviceName = deviceName, dataTypeAndModel = dataTypeAndModel)
print(areaWidgets,aaa)
# 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
2 years ago
if __name__ == '__main__':
app = QApplication(sys.argv)
window = AreaTabWidget()
window.show()
sys.exit(app.exec_())