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

368 lines
12 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
2 years ago
from PyQt5.QtGui import QPixmap, QIcon
2 years ago
from UI.DeviceWidget import DeviceDialog
2 years ago
from UI.AreaSettingWidget import AreaSettingWidget
2 years ago
from UI.DelAreaWidget import DelAreaWidget
2 years ago
from model.ProjectModel.DeviceManage import DevicesManange, Device
2 years ago
from protocol.ModBus.ModBusThread import MyThread
from utils.DBModels.BaseModel import *
2 years ago
from utils.DBModels.DeviceModels import DeviceDB
from model.ClientModel.Client import Client
2 years ago
class CommonHelper:
def __init__(self):
pass
@staticmethod
def readQss(style):
with open(style,"r") as f:
return f.read()
2 years ago
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
2 years ago
self.sub_windows = [] #存储设备widget
self.nowValue = [] #储存当前值
self.areaLabel = [] #存储通道信息文本
2 years ago
self.arealist = {}
self.widgetList= []
2 years ago
self.arealists = []
2 years ago
self.initUI()
2 years ago
self.initAreaWidget()
2 years ago
def initUI(self):
self.toolbar = QToolBar()
self.addToolBar(self.toolbar)
# self.setWindowState(self.windowState() | QtCore.Qt.WindowMaximized)
self.action1 = QAction("添加设备", self)
2 years ago
self.action1.setObjectName("action1")
2 years ago
self.action1.triggered.connect(self.createDeciveWidget)
self.action2 = QAction("开始通讯", self)
2 years ago
self.action2.setObjectName("action2")
2 years ago
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)
2 years ago
self.setWindowIcon(QIcon('Static/zhjt.ico'))
2 years ago
# self.mdi_area.setViewMode(QMdiArea.TabbedView)
# self.mdi_area.setTabsClosable(False)
# self.mdi_area.setTabsMovable(True)
2 years ago
self.setWindowTitle("PROFIBUS")
2 years ago
self.setGeometry(1000, 500, 800, 600)
def deviceWidget(self, windowTitle):
2 years ago
sub_window = AreaQMdiSubWindow()# 创建一个子窗口
sub_window.setObjectName('sub_window')
2 years ago
areaLayout1 = QGridLayout()
areaLayout2 = QGridLayout()
horizontalLayout = QHBoxLayout()
horizontalLayout.setObjectName("horizontalLayout")
# tableWidget = QTableWidget()
widget = QWidget()
widget.setLayout(areaLayout1)
widgetArea = QWidget()
widgetArea.setLayout(areaLayout2)
2 years ago
newbtn = QPushButton('添加通道')
delbth = QPushButton('删除通道')
2 years ago
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(delbth)
newbtn.clicked.connect(lambda: self.newAreaWidget(sub_window))
2 years ago
delbth.clicked.connect(lambda: self.delAreaWidget(sub_window))
2 years ago
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)
2 years ago
sub_window.setGeometry(0, 0, 600, 500)
2 years ago
sub_window.setWidget(scroll_widget)
2 years ago
sub_window.setWindowIcon(QIcon('Static/zhjt.ico'))
2 years ago
self.mdi_area.addSubWindow(sub_window) # 将子窗口添加到MDI区域
# self.mdi_area.subWindowActivated.connect(self.adjustMdiAreaSize)
2 years ago
2 years ago
sub_window.show()
self.sub_windows.append(sub_window)
return sub_window
2 years ago
def initAreaWidget(self):
alldevices = DevicesManange().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]
deviceName = devices[0]
if areas is not None:
areas = json.loads(areas)
for area in areas:
varType = area["type"]
channelNums = area["nums"]
channelBytes = area["bytes"]
areaID = area['id']
2 years ago
print(masterSlaveModel)
2 years ago
if masterSlaveModel == '主站':
self.addChannelWidget(deviceName, number, channelNums, channelBytes, varType, layout, areaID)
else:
self.addChannelWidget(deviceName, number, channelNums, channelBytes, varType, layout, areaID)
number = number + int(channelNums)
2 years ago
self.nowValue.append(self.arealist)
print(self.nowValue, 'aaaaaa')
2 years ago
2 years ago
def createDeciveWidget(self):
dialog = DeviceDialog()
if dialog.exec_() == QDialog.Accepted:
deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit = dialog.getParameters()
2 years ago
windowTitle = deviceName + ' ' + proType + masterSlaveModel + ' ' + pvLowerLimit + '-' + pvUpperLimit + pvUnit
2 years ago
DeviceDB().addDevice(deviceName = windowTitle, proType = proType, masterSlaveModel = masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit)
2 years ago
else:
return
2 years ago
self.deviceWidget(windowTitle)
2 years ago
def newAreaWidget(self, sub_window):
deviceName = sub_window.windowTitle()
2 years ago
2 years ago
dialog = AreaSettingWidget()
if dialog.exec_() == QDialog.Accepted:
varType, channelNums, channelBytes = dialog.getParameters()
2 years ago
number = DevicesManange.getChannelLength(deviceName)
Device().addAreas(varType, channelNums, channelBytes, deviceName)
areaId = Device().getAreaID(deviceName)[-1]
# Device().addDevice(deviceName, channelNums, channelBytes)
2 years ago
else:
return
layout = sub_window.widget().widget().layout().itemAt(1).widget().layout() #获取sub_window的widgetArea的areaLayout2
2 years ago
self.addChannelWidget(deviceName, number, channelNums, channelBytes, varType, layout, areaId)
2 years ago
2 years ago
number += int(channelNums)
2 years ago
# self.nowValue.append(self.arealist)
2 years ago
def addChannelWidget(self,deviceNames, numbers, channelNums, channelBytes , varTypes, layouts ,ID):
deviceName = deviceNames
number = numbers
channelNum = channelNums
channelByte = channelBytes
varType = varTypes
layout = layouts
ID = ID
widgetList = []
2 years ago
2 years ago
for i in range(int(channelNum)):
2 years ago
if (i + number) % 2 == 0:
2 years ago
areaLabel = QLabel(varType + str(i + 1 ) + ": " + channelByte + 'Byte' )
2 years ago
areaLabel2 =QLabel('0')
areaLineEdit = QLineEdit('0')
editbtn = QPushButton('强制')
2 years ago
2 years ago
layout.addWidget(areaLabel, (i + number)//2, (i + number) % 2)
2 years ago
layout.addWidget(areaLabel2, (i + number)//2, (i + number) % 2 + 1 )
layout.addWidget(areaLineEdit, (i + number)//2, (i + number) % 2 + 2 )
layout.addWidget(editbtn, (i + number) // 2, (i + number) % 2 + 3)
2 years ago
2 years ago
editbtn.clicked.connect(lambda checked, btn=editbtn: self.forceEdit(btn))
2 years ago
widgetList.append([layout, ID, editbtn, areaLabel, areaLabel2, areaLineEdit])
# self.nowValue.append([deviceName, layout, ID, editbtn, areaLabel, areaLabel2, areaLineEdit, (i + number)//2, (i + number) % 2 + 1])
2 years ago
2 years ago
else:
2 years ago
areaLabel = QLabel(varType + str(i + 1) + ": " + channelByte + 'Byte')
2 years ago
areaLabel2 = QLabel('0')
areaLineEdit = QLineEdit('0')
editbtn = QPushButton('强制')
layout.addWidget(areaLabel, (i + number) // 2, (i + number) % 2 + 3)
layout.addWidget(areaLabel2, (i + number) // 2, (i + number) % 2 + 4)
layout.addWidget(areaLineEdit, (i + number) // 2, (i + number) % 2 + 5)
layout.addWidget(editbtn, (i + number) // 2, (i + number) % 2 + 6)
editbtn.clicked.connect(lambda checked, btn=editbtn: self.forceEdit(btn))
2 years ago
widgetList.append([layout, ID, editbtn, areaLabel, areaLabel2, areaLineEdit])
2 years ago
self.arealists.append(widgetList)
self.arealist[deviceName] = self.arealists
2 years ago
2 years ago
# self.nowValue.append([deviceName, layout, ID, editbtn, areaLabel, areaLabel2, areaLineEdit, (i + number) // 2, (i + number) % 2 + 4])
2 years ago
2 years ago
2 years ago
def forceEdit(self, btn):
pass
# for item in self.nowValue:
# if btn in item:
# item[4].setText(item[5].text())
2 years ago
def delAreaWidget(self, sub_window):
subwindow = sub_window
2 years ago
if self.nowValue:
2 years ago
self.deviceName = subwindow.windowTitle()
2 years ago
delAreaWidget = DelAreaWidget(self.deviceName)
if delAreaWidget.exec_() == QDialog.Accepted:
rowAndColumn = delAreaWidget.getDelAreaRowAndColunm()
if rowAndColumn == []:
return
else:
self.getAreaWidget(rowAndColumn, subwindow)
Device().delAreas(self.deviceName,rowAndColumn)
else:
return
2 years ago
else:
return
2 years ago
2 years ago
def getAreaWidget(self, rowAndColumn, sub_window):
subwindow = sub_window
areaLayout = subwindow.widget().widget().layout().itemAt(1).widget().layout()
2 years ago
deviceName = subwindow.windowTitle()
2 years ago
print(self.nowValue,'old')
2 years ago
for areaId in rowAndColumn:
for devicelist in self.nowValue:
areas = devicelist[deviceName]
area = areas[areaId - 1]
2 years ago
for are in area:
for widget in range(2, 6):
areaLayout.removeWidget(are[widget])
are[widget].deleteLater()
areas.remove(area)
print(self.nowValue, 'now')
2 years ago
# for area in areas:
# for widget in range(2, 6):
# print(widget)
# print(area[widget])
# area[widget].deleteLater()
# areaLayout.removeWidget(area[widget])
# self.nowValue.remove(areaS)
# # print(self.nowValue)
# print(rowAndColumn,'sssss')
# for areaId in rowAndColumn:
# for nowWidget in self.nowValue:
# if nowWidget[0] == deviceName and nowWidget[2] == areaId:
# for widget in range(3, 7):
#
# areaLayout.removeWidget(nowWidget[widget])
# nowWidget[widget].deleteLater()
# delAreaWidgetList.append(nowWidget)
# for widget in delAreaWidgetList: #从列表中删除已删除的部件
# self.nowValue.remove(widget)
#重置area的id
# i = 1
# j = 1
# for nowWidget in self.nowValue:
# if nowWidget[0] == deviceName:
# if nowWidget[2] == j:
# index = nowWidget.index(nowWidget[2])
# nowWidget[index] = i
# else:
# j = nowWidget[2]
# i += 1
# index = nowWidget.index(nowWidget[2])
# nowWidget[index] = i
2 years ago
def startProtocol(self):
2 years ago
a = []
for i in range(len(self.nowValue)):
a.append(i)
for i in a :
for j in self.nowValue:
j[5].setText(str(i))
print(a)
2 years ago
def closeEvent(self, event):
pass
def deleteAreaWidget(self):
pass
class AreaQMdiSubWindow(QMdiSubWindow):
def __init__(self):
super().__init__()
self.number = 0
def closeEvent(self, event):
2 years ago
DeviceDB.deleteDevice(deviceName = self.windowTitle())
2 years ago
if __name__ == '__main__':
app = QApplication(sys.argv)
2 years ago
Client.initDB()
2 years ago
window = MainWindow()
window.show()
sys.exit(app.exec_())