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.
270 lines
10 KiB
Python
270 lines
10 KiB
Python
2 years ago
|
import sys
|
||
|
import json
|
||
|
import collections
|
||
|
import time
|
||
|
|
||
|
from PyQt5.QtWidgets import QApplication, QMainWindow, QToolBar, QMdiArea, QAction, QInputDialog, QDialog, QFormLayout, QLineEdit, \
|
||
|
QMdiSubWindow, QDialogButtonBox, QWidget, QComboBox, QTabBar, QTabWidget, QGridLayout, QLabel, QPushButton, QSpacerItem, QSizePolicy, QHBoxLayout, QTableWidget, QScrollArea
|
||
|
from PyQt5 import QtCore
|
||
|
from DeviceWidget import *
|
||
|
from AreaWidget import AreaWidget
|
||
|
from UI.AreaSettingWidget import AreaSettingWidget
|
||
|
from model.ProjectModel.AreaManage import Devices, DevicesManange, Area
|
||
|
from protocol.ModBus.ModBusThread import MyThread
|
||
|
from utils.DBModels.BaseModel import *
|
||
|
from utils.DBModels.ClientModels import DeviceDB
|
||
|
from model.ClientModel.Client import Client
|
||
|
|
||
|
|
||
|
class MainWindow(QMainWindow):
|
||
|
def __init__(self):
|
||
|
super().__init__()
|
||
|
self.initUI()
|
||
|
self.area = Area()
|
||
|
self.number = 0
|
||
|
self.labelText = []
|
||
|
self.lineEditText = []
|
||
|
self.devicesmanage = DevicesManange()
|
||
|
self.sub_windows = []
|
||
|
self.initAreaWidget()
|
||
|
self.getTextValue()
|
||
|
|
||
|
def initUI(self):
|
||
|
self.toolbar = QToolBar()
|
||
|
|
||
|
self.addToolBar(self.toolbar)
|
||
|
# self.setWindowState(self.windowState() | QtCore.Qt.WindowMaximized)
|
||
|
self.action1 = QAction("添加设备", self)
|
||
|
self.action1.triggered.connect(self.createDeciveWidget)
|
||
|
self.action2 = QAction("开始通讯", self)
|
||
|
self.action2.triggered.connect(self.startProtocol)
|
||
|
|
||
|
self.toolbar.addAction(self.action1)
|
||
|
self.toolbar.addAction(self.action2)
|
||
|
|
||
|
self.mdi_area = QMdiArea()
|
||
|
# self.scrollArea = QScrollArea()
|
||
|
# self.scrollArea.setWidget(self.mdi_area)
|
||
|
|
||
|
self.setCentralWidget(self.mdi_area)
|
||
|
|
||
|
|
||
|
# self.mdi_area.setViewMode(QMdiArea.TabbedView)
|
||
|
# self.mdi_area.setTabsClosable(False)
|
||
|
# self.mdi_area.setTabsMovable(True)
|
||
|
|
||
|
|
||
|
self.setWindowTitle("Main Window")
|
||
|
self.setGeometry(1000, 500, 800, 600)
|
||
|
|
||
|
def initAreaWidget(self):
|
||
|
alldevices = Devices().getAllDevice()
|
||
|
|
||
|
for devices in alldevices:
|
||
|
layout = self.deviceWidget(devices[0]).widget().widget().layout().itemAt(1).widget().layout()
|
||
|
areas = devices[3]
|
||
|
number = 0
|
||
|
masterSlaveModel = devices[2]
|
||
|
if areas is not None:
|
||
|
areas = json.loads(areas)
|
||
|
for area in areas:
|
||
|
varType = area["type"]
|
||
|
channelNums = area["nums"]
|
||
|
channelBytes = area["bytes"]
|
||
|
for i in range(int(channelNums)):
|
||
|
if masterSlaveModel == '主站':
|
||
|
if (i + number) % 2 == 0:
|
||
|
layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2,
|
||
|
(i + number) % 2)
|
||
|
layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 1)
|
||
|
layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 2)
|
||
|
|
||
|
else:
|
||
|
layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2,
|
||
|
(i + number) % 2 + 3)
|
||
|
layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 4)
|
||
|
layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 5)
|
||
|
else:
|
||
|
if (i + number) % 2 == 0:
|
||
|
layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2,
|
||
|
(i + number) % 2)
|
||
|
layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 1)
|
||
|
layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 2)
|
||
|
else:
|
||
|
layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2,
|
||
|
(i + number) % 2 + 3)
|
||
|
layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 4)
|
||
|
layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 5)
|
||
|
|
||
|
number = number + int(channelNums)
|
||
|
|
||
|
|
||
|
def deviceWidget(self, windowTitle):
|
||
|
sub_window = AreaQMdiSubWindow() # 创建一个子窗口
|
||
|
areaLayout1 = QGridLayout()
|
||
|
areaLayout2 = QGridLayout()
|
||
|
|
||
|
horizontalLayout = QHBoxLayout()
|
||
|
horizontalLayout.setObjectName("horizontalLayout")
|
||
|
|
||
|
# tableWidget = QTableWidget()
|
||
|
|
||
|
widget = QWidget()
|
||
|
widget.setLayout(areaLayout1)
|
||
|
|
||
|
widgetArea = QWidget()
|
||
|
widgetArea.setLayout(areaLayout2)
|
||
|
|
||
|
newbtn = QPushButton('New')
|
||
|
editbtn = QPushButton('修改')
|
||
|
delbth = QPushButton('删除')
|
||
|
|
||
|
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
|
||
|
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
|
||
|
|
||
|
horizontalLayout.addWidget(newbtn)
|
||
|
horizontalLayout.addItem(self.horizontalSpacer)
|
||
|
horizontalLayout.addWidget(editbtn)
|
||
|
horizontalLayout.addWidget(delbth)
|
||
|
|
||
|
newbtn.clicked.connect(lambda: self.newAreaWidget(sub_window))
|
||
|
editbtn.clicked.connect(self.editAreaWidget)
|
||
|
delbth.clicked.connect(self.deleteAreaWidget)
|
||
|
|
||
|
areaLayout1.addLayout(horizontalLayout, 0, 0, 1, 1)
|
||
|
areaLayout1.addWidget(widgetArea, 1, 0, 1, 1)
|
||
|
areaLayout1.addItem(self.verticalSpacer)
|
||
|
|
||
|
scroll_widget = QScrollArea()
|
||
|
scroll_widget.setWidgetResizable(True)
|
||
|
scroll_widget.setWidget(widget)
|
||
|
|
||
|
sub_window.setWindowTitle(windowTitle)
|
||
|
sub_window.setGeometry(100, 100, 400, 300)
|
||
|
sub_window.setWidget(scroll_widget)
|
||
|
|
||
|
self.mdi_area.addSubWindow(sub_window) # 将子窗口添加到MDI区域
|
||
|
# self.mdi_area.subWindowActivated.connect(self.adjustMdiAreaSize)
|
||
|
# self.sub_window.append(sub_window)
|
||
|
|
||
|
sub_window.show()
|
||
|
self.sub_windows.append(sub_window)
|
||
|
|
||
|
|
||
|
return sub_window
|
||
|
|
||
|
|
||
|
def createDeciveWidget(self):
|
||
|
dialog = DeviceDialog()
|
||
|
if dialog.exec_() == QDialog.Accepted:
|
||
|
deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit = dialog.getParameters()
|
||
|
windowTitle = deviceName + proType + ' ' + masterSlaveModel
|
||
|
DeviceDB().createDevice(deviceName = windowTitle, proType = proType, masterSlaveModel = masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit)
|
||
|
else:
|
||
|
return
|
||
|
|
||
|
self.areaWidget(windowTitle)
|
||
|
|
||
|
|
||
|
def newAreaWidget(self, sub_window):
|
||
|
|
||
|
deviceName = sub_window.windowTitle()
|
||
|
dialog = AreaSettingWidget()
|
||
|
if dialog.exec_() == QDialog.Accepted:
|
||
|
varType, channelNums, channelBytes = dialog.getParameters()
|
||
|
devices = Devices()
|
||
|
number = devices.getValueLength(deviceName)
|
||
|
devices.addAreas(varType, channelNums, channelBytes, deviceName)
|
||
|
self.devicesmanage.addDevice(deviceName, channelNums, channelBytes)
|
||
|
|
||
|
else:
|
||
|
return
|
||
|
layout = sub_window.widget().widget().layout().itemAt(1).widget().layout() #获取sub_window的widgetArea的areaLayout2
|
||
|
|
||
|
for i in range(int(channelNums)):
|
||
|
if (i + number) % 2 == 0:
|
||
|
layout.addWidget(QLabel(varType + str(i + 1 ) + ": " + channelBytes + 'Byte' ) , (i + number)//2, (i + number) % 2)
|
||
|
layout.addWidget(QLabel('0'), (i + number)//2, (i + number) % 2 + 1 )
|
||
|
layout.addWidget(QLineEdit('0'), (i + number)//2, (i + number) % 2 + 2 )
|
||
|
|
||
|
|
||
|
else:
|
||
|
layout.addWidget(QLabel(varType + str(i + 1 ) + ": " + channelBytes + 'Byte'), (i + number) // 2, (i + number) % 2 + 3)
|
||
|
layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 4)
|
||
|
layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 5)
|
||
|
|
||
|
layout.addItem(self.verticalSpacer)
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
def editAreaWidget(self):
|
||
|
l = len(self.area.masterValues)
|
||
|
for x in range(l):
|
||
|
self.labelText[x][0].setText(str(self.area.masterValues[x]))
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
def getTextValue(self):
|
||
|
for sub_window in self.sub_windows:
|
||
|
areaLayout = sub_window.widget().widget().layout().itemAt(1).widget().layout()
|
||
|
|
||
|
for row in range(areaLayout.rowCount()):
|
||
|
for column in range(areaLayout.columnCount()):
|
||
|
|
||
|
widget_item = areaLayout.itemAtPosition(row, column)
|
||
|
if widget_item is not None:
|
||
|
widget = widget_item.widget()
|
||
|
if isinstance(widget, QLineEdit):
|
||
|
line_edit_text = widget.text() # Get text from QLineEdit
|
||
|
concurrent_label = areaLayout.itemAtPosition(row, column - 1).widget()
|
||
|
proTypeLabel = areaLayout.itemAtPosition(row, column - 2).widget()
|
||
|
# if isinstance(proTypeLabel, QLabel) and (proTypeLabel.text().startswith('AI') or proTypeLabel.text().startswith('DI')):
|
||
|
# concurrent_label.setText(line_edit_text) # Set text to QLabel
|
||
|
self.lineEditText.append([widget, int(widget.text())])
|
||
|
self.labelText.append([concurrent_label, int(concurrent_label.text())])
|
||
|
|
||
|
for key in self.lineEditText:
|
||
|
value = key[1]
|
||
|
self.area.masterValues.append(value)
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
def startProtocol(self):
|
||
|
# self.area.getallAreaValue(self.sub_windows)
|
||
|
thread = MyThread(self.area)
|
||
|
thread.start()
|
||
|
|
||
|
|
||
|
def closeEvent(self, event):
|
||
|
pass
|
||
|
|
||
|
|
||
|
def deleteAreaWidget(self):
|
||
|
pass
|
||
|
|
||
|
|
||
|
|
||
|
class AreaQMdiSubWindow(QMdiSubWindow):
|
||
|
def __init__(self):
|
||
|
super().__init__()
|
||
|
self.number = 0
|
||
|
self.devicedb = DeviceDB()
|
||
|
def closeEvent(self, event):
|
||
|
self.devicedb.deleteDevice(deviceName = self.windowTitle())
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
app = QApplication(sys.argv)
|
||
|
Client.initDB()
|
||
|
window = MainWindow()
|
||
|
|
||
|
window.show()
|
||
|
sys.exit(app.exec_())
|