import re from socket import AI_ADDRCONFIG import sys import json 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.QtGui import QIcon from PyQt5.QtCore import QSize from model.ProjectModel.DeviceManage import Device, DevicesManange from UI.ButtonLayoutWidget import ButtonWidgets class AreaTabWidget(QTabWidget): def __init__(self, deviceWidget): super().__init__() self.deviceWidget = deviceWidget self.devicesManange = self.deviceWidget.devicesManange self.initUI() def initUI(self): self.deviceName = self.deviceWidget.deviceName # 创建一个 QTabWidget self.setObjectName('areaTabWidget') 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) self.setCornerWidget(self.addAreaButton) self.addAreaButton.clicked.connect(self.addAreaTab) self.initWidget() #初始化界面 # self.tabCloseRequested.connect(self.closeTab) # self.setTabPosition(QTabWidget.West) # self.setTabsClosable(True) # 设置主窗口的中心部分为 QTabWidget 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.setObjectName('initAreaAddButton') icon = QIcon('Static/add.png') iconSize = QSize(50,50) addButton.setIcon(icon) addButton.setIconSize(iconSize) 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) self.addTab(areaWidget, '通道' + str(tabIndex + 1)) self.setCurrentIndex(tabIndex) self.tabBar().setHidden(False) else: tabIndex = self.count() areaWidget = AreaWidget(self, settingValue) 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): super().__init__() self.areaTabWidget = areaTabWidget self.settingValue = settingValue self.devicesManange = self.areaTabWidget.devicesManange self.initUI() 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.setObjectName('dataTypeLabel') # self.dataTypeLabel.setFixedSize(90, 27) self.dataTypeCombox = QComboBox() self.dataTypeCombox.addItems(['AI', 'AO', 'DI', 'DO']) self.dataTypeCombox.setObjectName('dataTypeCombox') self.dataTypeCombox.currentIndexChanged.connect(self.setByteLineEditValue) # self.dataTypeCombox.setFixedSize(90, 27) self.dataOrderLabel = QLabel('数据格式:') self.dataOrderLabel.setObjectName('dataOrderLabel') # self.dataOrderLabel.setFixedSize(90, 27) self.orderCombox = QComboBox() self.orderCombox.addItems(['不转换', '字节转换', '字转换', '字内转换']) self.orderCombox.setObjectName('orderCombox') # self.orderCombox.setFixedSize(90, 27) self.byteLineLabel = QLabel('字节长度:') self.byteLineLabel.setObjectName('byteLineLabel') # 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.setObjectName('okBtn') self.okBtn.clicked.connect(self.addAreaWidget) self.okBtnValue = True self.delAreaBtn = QPushButton('删除') self.delAreaBtn.setObjectName('delAreaBtn') # self.delAreaBtn.setFixedSize(90, 27) self.delAreaBtn.clicked.connect(self.removeAreaTab) hLayout = QHBoxLayout() hLayout.addWidget(self.okBtn) hLayout.addWidget(self.delAreaBtn) 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.addLayout(hLayout, 3, 0, 1, 2) # self.leftLayout.addWidget(self.delAreaBtn, 3, 1, 1, 1) self.rightLayout.addWidget(QWidget()) line = QFrame() line.setFrameShape(QFrame.VLine) line.setLineWidth(2) self.mainLayout.addLayout(self.leftLayout, 1) self.mainLayout.addWidget(line) self.mainLayout.addLayout(self.rightLayout, 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 def setByteLineEditValue(self): byteLineEditValue = self.dataTypeCombox.currentText() if byteLineEditValue in ['DI','DO']: self.byteLineEdit.setText('2') self.byteLineEdit.setEnabled(False) else: self.byteLineEdit.setEnabled(True) def removeAreaTab(self): # 只点击了新建去域按钮,未点击确定按钮时,直接点击删除按钮的删除情况 index = self.areaTabWidget.currentIndex() tabCount = self.areaTabWidget.count() if self.okBtn.text() == '确定': if index != -1: self.areaTabWidget.removeTab(index) if tabCount == 1: self.areaTabWidget.initWidget() #正常点击删除按钮的情况 else: deviceName = self.areaTabWidget.deviceName datatype = self.dataTypeCombox.currentText() if index != -1: self.areaTabWidget.removeTab(index) Device.delAreas(deviceName, index) self.devicesManange.getDevice(deviceName).delArea(index, datatype) self.devicesManange.recalculateAddress() if tabCount == 1: self.areaTabWidget.initWidget() def addAreaWidget(self): curIndex = self.areaTabWidget.currentIndex() #获取左侧配置布局的参数 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, '提示', '请输入数字。') return else: #设置点击确定后无法编辑,点击编辑后才能编辑 if self.okBtnValue: self.okBtn.setText('编辑') self.dataTypeCombox.setEnabled(False ) self.orderCombox.setEnabled(False ) self.byteLineEdit.setEnabled(False ) self.okBtnValue = False if dataType in ['DI','DO']: self.okBtn.setEnabled(False) elif dataType in ['AI','AO']: self.okBtn.setText('确定') # self.dataTypeCombox.setEnabled(True) self.orderCombox.setEnabled(True) self.byteLineEdit.setEnabled(True) self.okBtnValue = True #修改配置后刷新布局内容 # if self.settingValue is None: while areaLayout.count(): items = areaLayout.takeAt(0) widget = items.widget() if widget: widget.setParent(None) widget.deleteLater() #添加按钮布局 buttonWidgets = ButtonWidgets(self, order = order, byteLineEdit = byteLineEdit, dataType = dataType, deviceName = deviceName) areaLayout.addWidget(buttonWidgets,0,0) areaId = DevicesManange.getAreaID(deviceName) if self.settingValue is not None: self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1) return elif areaId is not None and curIndex in areaId: DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, curIndex) self.devicesManange.getDevice(deviceName).editArea(index = curIndex, type = dataType, order = order, bytes = int(byteLineEdit)) # self.readVarTimer.start(500) else: DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName) self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1) self.devicesManange.recalculateAddress() # self.readVarTimer.start(500) def dataTypeTranslate(self, order): self.dataTypeDict = {'不转换': 'ABCD', '字节转换': 'DCBA', '字转换': 'CDAB', '字内转换': 'BADC'} return self.dataTypeDict[order] def wirteValue(self, deviceName, curIndex, valueList): print(deviceName,curIndex, valueList ) # self.devicesManange.writeAreas(deviceName = deviceName, values = valueList) def readValue(self,deviceName, curIndex): print(deviceName, curIndex) # if curIndex == -1: # return # else: # device = self.devicesManange.getDevice(deviceName) # values = device.getAreaValues(curIndex) # i = 0 # for value in values: # areaLabel[i].setText(str(value)) # i =+ 1 # # 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)) if __name__ == '__main__': app = QApplication(sys.argv) window = AreaTabWidget() window.show() sys.exit(app.exec_())