0323Update

main
parent 6a3be48317
commit c9c1a15bdb

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

@ -99,7 +99,7 @@ QDockWidget::title{
} }
QPushButton#startProtocolBtn, QPushButton#switchBtn{ QPushButton#startProtocolBtn, QPushButton#switchBtn, QPushButton#switchTouchBtn{
font-size: 20px; 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; 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; font-size: 20px;
@ -185,3 +185,41 @@ QProgressBar::chunk {
width: 20px; 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 UI.RightAreaWidget import RightAreaWidgets
from utils.DBModels.DeviceModels import DeviceDB from utils.DBModels.DeviceModels import DeviceDB
from UI.SoftKeyBoardEdit import SoftKeyBoardEdit
class AreaTabWidget(QTabWidget): class AreaTabWidget(QTabWidget):
@ -181,12 +183,12 @@ class AreaWidget(QWidget):
self.byteLineLabel = QLabel('字节长度:') self.byteLineLabel = QLabel('字节长度:')
self.byteLineLabel.setObjectName('byteLineLabel') self.byteLineLabel.setObjectName('byteLineLabel')
# self.byteLineLabel.setFixedSize(90, 27) # self.byteLineLabel.setFixedSize(90, 27)
self.byteLineEdit = QLineEdit() self.byteLineEdit = SoftKeyBoardEdit()
self.byteLineEdit.setPlaceholderText('字节长度') self.byteLineEdit.setPlaceholderText('字节长度')
self.byteLineEdit.setObjectName('byteLineEdit') self.byteLineEdit.setObjectName('byteLineEdit')
# self.byteLineEdit.setFixedSize(90, 27) # self.byteLineEdit.setFixedSize(90, 27)
self.okBtn = QPushButton('确定') self.okBtn = QPushButton('保存')
# self.okBtn.setFixedSize(90, 27) # self.okBtn.setFixedSize(90, 27)
self.okBtn.setObjectName('okBtn') self.okBtn.setObjectName('okBtn')
self.okBtn.setIcon(qtawesome.icon('fa.pencil', color='#4c8cf2')) self.okBtn.setIcon(qtawesome.icon('fa.pencil', color='#4c8cf2'))
@ -262,7 +264,7 @@ class AreaWidget(QWidget):
# 只点击了新建区域按钮,未点击确定按钮时,直接点击删除按钮的删除情况 # 只点击了新建区域按钮,未点击确定按钮时,直接点击删除按钮的删除情况
index = self.areaTabWidget.currentIndex() index = self.areaTabWidget.currentIndex()
tabCount = self.areaTabWidget.count() tabCount = self.areaTabWidget.count()
if self.okBtn.text() == '确定': if self.okBtn.text() == '保存':
if index != -1: if index != -1:
self.areaTabWidget.removeTab(index) self.areaTabWidget.removeTab(index)

@ -57,18 +57,26 @@ class DeviceDialog(QDialog):
def checkInput(self): def checkInput(self):
titleName, pvUpperLimit, pvLowerLimit, pvUnit = self.getParameters() titleName, pvUpperLimit, pvLowerLimit, pvUnit = self.getParameters()
deviceName = titleName + self.dataTypeAndModel deviceName = titleName + self.dataTypeAndModel
if not pvUpperLimit or not pvLowerLimit or not pvUnit or not deviceName: if not pvUpperLimit and not pvLowerLimit and not pvUnit:
QMessageBox.warning(self, '警告', '有值未输入。') 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 return
elif DeviceDB.getByName(deviceName): elif DeviceDB.getByName(deviceName):
# print(DeviceDB.getByName(deviceName),2343) # print(DeviceDB.getByName(deviceName),2343)
QMessageBox.warning(self, '警告', '设备名重复') QMessageBox.warning(self, '警告', '设备名重复')
return 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: else:
self.accept() # 所有输入都是数字且不为空时接受对话框 self.accept() # 所有输入都是数字且不为空时接受对话框

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

@ -1,10 +1,12 @@
import re import re
from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel, QPushButton, QLayout, \ 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 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): def __init__(self, number = None, valueLabel = None, valueEdit = None):
super().__init__() super().__init__()
self.valueEdit = valueEdit self.valueEdit = valueEdit
@ -13,6 +15,11 @@ class forceButton(QPushButton):
self.setObjectName('forceBtn') self.setObjectName('forceBtn')
self.setText('强制') self.setText('强制')
class ForceRadioButton(QRadioButton):
def __init__(self, number = None):
super().__init__()
self.number = number
class RightAreaWidgets(QWidget): class RightAreaWidgets(QWidget):
def __init__(self, areaWidget, order, byteLineEdit, dataType, deviceName): def __init__(self, areaWidget, order, byteLineEdit, dataType, deviceName):
super().__init__() super().__init__()
@ -24,6 +31,12 @@ class RightAreaWidgets(QWidget):
self.byteLineEdit = byteLineEdit self.byteLineEdit = byteLineEdit
self.dataType = dataType self.dataType = dataType
self.deviceName = deviceName 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.addLayout()
# self.setStyleSheet("background-color: black") # self.setStyleSheet("background-color: black")
@ -40,7 +53,7 @@ class RightAreaWidgets(QWidget):
if self.dataType in ['AI','AO']: if self.dataType in ['AI','AO']:
hLayout = QHBoxLayout() hLayout = QHBoxLayout()
hLayout.addWidget(QSplitter()) hLayout.addWidget(QSplitter())
hLayout.addLayout(self.dateLayout(1)) hLayout.addLayout(self.dateLayout(0))
hLayout.addWidget(QSplitter()) hLayout.addWidget(QSplitter())
areaLayout.addWidget(QSplitter()) areaLayout.addWidget(QSplitter())
areaLayout.addLayout(hLayout) areaLayout.addLayout(hLayout)
@ -51,58 +64,67 @@ class RightAreaWidgets(QWidget):
for i in range(int(byteLineEdit)): for i in range(int(byteLineEdit)):
hLayout = QHBoxLayout() hLayout = QHBoxLayout()
hLayout.addWidget(QSplitter(), 1) 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.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) hLayout.addWidget(QSplitter(), 1)
areaLayout.addLayout(hLayout) areaLayout.addLayout(hLayout)
areaLayout.addWidget(QSplitter()) areaLayout.addWidget(QSplitter())
return areaLayout return areaLayout
def dateLayout(self, number, force = True): def dateLayout(self, number, isAnalog = True):
number = number if not isAnalog:
forceLayout = QHBoxLayout()
forceLayout = QHBoxLayout() valueRadio = ForceRadioButton(number = number)
forceLayout.setContentsMargins(0, 0, 0, 0) valueRadio.setObjectName('valueRadio')
areaMessLabel = QLabel(str(self.dataType) + "{:<{}}".format(str(number), 2) + ": " + '字节长度: ' + str(self.byteLineEdit) + ' 当前值:' ) valueRadio.setAutoExclusive(False)
areaMessLabel.setObjectName('areaMessLabel') valueRadio.setText('OFF')
areaValueLabel = QLabel('0') valueRadio.toggled.connect(self.DIDOForceValues)
areaValueLabel.setObjectName('areaValueLabel') massesageLabel = QLabel('通道 {} '.format(str(number + 1)))
forceLayout.addWidget(areaMessLabel) massesageLabel.setObjectName('massesageLabel')
forceLayout.addWidget(areaValueLabel) forceLayout.addWidget(massesageLabel)
forceLayout.addWidget(valueRadio)
forceLayout.setContentsMargins(0, 0, 0, 0)
if '主站' in self.deviceName and self.dataType == 'AI' or ('从站' in self.deviceName and self.dataType == 'AO'): forceLayout.setSpacing(0)
force = False self.areaLabel[number] = valueRadio
self.areaLabel[number - 1] = areaValueLabel if not self.force:
elif '主站' in self.deviceName and self.dataType == 'DI' or ('从站' in self.deviceName and self.dataType == 'DO'): valueRadio.setEnabled(False)
force = False else:
self.areaLabel[number - 1] = areaValueLabel 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: self.areaLineEditValue.append(0)
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)
if self.deviceName[-2:] + self.dataType in ['从站DI','主站DO']: # if self.deviceName[-2:] + self.dataType in ['从站DI','主站DO']:
areaMessLabel.setObjectName('wirteDIDOareaMessLabel') # areaMessLabel.setObjectName('wirteDIDOareaMessLabel')
areaValueLabel.setObjectName('wirteDIDOareaValueLabel') # areaValueLabel.setObjectName('wirteDIDOareaValueLabel')
areaLineEdit.setObjectName('wirteDIDOareaLineEdit') # areaLineEdit.setObjectName('wirteDIDOareaLineEdit')
areaLineEdit.setFixedSize(30, 27) # areaLineEdit.setFixedSize(30, 27)
areaLineEdit.setAlignment(Qt.AlignHCenter) # areaLineEdit.setAlignment(Qt.AlignHCenter)
forceBtn.setObjectName('wirteDIDOforceBtn') # forceBtn.setObjectName('wirteDIDOforceBtn')
if self.deviceName[-2:] + self.dataType in ['主站DI','从站DO']: # if self.deviceName[-2:] + self.dataType in ['主站DI','从站DO']:
areaMessLabel.setObjectName('readDIDOareaMessLabel') # areaMessLabel.setObjectName('readDIDOareaMessLabel')
areaValueLabel.setObjectName('readDIDOareaValueLabel') # areaValueLabel.setObjectName('readDIDOareaValueLabel')
@ -111,7 +133,10 @@ class RightAreaWidgets(QWidget):
# forceLayout.setSpacing(10) # forceLayout.setSpacing(10)
return forceLayout 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']: if dataTypeAndModel in ['主站AO','从站AI']:
pattern = re.compile(r'-?\d*\.?\d+') pattern = re.compile(r'-?\d*\.?\d+')
@ -120,43 +145,49 @@ class RightAreaWidgets(QWidget):
QMessageBox.warning(self, '提示', '请输入数字。') QMessageBox.warning(self, '提示', '请输入数字。')
return return
else: else:
valueLabel.setText(value) valueLabel.setText(str(float(value)))
self.areaLineEditValue[number -1] = float(value) self.areaLineEditValue[number] = float(value)
#判断输入值是否为0和1 #判断输入值是否为0和1
elif dataTypeAndModel in ['主站DO','从站DI']: elif dataTypeAndModel in ['主站DO','从站DI']:
pattern = re.compile(r'^[01]$') # pattern = re.compile(r'^[01]$')
match = pattern.match(value) # match = pattern.match(value)
if not match: # if not match:
QMessageBox.warning(self, '提示', '请输入0或1。') # QMessageBox.warning(self, '提示', '请输入0或1。')
return # return
else: # else:
valueLabel.setText(value) # valueLabel.setText(value)
self.areaLineEditValue[number -1] = value self.areaLineEditValue[number] = value
return self.areaLineEditValue return self.areaLineEditValue
def readValues(self, curIndex): def readValues(self, curIndex):
# print(curIndex) # print(curIndex)
if self.areaLabel is None or self.areaLabel == dict(): if not self.force:
return
# elif curIndex == -1:
# return
else:
device = self.devicesManange.getDevice(self.deviceName) device = self.devicesManange.getDevice(self.deviceName)
values = device.getAreaValues(curIndex) values = device.getAreaValues(curIndex)
# print(self.deviceName, curIndex, values) # print(self.deviceName, curIndex, values)
if len(values) > len(self.areaLabel): if len(values) > len(self.areaLabel):
return return
for index, value in enumerate(values): 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)) self.areaLabel[index].setText(str(value))
# print(self.areaLabel[index],values) # print(self.areaLabel[index],values)
def forceValues(self): def AIAOForceValues(self):
sender = self.sender() sender = self.sender()
number = sender.number number = sender.number
valueLabel = sender.valueLabel valueLabel = sender.valueLabel
@ -171,3 +202,18 @@ class RightAreaWidgets(QWidget):
self.devicesManange.writeAreas(deviceName = self.deviceName, areaIndex = curIndex, values = valueList) 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 UI.MainWindow import MainWindow, CommonHelper
from model.ClientModel.Client import Client from model.ClientModel.Client import Client
from utils import Globals
import time import time
import sys import sys
@ -10,9 +12,10 @@ if __name__ == '__main__':
app = QApplication(sys.argv) app = QApplication(sys.argv)
app.setStyle(QStyleFactory.create('windowsvisio')) app.setStyle(QStyleFactory.create('windowsvisio'))
app.setStyleSheet(CommonHelper.readQss('static/main.qss') + CommonHelper.readQss('static/Area.qss')) app.setStyleSheet(CommonHelper.readQss('static/main.qss') + CommonHelper.readQss('static/Area.qss'))
Globals._init()
Client.initDB() Client.initDB()
window = MainWindow() window = MainWindow()
window.showMaximized() window.showMaximized()
Globals.setValue('MainWindow', window)
# window.show() # window.show()
sys.exit(app.exec_()) sys.exit(app.exec_())

@ -39,7 +39,7 @@ class Device():
# print(area.startAddress, area.endAddress) # print(area.startAddress, area.endAddress)
self.inputEndAddress = area.endAddress self.inputEndAddress = area.endAddress
area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist() 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.inputAreas.append(area)
self.areas.append(area) self.areas.append(area)
elif type in ["DO" , "AO"]: elif type in ["DO" , "AO"]:
@ -47,7 +47,7 @@ class Device():
area.endAddress = area.startAddress + area.length area.endAddress = area.startAddress + area.length
self.outputEndAddress = area.endAddress self.outputEndAddress = area.endAddress
area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist() 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.outputAreas.append(area)
self.areas.append(area) self.areas.append(area)
if (self.masterOrSlave == '主站' and type in ['AI', 'DI']) or (self.masterOrSlave == '从站' and type in ['AO', 'DO']): 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): def delArea(self, index, type):
if type in ["DI", "AI"]: if type in ["DI", "AI"]:
self.inputAreas.pop(self.indexDict[index]) self.inputAreas.pop(self.indexDict[index][1])
elif type in ["AO", "DO"]: elif type in ["AO", "DO"]:
self.outputAreas.pop(self.indexDict[index]) self.outputAreas.pop(self.indexDict[index][1])
self.indexDict.pop(index) # 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.areas.pop(index)
self.recalculateAddress() 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.deviceName = deviceName
self.proType = proType self.proType = proType
self.masterSlaveModel = masterSlaveModel 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