0323Update

main
parent 6a3be48317
commit c9c1a15bdb

@ -151,6 +151,11 @@ QLabel#areaMessLabel, QLabel#areaValueLabel{
}
QLabel#massesageLabel{
font-size: 23px;
}
QLabel#areaValueLabel{
color: #0160aa;

@ -99,7 +99,7 @@ QDockWidget::title{
}
QPushButton#startProtocolBtn, QPushButton#switchBtn{
QPushButton#startProtocolBtn, QPushButton#switchBtn, QPushButton#switchTouchBtn{
font-size: 20px;
@ -109,7 +109,7 @@ QPushButton#startProtocolBtn, QPushButton#switchBtn{
}
QPushButton#startProtocolBtn:hover, QPushButton#switchBtn:hover{
QPushButton#startProtocolBtn:hover, QPushButton#switchBtn:hover, QPushButton#switchTouchBtn::hover{
font-size: 20px;
@ -123,7 +123,7 @@ QPushButton#startProtocolBtn:hover, QPushButton#switchBtn:hover{
}
QPushButton#startProtocolBtn:checked, QPushButton#switchBtn:checked{
QPushButton#startProtocolBtn:checked, QPushButton#switchBtn:checked, QPushButton#switchTouchBtn:checked{
font-size: 20px;
@ -185,3 +185,41 @@ QProgressBar::chunk {
width: 20px;
}
QRadioButton#valueRadio{
color: black;
font-size: 25px;
font-family: ".SFNSDisplay-Regular";
font: bold;
}
QRadioButton#valueRadio::indicator:enabled:checked{
image: url(Static/radioOn.png);
}
QRadioButton#valueRadio::indicator:enabled:unchecked{
image: url(Static/radioOff.png);
}
QRadioButton#valueRadio::indicator:disabled:unchecked{
image: url(Static/radioDisableOff.png);
}
QRadioButton#valueRadio::indicator:disabled:checked{
image: url(Static/radioDisableOn.png);
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 708 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 523 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 719 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 B

@ -16,6 +16,8 @@ from model.ProjectModel.DeviceManage import Device, DevicesManange
from UI.RightAreaWidget import RightAreaWidgets
from utils.DBModels.DeviceModels import DeviceDB
from UI.SoftKeyBoardEdit import SoftKeyBoardEdit
class AreaTabWidget(QTabWidget):
@ -181,12 +183,12 @@ class AreaWidget(QWidget):
self.byteLineLabel = QLabel('字节长度:')
self.byteLineLabel.setObjectName('byteLineLabel')
# self.byteLineLabel.setFixedSize(90, 27)
self.byteLineEdit = QLineEdit()
self.byteLineEdit = SoftKeyBoardEdit()
self.byteLineEdit.setPlaceholderText('字节长度')
self.byteLineEdit.setObjectName('byteLineEdit')
# self.byteLineEdit.setFixedSize(90, 27)
self.okBtn = QPushButton('确定')
self.okBtn = QPushButton('保存')
# self.okBtn.setFixedSize(90, 27)
self.okBtn.setObjectName('okBtn')
self.okBtn.setIcon(qtawesome.icon('fa.pencil', color='#4c8cf2'))
@ -262,7 +264,7 @@ class AreaWidget(QWidget):
# 只点击了新建区域按钮,未点击确定按钮时,直接点击删除按钮的删除情况
index = self.areaTabWidget.currentIndex()
tabCount = self.areaTabWidget.count()
if self.okBtn.text() == '确定':
if self.okBtn.text() == '保存':
if index != -1:
self.areaTabWidget.removeTab(index)

@ -57,18 +57,26 @@ class DeviceDialog(QDialog):
def checkInput(self):
titleName, pvUpperLimit, pvLowerLimit, pvUnit = self.getParameters()
deviceName = titleName + self.dataTypeAndModel
if not pvUpperLimit or not pvLowerLimit or not pvUnit or not deviceName:
QMessageBox.warning(self, '警告', '有值未输入。')
if not pvUpperLimit and not pvLowerLimit and not pvUnit:
pass
else:
if not pvUpperLimit or not pvLowerLimit or not pvUnit:
QMessageBox.warning(self, '警告', '有值未输入。')
return
if not re.match(r'^[-+]?\d*\.?\d*$', pvUpperLimit) or not re.match(r'^[-+]?\d*\.?\d*$', pvLowerLimit):
QMessageBox.warning(self, '警告', '请输入数字。')
return
if float(pvUpperLimit) <= float(pvLowerLimit):
QMessageBox.warning(self, '警告', '量程输入有误。')
return
if not deviceName:
QMessageBox.warning(self, '警告', '请输入设备名。')
return
elif DeviceDB.getByName(deviceName):
# print(DeviceDB.getByName(deviceName),2343)
QMessageBox.warning(self, '警告', '设备名重复')
return
elif not re.match(r'^[-+]?\d*\.?\d*$', pvUpperLimit) or not re.match(r'^[-+]?\d*\.?\d*$', pvLowerLimit):
QMessageBox.warning(self, '警告', '请输入数字。')
return
elif float(pvUpperLimit) <= float(pvLowerLimit):
QMessageBox.warning(self, '警告', '量程输入有误。')
return
else:
self.accept() # 所有输入都是数字且不为空时接受对话框

@ -23,6 +23,9 @@ from PyQt5.QtWidgets import QApplication, QMainWindow, QProgressBar, QVBoxLayout
from PyQt5.QtCore import Qt, QRect, QSize
from PyQt5.QtGui import QPainter, QFont, QColor
from utils import Globals
class CustomProgressBar(QProgressBar):
def __init__(self, parent=None):
super().__init__(parent)
@ -40,6 +43,7 @@ class CustomProgressBar(QProgressBar):
def getHwndByPid(pid):
def callback(hwnd, hwnds):
if hwnd is not None and win32gui.IsWindowVisible(hwnd):
@ -112,8 +116,16 @@ class MainWindow(QWidget):
self.batteryStateLabel = QLabel()
self.batteryStateLabel.setObjectName('batteryLabel')
self.switchTouchBtn = QPushButton("触控模式")
self.switchTouchBtn.setIconSize(QSize(20, 20))
self.switchTouchBtn.setObjectName('switchTouchBtn')
self.switchTouchBtn.setIcon(qtawesome.icon('fa.keyboard-o', color='#1fbb6f'))
self.switchTouchBtn.clicked.connect(self.switchTouchMode)
self.switchTouchBtn.setCheckable(True)
toolbarLayout.addWidget(self.startProtocolBtn, 1)
toolbarLayout.addWidget(self.switchBtn, 1)
toolbarLayout.addWidget(self.switchTouchBtn, 1)
toolbarLayout.addWidget(QWidget(), 20)
# toolbarLayout.addWidget(QLabel('电量:'), 1)
toolbarLayout.addWidget(self.batteryProBar, 1)
@ -160,12 +172,14 @@ class MainWindow(QWidget):
self.refreshProgressBar()
self.devicesManange.connect()
# self.resize(800, 600)
# self.showMaximized()
def startProtocol(self):
if self.startProtocolBtn.isChecked():
self.devicesManange.connect()
self.startProtocolBtn.setText('停止通讯')
self.startProtocolBtn.setIcon(QIcon('Static/pause.png'))
self.startProtocolBtn.setIconSize(QSize(22, 22))
@ -235,6 +249,7 @@ class MainWindow(QWidget):
self.process = subprocess.Popen("D:\\EnTalk PROFIBUS Manager\\DP.exe",startupinfo=startupInfo)
QTimer.singleShot(500, lambda:self.showLowerWidget(self.process))
self.switchBtn.setText('变量读写')
self.showMaximized()
# self.switchBtn.setIcon(QIcon('Static/varMagH.png'))
else:
# self.stackWidget.setCurrentIndex(1)
@ -272,6 +287,17 @@ class MainWindow(QWidget):
self.process.kill()
self.batteryManange.close()
def switchTouchMode(self):
if self.switchTouchBtn.isChecked():
Globals.setValue('_touchMode', 1)
self.switchTouchBtn.setText('键盘模式')
else:
Globals.setValue('_touchMode', 0)
self.switchTouchBtn.setText('触控模式')
if __name__ == '__main__':
app = QApplication(sys.argv)
Client.initDB()

@ -1,10 +1,12 @@
import re
from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel, QPushButton, QLayout, \
QHBoxLayout, QComboBox, QLineEdit, QSpacerItem, QSizePolicy, QGridLayout, QMessageBox, QSplitter, QFrame
QHBoxLayout, QComboBox, QLineEdit, QSpacerItem, QSizePolicy, QGridLayout, QMessageBox, QSplitter, QFrame, QRadioButton
from PyQt5.QtCore import Qt
class forceButton(QPushButton):
from UI.SoftKeyBoardEdit import SoftKeyBoardEdit
class ForceButton(QPushButton):
def __init__(self, number = None, valueLabel = None, valueEdit = None):
super().__init__()
self.valueEdit = valueEdit
@ -13,6 +15,11 @@ class forceButton(QPushButton):
self.setObjectName('forceBtn')
self.setText('强制')
class ForceRadioButton(QRadioButton):
def __init__(self, number = None):
super().__init__()
self.number = number
class RightAreaWidgets(QWidget):
def __init__(self, areaWidget, order, byteLineEdit, dataType, deviceName):
super().__init__()
@ -24,6 +31,12 @@ class RightAreaWidgets(QWidget):
self.byteLineEdit = byteLineEdit
self.dataType = dataType
self.deviceName = deviceName
if '主站' in self.deviceName and self.dataType == 'AI' or ('从站' in self.deviceName and self.dataType == 'AO'):
self.force = False
elif '主站' in self.deviceName and self.dataType == 'DI' or ('从站' in self.deviceName and self.dataType == 'DO'):
self.force = False
else:
self.force = True
self.addLayout()
# self.setStyleSheet("background-color: black")
@ -40,7 +53,7 @@ class RightAreaWidgets(QWidget):
if self.dataType in ['AI','AO']:
hLayout = QHBoxLayout()
hLayout.addWidget(QSplitter())
hLayout.addLayout(self.dateLayout(1))
hLayout.addLayout(self.dateLayout(0))
hLayout.addWidget(QSplitter())
areaLayout.addWidget(QSplitter())
areaLayout.addLayout(hLayout)
@ -51,58 +64,67 @@ class RightAreaWidgets(QWidget):
for i in range(int(byteLineEdit)):
hLayout = QHBoxLayout()
hLayout.addWidget(QSplitter(), 1)
hLayout.addLayout(self.dateLayout(number = (i + 1)), 3)
hLayout.addLayout(self.dateLayout(number = (i), isAnalog = False), 3)
hLayout.addWidget(QSplitter(), 1)
hLayout.addLayout(self.dateLayout(number = (i + 1) + 8), 3)
hLayout.addLayout(self.dateLayout(number = (i) + 8, isAnalog = False), 3)
hLayout.addWidget(QSplitter(), 1)
areaLayout.addLayout(hLayout)
areaLayout.addWidget(QSplitter())
return areaLayout
def dateLayout(self, number, force = True):
number = number
forceLayout = QHBoxLayout()
forceLayout.setContentsMargins(0, 0, 0, 0)
areaMessLabel = QLabel(str(self.dataType) + "{:<{}}".format(str(number), 2) + ": " + '字节长度: ' + str(self.byteLineEdit) + ' 当前值:' )
areaMessLabel.setObjectName('areaMessLabel')
areaValueLabel = QLabel('0')
areaValueLabel.setObjectName('areaValueLabel')
forceLayout.addWidget(areaMessLabel)
forceLayout.addWidget(areaValueLabel)
if '主站' in self.deviceName and self.dataType == 'AI' or ('从站' in self.deviceName and self.dataType == 'AO'):
force = False
self.areaLabel[number - 1] = areaValueLabel
elif '主站' in self.deviceName and self.dataType == 'DI' or ('从站' in self.deviceName and self.dataType == 'DO'):
force = False
self.areaLabel[number - 1] = areaValueLabel
def dateLayout(self, number, isAnalog = True):
if not isAnalog:
forceLayout = QHBoxLayout()
valueRadio = ForceRadioButton(number = number)
valueRadio.setObjectName('valueRadio')
valueRadio.setAutoExclusive(False)
valueRadio.setText('OFF')
valueRadio.toggled.connect(self.DIDOForceValues)
massesageLabel = QLabel('通道 {} '.format(str(number + 1)))
massesageLabel.setObjectName('massesageLabel')
forceLayout.addWidget(massesageLabel)
forceLayout.addWidget(valueRadio)
forceLayout.setContentsMargins(0, 0, 0, 0)
forceLayout.setSpacing(0)
self.areaLabel[number] = valueRadio
if not self.force:
valueRadio.setEnabled(False)
else:
forceLayout = QHBoxLayout()
forceLayout.setContentsMargins(0, 0, 0, 0)
areaMessLabel = QLabel('当前值:' )
areaMessLabel.setObjectName('areaMessLabel')
areaValueLabel = QLabel('0')
areaValueLabel.setObjectName('areaValueLabel')
forceLayout.addWidget(areaMessLabel)
forceLayout.addWidget(areaValueLabel)
if self.force:
areaLineEdit = SoftKeyBoardEdit('0')
areaLineEdit.setObjectName('areaLineEdit')
areaLineEdit.setFixedSize(80, 33)
forceBtn = ForceButton(number = number, valueLabel=areaValueLabel, valueEdit=areaLineEdit)
forceBtn.clicked.connect(self.AIAOForceValues)
# forceBtn.setFixedSize(50, 27)
forceLayout.addWidget(areaLineEdit)
forceLayout.addWidget(forceBtn)
else:
self.areaLabel[number] = areaValueLabel
if force:
areaLineEdit = QLineEdit('0')
areaLineEdit.setObjectName('areaLineEdit')
areaLineEdit.setFixedSize(80, 33)
forceBtn = forceButton(number = number, valueLabel=areaValueLabel, valueEdit=areaLineEdit)
forceBtn.clicked.connect(self.forceValues)
# forceBtn.setFixedSize(50, 27)
forceLayout.addWidget(areaLineEdit)
forceLayout.addWidget(forceBtn)
self.areaLineEditValue.append(0)
self.areaLineEditValue.append(0)
if self.deviceName[-2:] + self.dataType in ['从站DI','主站DO']:
areaMessLabel.setObjectName('wirteDIDOareaMessLabel')
areaValueLabel.setObjectName('wirteDIDOareaValueLabel')
areaLineEdit.setObjectName('wirteDIDOareaLineEdit')
areaLineEdit.setFixedSize(30, 27)
areaLineEdit.setAlignment(Qt.AlignHCenter)
forceBtn.setObjectName('wirteDIDOforceBtn')
# if self.deviceName[-2:] + self.dataType in ['从站DI','主站DO']:
# areaMessLabel.setObjectName('wirteDIDOareaMessLabel')
# areaValueLabel.setObjectName('wirteDIDOareaValueLabel')
# areaLineEdit.setObjectName('wirteDIDOareaLineEdit')
# areaLineEdit.setFixedSize(30, 27)
# areaLineEdit.setAlignment(Qt.AlignHCenter)
# forceBtn.setObjectName('wirteDIDOforceBtn')
if self.deviceName[-2:] + self.dataType in ['主站DI','从站DO']:
areaMessLabel.setObjectName('readDIDOareaMessLabel')
areaValueLabel.setObjectName('readDIDOareaValueLabel')
# if self.deviceName[-2:] + self.dataType in ['主站DI','从站DO']:
# areaMessLabel.setObjectName('readDIDOareaMessLabel')
# areaValueLabel.setObjectName('readDIDOareaValueLabel')
@ -111,7 +133,10 @@ class RightAreaWidgets(QWidget):
# forceLayout.setSpacing(10)
return forceLayout
def wirteAreaLineEditValue(self,dataTypeAndModel, valueLabel, number, value):
def wirteAreaLineEditValue(self,dataTypeAndModel, number, value, valueLabel = None):
if self.areaWidget.okBtnValue:
QMessageBox.warning(self, '提示', '请先保存通道信息')
return
if dataTypeAndModel in ['主站AO','从站AI']:
pattern = re.compile(r'-?\d*\.?\d+')
@ -120,43 +145,49 @@ class RightAreaWidgets(QWidget):
QMessageBox.warning(self, '提示', '请输入数字。')
return
else:
valueLabel.setText(value)
self.areaLineEditValue[number -1] = float(value)
valueLabel.setText(str(float(value)))
self.areaLineEditValue[number] = float(value)
#判断输入值是否为0和1
elif dataTypeAndModel in ['主站DO','从站DI']:
pattern = re.compile(r'^[01]$')
match = pattern.match(value)
if not match:
QMessageBox.warning(self, '提示', '请输入0或1。')
return
else:
valueLabel.setText(value)
self.areaLineEditValue[number -1] = value
# pattern = re.compile(r'^[01]$')
# match = pattern.match(value)
# if not match:
# QMessageBox.warning(self, '提示', '请输入0或1。')
# return
# else:
# valueLabel.setText(value)
self.areaLineEditValue[number] = value
return self.areaLineEditValue
def readValues(self, curIndex):
# print(curIndex)
if self.areaLabel is None or self.areaLabel == dict():
return
# elif curIndex == -1:
# return
else:
if not self.force:
device = self.devicesManange.getDevice(self.deviceName)
values = device.getAreaValues(curIndex)
# print(self.deviceName, curIndex, values)
if len(values) > len(self.areaLabel):
return
for index, value in enumerate(values):
# print(self.dataType, self.force)
if self.dataType in ['DI', 'DO'] and not self.force:
if value == 1:
value = 'ON'
self.areaLabel[index].setChecked(True)
else:
value = 'OFF'
self.areaLabel[index].setChecked(False)
self.areaLabel[index].setText(value)
continue
self.areaLabel[index].setText(str(value))
# print(self.areaLabel[index],values)
def forceValues(self):
def AIAOForceValues(self):
sender = self.sender()
number = sender.number
valueLabel = sender.valueLabel
@ -171,3 +202,18 @@ class RightAreaWidgets(QWidget):
self.devicesManange.writeAreas(deviceName = self.deviceName, areaIndex = curIndex, values = valueList)
def DIDOForceValues(self):
sender = self.sender()
number = sender.number
value = 1 if sender.isChecked() else 0
dataTypeAndModel = self.deviceName[-2:] + self.dataType
curIndex = self.areaWidget.areaTabWidget.currentIndex()
valueList = self.wirteAreaLineEditValue(dataTypeAndModel=dataTypeAndModel, number=number, value=value)
if valueList is None:
return
else:
self.devicesManange.writeAreas(deviceName = self.deviceName, areaIndex = curIndex, values = valueList)
if sender.isChecked():
sender.setText('ON')
else:
sender.setText('OFF')

@ -0,0 +1,51 @@
import win32gui
from ctypes import HRESULT
from ctypes.wintypes import HWND
from comtypes import IUnknown, GUID, COMMETHOD
import comtypes.client
import os
import sys
from PyQt5.QtWidgets import QLineEdit
from utils import Globals
class ITipInvocation(IUnknown):
_iid_ = GUID("{37c994e7-432b-4834-a2f7-dce1f13b834b}")
_methods_ = [COMMETHOD([], HRESULT, "Toggle", (['in'], HWND, "hwndDesktop"))]
class SoftKeyBoardEdit(QLineEdit):
def __init__(self, *args):
super().__init__(*args)
# self.mousePressEvent = self.popupKeyboard
def toggleTabtip(self):
try:
comtypes.CoInitialize()
ctsdk = comtypes.client.CreateObject("{4ce576fa-83dc-4F88-951c-9d0782b4e376}", interface=ITipInvocation)
ctsdk.Toggle(win32gui.GetDesktopWindow())
comtypes.CoUninitialize()
except OSError as e:
os.system("C:\\PROGRA~1\\COMMON~1\\MICROS~1\\ink\\tabtip.exe")
def mousePressEvent(self, event):
print(Globals.getValue('_touchMode'))
if Globals.getValue('_touchMode'):
self.toggleTabtip()
event.accept()

@ -2,6 +2,8 @@ from PyQt5.QtWidgets import QApplication, QStyleFactory
from UI.MainWindow import MainWindow, CommonHelper
from model.ClientModel.Client import Client
from utils import Globals
import time
import sys
@ -10,9 +12,10 @@ if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyle(QStyleFactory.create('windowsvisio'))
app.setStyleSheet(CommonHelper.readQss('static/main.qss') + CommonHelper.readQss('static/Area.qss'))
Globals._init()
Client.initDB()
window = MainWindow()
window.showMaximized()
Globals.setValue('MainWindow', window)
# window.show()
sys.exit(app.exec_())

@ -39,7 +39,7 @@ class Device():
# print(area.startAddress, area.endAddress)
self.inputEndAddress = area.endAddress
area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist()
self.indexDict[len(self.indexDict.values())] = len(self.inputAreas)
self.indexDict[len(self.indexDict.values())] = [0, len(self.inputAreas)]
self.inputAreas.append(area)
self.areas.append(area)
elif type in ["DO" , "AO"]:
@ -47,7 +47,7 @@ class Device():
area.endAddress = area.startAddress + area.length
self.outputEndAddress = area.endAddress
area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist()
self.indexDict[len(self.indexDict.values())] = len(self.outputAreas)
self.indexDict[len(self.indexDict.values())] = [1, len(self.outputAreas)]
self.outputAreas.append(area)
self.areas.append(area)
if (self.masterOrSlave == '主站' and type in ['AI', 'DI']) or (self.masterOrSlave == '从站' and type in ['AO', 'DO']):
@ -57,10 +57,23 @@ class Device():
def delArea(self, index, type):
if type in ["DI", "AI"]:
self.inputAreas.pop(self.indexDict[index])
self.inputAreas.pop(self.indexDict[index][1])
elif type in ["AO", "DO"]:
self.outputAreas.pop(self.indexDict[index])
self.indexDict.pop(index)
self.outputAreas.pop(self.indexDict[index][1])
# self.indexDict.pop(index)
newDict = collections.OrderedDict()
rmValue = self.indexDict[index]
for key, value in self.indexDict.items():
# print(value)
if key < index:
newDict[key] = value
elif key > index:
if value[0] == rmValue[0]:
newDict[key - 1] = [value[0], value[1] - 1] # 更新类型索引和区域索引
else:
newDict[key - 1] = [value[0], value[1]]
self.indexDict = newDict
self.areas.pop(index)
self.recalculateAddress()

@ -50,7 +50,7 @@ class DeviceDB(BaseModel):
# 添加设备
def addDevice(self, deviceName, proType, masterSlaveModel=masterSlaveModel, areaJson=json.dumps([]), pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit):
def addDevice(self, deviceName, proType, masterSlaveModel=masterSlaveModel, areaJson=json.dumps([]), pvUpperLimit=None, pvLowerLimit=None, pvUnit=None):
self.deviceName = deviceName
self.proType = proType
self.masterSlaveModel = masterSlaveModel

@ -0,0 +1,18 @@
def _init():#初始化
global _globalDict
_globalDict = {}
_globalDict['_touchMode'] = 0 # 触控模式
_globalDict['MainWindow'] = None
def setValue(key,value):
""" 定义一个全局变量 """
_globalDict[key] = value
def getValue(key,defValue=None):
""" 获得一个全局变量,不存在则返回默认值 """
try:
return _globalDict[key]
except KeyError:
print('没有这个变量')
return False
def clearValue(key):
_globalDict[key].clear()
Loading…
Cancel
Save