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.
220 lines
8.7 KiB
Python
220 lines
8.7 KiB
Python
import os
|
|
import sys
|
|
import time
|
|
import win32con
|
|
import win32gui
|
|
import win32process
|
|
import subprocess
|
|
import qtawesome
|
|
|
|
from PyQt5.QtWidgets import QApplication, QPushButton, QMainWindow, QDockWidget, QToolBar, QAction, QTabWidget, QGridLayout, QWidget, QHBoxLayout, QStackedWidget\
|
|
,QVBoxLayout
|
|
from PyQt5.QtCore import Qt, QTimer, QSize
|
|
from PyQt5.QtGui import QIcon, QWindow
|
|
from utils.DBModels.BaseModel import *
|
|
from model.ClientModel.Client import Client
|
|
from UI.DeviceWidget import DeviceTab
|
|
from model.ProjectModel.DeviceManage import DevicesManange
|
|
|
|
|
|
def getHwndByPid(pid):
|
|
def callback(hwnd, hwnds):
|
|
if hwnd is not None and win32gui.IsWindowVisible(hwnd):
|
|
_, found_pid = win32process.GetWindowThreadProcessId(hwnd)
|
|
if found_pid == pid:
|
|
hwnds.append(hwnd)
|
|
|
|
hwnds = []
|
|
win32gui.EnumWindows(callback, hwnds)
|
|
return hwnds[0]
|
|
|
|
class CommonHelper:
|
|
def __init__(self):
|
|
pass
|
|
|
|
@staticmethod
|
|
def readQss(style):
|
|
with open(style,"r") as f:
|
|
return f.read()
|
|
|
|
|
|
class MainWindow(QWidget):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.setObjectName("MainWindow")
|
|
self.devicesManange = DevicesManange()
|
|
self.process = None
|
|
self.initUI()
|
|
|
|
def initUI(self):
|
|
self.protocolTimer = QTimer()
|
|
self.protocolTimer.timeout.connect(self.readValues)
|
|
|
|
# self.toolbarWidget = QWidget()
|
|
# self.addToolBar(Qt.LeftToolBarArea, self.toolbar)
|
|
|
|
toolbarLayout = QHBoxLayout()
|
|
|
|
self.startProtocolBtn = QPushButton()
|
|
self.startProtocolBtn.setObjectName("startProtocolBtn")
|
|
# self.startProtocolBtn.setIcon(QIcon('Static/startProtocol.png'))
|
|
self.startProtocolBtn.setText('开始通讯')
|
|
self.startProtocolBtn.setIcon(QIcon('Static/start.png'))
|
|
self.startProtocolBtn.setIconSize(QSize(18, 18))
|
|
self.startProtocolBtn.setCheckable(True)
|
|
self.startProtocolBtn.clicked.connect(self.startProtocol)
|
|
|
|
self.switchBtn = QPushButton('通讯组态')
|
|
self.switchBtn.setObjectName("switchBtn")
|
|
self.switchBtn.setIcon(qtawesome.icon('fa.exchange', color='#1fbb6f'))
|
|
self.switchBtn.setIconSize(QSize(20, 20))
|
|
self.switchBtn.setCheckable(True)
|
|
self.switchBtn.clicked.connect(self.switchWidget)
|
|
|
|
toolbarLayout.addWidget(self.startProtocolBtn, 1)
|
|
toolbarLayout.addWidget(self.switchBtn, 1)
|
|
toolbarLayout.addWidget(QWidget(), 20)
|
|
toolbarLayout.setSpacing(20)
|
|
toolbarLayout.setContentsMargins(0, 0, 0, 0)
|
|
|
|
dpMasterDockWidget = QDockWidget('DP主站')
|
|
dpMasterDockWidget.setWidget(DeviceTab(dpMasterDockWidget, self.devicesManange))
|
|
dpMasterDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore
|
|
|
|
dpSlaveDockWidget = QDockWidget('DP从站')
|
|
dpSlaveDockWidget.setWidget(DeviceTab(dpSlaveDockWidget, self.devicesManange))
|
|
dpSlaveDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore
|
|
|
|
paMasterDockWidget = QDockWidget('PA主站')
|
|
paMasterDockWidget.setWidget(DeviceTab(paMasterDockWidget, self.devicesManange))
|
|
paMasterDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore
|
|
|
|
paSlaveDockWidget = QDockWidget('PA从站')
|
|
paSlaveDockWidget.setWidget(DeviceTab(paSlaveDockWidget, self.devicesManange))
|
|
paSlaveDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore
|
|
|
|
|
|
self.upperWidget = QMainWindow()
|
|
self.upperWidget.addDockWidget(Qt.TopDockWidgetArea, dpMasterDockWidget) # type: ignore
|
|
self.upperWidget.addDockWidget(Qt.TopDockWidgetArea, dpSlaveDockWidget) # type: ignore
|
|
self.upperWidget.addDockWidget(Qt.BottomDockWidgetArea, paMasterDockWidget) # type: ignore
|
|
self.upperWidget.addDockWidget(Qt.BottomDockWidgetArea, paSlaveDockWidget) # type: ignore
|
|
|
|
self.stackWidget = QStackedWidget()
|
|
|
|
self.stackWidget.addWidget(self.upperWidget)
|
|
self.stackWidget.addWidget(QWidget())
|
|
|
|
self.mainLayout = QVBoxLayout(self)
|
|
self.mainLayout.addLayout(toolbarLayout, 1)
|
|
self.mainLayout.addWidget(self.stackWidget, 50)
|
|
self.setLayout(self.mainLayout)
|
|
# self.setCentralWidget(self.stackWidget)
|
|
|
|
self.setWindowIcon(QIcon('Static/zhjt.ico'))
|
|
self.setWindowTitle("PROFIBUS")
|
|
|
|
# self.resize(800, 600)
|
|
# self.showMaximized()
|
|
|
|
def startProtocol(self):
|
|
if self.startProtocolBtn.isChecked():
|
|
self.startProtocolBtn.setText('停止通讯')
|
|
self.startProtocolBtn.setIcon(QIcon('Static/pause.png'))
|
|
self.startProtocolBtn.setIconSize(QSize(22, 22))
|
|
self.protocolTimer.start(500)
|
|
|
|
else:
|
|
self.startProtocolBtn.setText('开始通讯')
|
|
self.startProtocolBtn.setIcon(QIcon('Static/start.png'))
|
|
self.protocolTimer.stop()
|
|
|
|
def readValues(self):
|
|
self.devicesManange.readAreas()
|
|
dockWidgets = self.findChildren(QDockWidget) #找到四个dockWidget窗口
|
|
for dockWidget in dockWidgets:
|
|
if dockWidget.widget().currentWidget().objectName() == 'initWidget':
|
|
# print(dockWidget.widget().currentWidget().objectName())
|
|
continue
|
|
|
|
areaTabWidget = dockWidget.widget().currentWidget()#判断四个窗口里是否
|
|
if areaTabWidget.currentWidget().objectName() == 'initWidget':
|
|
# print(2)
|
|
continue
|
|
if areaTabWidget.currentWidget().state:
|
|
# print(3)
|
|
continue
|
|
|
|
# masterAndSlave = dockWidget.windowTitle()[2:5]
|
|
# proType = dockWidget.windowTitle()
|
|
# dataType = dataTypeCombox.currentText()
|
|
# dataTypeAndModel = masterAndSlave + dataType
|
|
|
|
# if dataTypeAndModel in ['主站AI', '主站DI', '从站AO', '从站DO']:
|
|
# devicecurIndex =.currentIndex()
|
|
# deviceTabText =.tabText(devicecurIndex)
|
|
# try:
|
|
areacurindex = areaTabWidget.currentIndex()
|
|
# deviceName = deviceTabText + proType
|
|
buttonlayoutWidget = areaTabWidget.currentWidget().rightAreaWidgets#获取buttonlayout
|
|
buttonlayoutWidget.readValues(curIndex = areacurindex)
|
|
# except Exception as e:
|
|
# print(e)
|
|
|
|
|
|
def switchWidget(self):
|
|
if self.switchBtn.isChecked():
|
|
if self.process:
|
|
self.stackWidget.setCurrentIndex(1)
|
|
QTimer.singleShot(50, lambda:self.stackWidget.setCurrentIndex(2))
|
|
else:
|
|
self.stackWidget.setCurrentIndex(1)
|
|
startupInfo = subprocess.STARTUPINFO()
|
|
startupInfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
|
|
startupInfo.wShowWindow = 2
|
|
self.process = subprocess.Popen("D:\\EnTalk PROFIBUS Manager\\DP.exe",startupinfo=startupInfo)
|
|
QTimer.singleShot(500, lambda:self.showLowerWidget(self.process))
|
|
self.switchBtn.setText('变量读写')
|
|
# self.switchBtn.setIcon(QIcon('Static/varMagH.png'))
|
|
else:
|
|
# self.stackWidget.setCurrentIndex(1)
|
|
self.stackWidget.setCurrentIndex(0)
|
|
self.switchBtn.setText('通讯组态')
|
|
# self.switchBtn.setIcon(QIcon('Static/newH.png'))
|
|
|
|
|
|
|
|
def showLowerWidget(self, process):
|
|
pid = process.pid
|
|
hwnd = int(getHwndByPid(pid))
|
|
style = win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE)
|
|
exstyle = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)
|
|
wrect = win32gui.GetWindowRect(hwnd)[:2] + win32gui.GetClientRect(hwnd)[2:]
|
|
# print('save', hwnd, style, exstyle, wrect)
|
|
widget = QWidget.createWindowContainer(QWindow.fromWinId(hwnd))
|
|
# print(type(widget))
|
|
widget.hwnd = hwnd # 窗口句柄
|
|
widget.phwnd = 0 # 父窗口句柄
|
|
widget.style = style # 窗口样式
|
|
widget.exstyle = exstyle # 窗口额外样式
|
|
widget.wrect = wrect # 窗口位置
|
|
|
|
|
|
self.stackWidget.addWidget(widget)
|
|
widget.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint | Qt.WindowFullScreen)
|
|
|
|
win32gui.SetParent(hwnd, int(self.winId()))
|
|
|
|
self.stackWidget.setCurrentIndex(2)
|
|
|
|
def closeEvent(self, event):
|
|
if self.process:
|
|
self.process.kill()
|
|
|
|
if __name__ == '__main__':
|
|
app = QApplication(sys.argv)
|
|
Client.initDB()
|
|
window = MainWindow()
|
|
|
|
window.show()
|
|
sys.exit(app.exec_()) |