main
zhangxuxutm 2 years ago
parent 4c80453606
commit 2bf9940961

@ -1,7 +1,7 @@
from PyQt5.QtWidgets import QDialog, QFormLayout, QLineEdit, QComboBox, QDialogButtonBox, QApplication from PyQt5.QtWidgets import QDialog, QFormLayout, QLineEdit, QComboBox, QDialogButtonBox, QApplication, QMessageBox
import sys import sys
import re
class AreaSettingWidget(QDialog): class AreaSettingWidget(QDialog):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
@ -26,9 +26,11 @@ class AreaSettingWidget(QDialog):
button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
button_box.accepted.connect(self.accept) button_box.accepted.connect(self.check_input)
button_box.rejected.connect(self.reject) button_box.rejected.connect(self.reject)
layout.addRow(button_box) layout.addRow(button_box)
self.setLayout(layout) self.setLayout(layout)
@ -41,6 +43,16 @@ class AreaSettingWidget(QDialog):
return varType, channelNums, channelBytes return varType, channelNums, channelBytes
def check_input(self):
varType, channelNums, channelBytes = self.getParameters()
if not channelNums or not channelBytes:
QMessageBox.warning(self, '警告', '有值未输入。')
elif not re.match(r'^[-+]?\d*\.?\d*$', channelNums) or not re.match(r'^[-+]?\d*\.?\d*$', channelBytes):
QMessageBox.warning(self, '警告', '请输入数字。')
else:
self.accept() # 所有输入都是数字且不为空时接受对话框
if __name__ == '__main__': if __name__ == '__main__':
app = QApplication(sys.argv) app = QApplication(sys.argv)
window = AreaSettingWidget() window = AreaSettingWidget()

@ -1,7 +1,7 @@
from PyQt5.QtWidgets import QDialog, QFormLayout, QLineEdit, QComboBox, QDialogButtonBox from PyQt5.QtWidgets import QDialog, QFormLayout, QLineEdit, QComboBox, QDialogButtonBox, QMessageBox
import sys import sys
import re
class DeviceDialog(QDialog): class DeviceDialog(QDialog):
def __init__(self, parent=None): def __init__(self, parent=None):
super().__init__(parent) super().__init__(parent)
@ -37,13 +37,13 @@ class DeviceDialog(QDialog):
button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
button_box.accepted.connect(self.accept) button_box.accepted.connect(self.check_input)
button_box.rejected.connect(self.reject) button_box.rejected.connect(self.reject)
layout.addRow(button_box) layout.addRow(button_box)
self.setLayout(layout) self.setLayout(layout)
self.setWindowTitle("Input Parameters") self.setWindowTitle("设备信息")
def getParameters(self): def getParameters(self):
proType = self.findChild(QComboBox, "ProtocolType").currentText() proType = self.findChild(QComboBox, "ProtocolType").currentText()
@ -53,3 +53,15 @@ class DeviceDialog(QDialog):
pvLowerLimit = self.findChild(QLineEdit, "pvLowerLimit").text() pvLowerLimit = self.findChild(QLineEdit, "pvLowerLimit").text()
pvUnit = self.findChild(QLineEdit, "pvUnit").text() pvUnit = self.findChild(QLineEdit, "pvUnit").text()
return deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit return deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit
def check_input(self):
deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit = self.getParameters()
if not pvUpperLimit or not pvLowerLimit or not pvUnit or not deviceName:
QMessageBox.warning(self, '警告', '有值未输入。')
elif not re.match(r'^[-+]?\d*\.?\d*$', pvUpperLimit) or not re.match(r'^[-+]?\d*\.?\d*$', pvLowerLimit):
QMessageBox.warning(self, '警告', '请输入数字。')
elif pvUpperLimit < pvLowerLimit:
QMessageBox.warning(self, '警告', '量程输入有误。')
else:
self.accept() # 所有输入都是数字且不为空时接受对话框

@ -7,28 +7,27 @@ from PyQt5.QtWidgets import QApplication, QMainWindow, QToolBar, QMdiArea, QActi
QMdiSubWindow, QDialogButtonBox, QWidget, QComboBox, QTabBar, QTabWidget, QGridLayout, QLabel, QPushButton, QSpacerItem, QSizePolicy, QHBoxLayout, QTableWidget, QScrollArea QMdiSubWindow, QDialogButtonBox, QWidget, QComboBox, QTabBar, QTabWidget, QGridLayout, QLabel, QPushButton, QSpacerItem, QSizePolicy, QHBoxLayout, QTableWidget, QScrollArea
from PyQt5 import QtCore from PyQt5 import QtCore
from DeviceWidget import * from DeviceWidget import *
from AreaWidget import AreaWidget
from UI.AreaSettingWidget import AreaSettingWidget from UI.AreaSettingWidget import AreaSettingWidget
from model.ProjectModel.AreaManage import Devices, DevicesManange, Area from UI.DelAreaWidget import DelAreaWidget
# from model.ProjectModel.AreaManage import Devices, DevicesManange, Area
from protocol.ModBus.ModBusThread import MyThread from protocol.ModBus.ModBusThread import MyThread
from utils.DBModels.BaseModel import * from utils.DBModels.BaseModel import *
from utils.DBModels.ClientModels import DeviceDB # from utils.DBModels.ClientModels import DeviceDB
from model.ClientModel.Client import Client # from model.ClientModel.Client import Client
class MainWindow(QMainWindow): class MainWindow(QMainWindow):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.initUI()
self.area = Area()
self.number = 0
self.labelText = []
self.lineEditText = []
self.devicesmanage = DevicesManange()
self.sub_windows = []
self.initAreaWidget()
self.getTextValue()
self.sub_windows = [] #存储设备widget
self.nowValue = [] #储存当前值
self.areaLabel = [] #存储通道信息文本
# self.initAreaWidget()
self.number = 0
self.initUI()
def initUI(self): def initUI(self):
self.toolbar = QToolBar() self.toolbar = QToolBar()
@ -54,49 +53,49 @@ class MainWindow(QMainWindow):
# self.mdi_area.setTabsMovable(True) # self.mdi_area.setTabsMovable(True)
self.setWindowTitle("Main Window") self.setWindowTitle("PROFIBUS")
self.setGeometry(1000, 500, 800, 600) self.setGeometry(1000, 500, 800, 600)
def initAreaWidget(self): # def initAreaWidget(self):
alldevices = Devices().getAllDevice() # alldevices = Devices().getAllDevice()
#
for devices in alldevices: # for devices in alldevices:
layout = self.deviceWidget(devices[0]).widget().widget().layout().itemAt(1).widget().layout() # layout = self.deviceWidget(devices[0]).widget().widget().layout().itemAt(1).widget().layout()
areas = devices[3] # areas = devices[3]
number = 0 # number = 0
masterSlaveModel = devices[2] # masterSlaveModel = devices[2]
if areas is not None: # if areas is not None:
areas = json.loads(areas) # areas = json.loads(areas)
for area in areas: # for area in areas:
varType = area["type"] # varType = area["type"]
channelNums = area["nums"] # channelNums = area["nums"]
channelBytes = area["bytes"] # channelBytes = area["bytes"]
for i in range(int(channelNums)): # for i in range(int(channelNums)):
if masterSlaveModel == '主站': # if masterSlaveModel == '主站':
if (i + number) % 2 == 0: # if (i + number) % 2 == 0:
layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2, # layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2,
(i + number) % 2) # (i + number) % 2)
layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 1) # layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 1)
layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 2) # layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 2)
#
else: # else:
layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2, # layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2,
(i + number) % 2 + 3) # (i + number) % 2 + 3)
layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 4) # layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 4)
layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 5) # layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 5)
else: # else:
if (i + number) % 2 == 0: # if (i + number) % 2 == 0:
layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2, # layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2,
(i + number) % 2) # (i + number) % 2)
layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 1) # layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 1)
layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 2) # layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 2)
else: # else:
layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2, # layout.addWidget(QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte'), (i + number) // 2,
(i + number) % 2 + 3) # (i + number) % 2 + 3)
layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 4) # layout.addWidget(QLabel('0'), (i + number) // 2, (i + number) % 2 + 4)
layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 5) # layout.addWidget(QLineEdit('0'), (i + number) // 2, (i + number) % 2 + 5)
#
number = number + int(channelNums) # number = number + int(channelNums)
def deviceWidget(self, windowTitle): def deviceWidget(self, windowTitle):
@ -116,7 +115,6 @@ class MainWindow(QMainWindow):
widgetArea.setLayout(areaLayout2) widgetArea.setLayout(areaLayout2)
newbtn = QPushButton('New') newbtn = QPushButton('New')
editbtn = QPushButton('修改')
delbth = QPushButton('删除') delbth = QPushButton('删除')
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
@ -124,12 +122,10 @@ class MainWindow(QMainWindow):
horizontalLayout.addWidget(newbtn) horizontalLayout.addWidget(newbtn)
horizontalLayout.addItem(self.horizontalSpacer) horizontalLayout.addItem(self.horizontalSpacer)
horizontalLayout.addWidget(editbtn)
horizontalLayout.addWidget(delbth) horizontalLayout.addWidget(delbth)
newbtn.clicked.connect(lambda: self.newAreaWidget(sub_window)) newbtn.clicked.connect(lambda: self.newAreaWidget(sub_window))
editbtn.clicked.connect(self.editAreaWidget) delbth.clicked.connect(lambda: self.delAreaWidget(sub_window))
delbth.clicked.connect(self.deleteAreaWidget)
areaLayout1.addLayout(horizontalLayout, 0, 0, 1, 1) areaLayout1.addLayout(horizontalLayout, 0, 0, 1, 1)
areaLayout1.addWidget(widgetArea, 1, 0, 1, 1) areaLayout1.addWidget(widgetArea, 1, 0, 1, 1)
@ -140,12 +136,12 @@ class MainWindow(QMainWindow):
scroll_widget.setWidget(widget) scroll_widget.setWidget(widget)
sub_window.setWindowTitle(windowTitle) sub_window.setWindowTitle(windowTitle)
sub_window.setGeometry(100, 100, 400, 300) sub_window.setGeometry(0, 0, 600, 500)
sub_window.setWidget(scroll_widget) sub_window.setWidget(scroll_widget)
self.mdi_area.addSubWindow(sub_window) # 将子窗口添加到MDI区域 self.mdi_area.addSubWindow(sub_window) # 将子窗口添加到MDI区域
# self.mdi_area.subWindowActivated.connect(self.adjustMdiAreaSize) # self.mdi_area.subWindowActivated.connect(self.adjustMdiAreaSize)
# self.sub_window.append(sub_window)
sub_window.show() sub_window.show()
self.sub_windows.append(sub_window) self.sub_windows.append(sub_window)
@ -158,77 +154,116 @@ class MainWindow(QMainWindow):
dialog = DeviceDialog() dialog = DeviceDialog()
if dialog.exec_() == QDialog.Accepted: if dialog.exec_() == QDialog.Accepted:
deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit = dialog.getParameters() deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit = dialog.getParameters()
windowTitle = deviceName + proType + ' ' + masterSlaveModel windowTitle = deviceName + ' ' + proType + masterSlaveModel + ' ' + pvLowerLimit + '-' + pvUpperLimit + pvUnit
DeviceDB().createDevice(deviceName = windowTitle, proType = proType, masterSlaveModel = masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit) # DeviceDB().createDevice(deviceName = windowTitle, proType = proType, masterSlaveModel = masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit)
else: else:
return return
self.areaWidget(windowTitle) self.deviceWidget(windowTitle)
def newAreaWidget(self, sub_window): def newAreaWidget(self, sub_window):
deviceName = sub_window.windowTitle() deviceName = sub_window.windowTitle()
dialog = AreaSettingWidget() dialog = AreaSettingWidget()
if dialog.exec_() == QDialog.Accepted: if dialog.exec_() == QDialog.Accepted:
varType, channelNums, channelBytes = dialog.getParameters() varType, channelNums, channelBytes = dialog.getParameters()
devices = Devices() # devices = Devices()
number = devices.getValueLength(deviceName) # number = devices.getValueLength(deviceName)
devices.addAreas(varType, channelNums, channelBytes, deviceName) # devices.addAreas(varType, channelNums, channelBytes, deviceName)
self.devicesmanage.addDevice(deviceName, channelNums, channelBytes) # self.devicesmanage.addDevice(deviceName, channelNums, channelBytes)
else: else:
return return
layout = sub_window.widget().widget().layout().itemAt(1).widget().layout() #获取sub_window的widgetArea的areaLayout2 layout = sub_window.widget().widget().layout().itemAt(1).widget().layout() #获取sub_window的widgetArea的areaLayout2
number = self.number #待从数据库获取具体的数据
for i in range(int(channelNums)): for i in range(int(channelNums)):
if (i + number) % 2 == 0: if (i + number) % 2 == 0:
layout.addWidget(QLabel(varType + str(i + 1 ) + ": " + channelBytes + 'Byte' ) , (i + number)//2, (i + number) % 2) areaLabel = QLabel(varType + str(i + 1 ) + ": " + channelBytes + 'Byte' )
layout.addWidget(QLabel('0'), (i + number)//2, (i + number) % 2 + 1 ) areaLabel2 =QLabel('0')
layout.addWidget(QLineEdit('0'), (i + number)//2, (i + number) % 2 + 2 ) areaLineEdit = QLineEdit('0')
editbtn = QPushButton('强制')
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)
layout.addWidget(areaLabel , (i + number)//2, (i + number) % 2)
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)
editbtn.clicked.connect(lambda checked, btn=editbtn: self.forceEdit(btn))
self.nowValue.append([deviceName, layout, i+1, editbtn, areaLabel2, areaLineEdit, (i + number)//2, (i + number) % 2 + 1])
self.areaLabel.append([deviceName, i+1, areaLabel, (i + number)//2, (i + number) % 2])
else:
def editAreaWidget(self): areaLabel = QLabel(varType + str(i + 1) + ": " + channelBytes + 'Byte')
l = len(self.area.masterValues) areaLabel2 = QLabel('0')
for x in range(l): areaLineEdit = QLineEdit('0')
self.labelText[x][0].setText(str(self.area.masterValues[x])) 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))
self.nowValue.append([deviceName, layout, i + 1, editbtn, areaLabel2, areaLineEdit, (i + number) // 2, (i + number) % 2 + 4])
self.areaLabel.append([deviceName, i + 1, areaLabel, (i + number) // 2, (i + number) % 2 + 3])
self.number += int(channelNums)
def forceEdit(self, btn):
for item in self.nowValue:
if btn in item:
item[4].setText(item[5].text())
def delAreaWidget(self, sub_window):
subwindow = sub_window
if self.areaLabel:
self.deviceName = subwindow.windowTitle()
delAreaWidget = DelAreaWidget(self.areaLabel, self.deviceName)
rowAndColumn = delAreaWidget.getDelAreaRowAndColunm()
self.getAreaWidget(rowAndColumn, subwindow)
else:
return
def getTextValue(self): def getAreaWidget(self, rowAndColumn, sub_window):
for sub_window in self.sub_windows: rowAndColumns = rowAndColumn
areaLayout = sub_window.widget().widget().layout().itemAt(1).widget().layout() subwindow = sub_window
areaLayout = subwindow.widget().widget().layout().itemAt(1).widget().layout()
for rowAndColumn in rowAndColumns:
print(rowAndColumn)
row = rowAndColumn[0]
column = rowAndColumn[1]
print(row,column)
if column == 0:
for i in range(4):
widget = areaLayout.itemAtPosition(row, i).widget()
print(widget)
areaLayout.removeWidget(widget)
widget.deleteLater()
#删除self.areaLabel列表中的对象
for label in self.areaLabel:
if widget in label:
self.areaLabel.remove(label)
else:
for i in range(4,8):
widget = areaLayout.itemAtPosition(row, i).widget()
print(widget)
areaLayout.removeWidget(widget)
widget.deleteLater()
# 删除self.areaLabel列表中的对象
for label in self.areaLabel:
if widget in label:
self.areaLabel.remove(label)
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)
@ -252,9 +287,9 @@ class AreaQMdiSubWindow(QMdiSubWindow):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.number = 0 self.number = 0
self.devicedb = DeviceDB()
def closeEvent(self, event): def closeEvent(self, event):
self.devicedb.deleteDevice(deviceName = self.windowTitle()) pass
# self.devicedb.deleteDevice(deviceName = self.windowTitle())
@ -263,7 +298,7 @@ class AreaQMdiSubWindow(QMdiSubWindow):
if __name__ == '__main__': if __name__ == '__main__':
app = QApplication(sys.argv) app = QApplication(sys.argv)
Client.initDB() # Client.initDB()
window = MainWindow() window = MainWindow()
window.show() window.show()

@ -8,7 +8,7 @@ from PyQt5.QtWidgets import QApplication, QMainWindow, QToolBar, QMdiArea, QActi
from model.ProjectModel.DeviceManage import DevicesManange from model.ProjectModel.DeviceManage import DevicesManange
from protocol.ModBus.TCPMaster import TcpMaster from protocol.ModBus.TCPMaster import TcpMaster
from utils.DBModels.ClientModels import DeviceDB # from utils.DBModels.ClientModels import DeviceDB
jsonCon = json.dumps([{ jsonCon = json.dumps([{
"id": 0, "id": 0,

Loading…
Cancel
Save