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

220 lines
8.7 KiB
Python

2 years ago
import os
2 years ago
import sys
2 years ago
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
2 years ago
from utils.DBModels.BaseModel import *
2 years ago
from model.ClientModel.Client import Client
2 years ago
from UI.DeviceWidget import DeviceWidget
2 years ago
from model.ProjectModel.DeviceManage import DevicesManange
2 years ago
2 years ago
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]
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
2 years ago
class MainWindow(QWidget):
2 years ago
def __init__(self):
super().__init__()
2 years ago
self.setObjectName("MainWindow")
2 years ago
self.devicesManange = DevicesManange()
2 years ago
self.process = None
2 years ago
self.initUI()
2 years ago
2 years ago
def initUI(self):
2 years ago
self.protocolTimer = QTimer()
self.protocolTimer.timeout.connect(self.readValues)
2 years ago
# self.toolbarWidget = QWidget()
# self.addToolBar(Qt.LeftToolBarArea, self.toolbar)
toolbarLayout = QHBoxLayout()
2 years ago
2 years ago
self.startProtocolBtn = QPushButton()
2 years ago
self.startProtocolBtn.setObjectName("startProtocolBtn")
2 years ago
# self.startProtocolBtn.setIcon(QIcon('Static/startProtocol.png'))
self.startProtocolBtn.setText('开始通讯')
self.startProtocolBtn.setIcon(QIcon('Static/start.png'))
self.startProtocolBtn.setIconSize(QSize(18, 18))
2 years ago
self.startProtocolBtn.setCheckable(True)
2 years ago
self.startProtocolBtn.clicked.connect(self.startProtocol)
2 years ago
2 years ago
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)
2 years ago
2 years ago
toolbarLayout.addWidget(self.startProtocolBtn, 1)
toolbarLayout.addWidget(self.switchBtn, 1)
toolbarLayout.addWidget(QWidget(), 20)
toolbarLayout.setSpacing(20)
toolbarLayout.setContentsMargins(0, 0, 0, 0)
2 years ago
2 years ago
dpMasterDockWidget = QDockWidget('DP主站')
2 years ago
dpMasterDockWidget.setWidget(DeviceWidget(dpMasterDockWidget, self.devicesManange))
2 years ago
dpMasterDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore
2 years ago
2 years ago
dpSlaveDockWidget = QDockWidget('DP从站')
2 years ago
dpSlaveDockWidget.setWidget(DeviceWidget(dpSlaveDockWidget, self.devicesManange))
2 years ago
dpSlaveDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore
2 years ago
2 years ago
paMasterDockWidget = QDockWidget('PA主站')
2 years ago
paMasterDockWidget.setWidget(DeviceWidget(paMasterDockWidget, self.devicesManange))
2 years ago
paMasterDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore
2 years ago
2 years ago
paSlaveDockWidget = QDockWidget('PA从站')
2 years ago
paSlaveDockWidget.setWidget(DeviceWidget(paSlaveDockWidget, self.devicesManange))
2 years ago
paSlaveDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore
2 years ago
2 years ago
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)
2 years ago
2 years ago
self.setWindowIcon(QIcon('Static/zhjt.ico'))
self.setWindowTitle("PROFIBUS")
2 years ago
# self.resize(800, 600)
2 years ago
# self.showMaximized()
2 years ago
def startProtocol(self):
2 years ago
if self.startProtocolBtn.isChecked():
2 years ago
self.startProtocolBtn.setText('停止通讯')
2 years ago
self.startProtocolBtn.setIcon(QIcon('Static/pause.png'))
self.startProtocolBtn.setIconSize(QSize(22, 22))
2 years ago
self.protocolTimer.start(500)
else:
self.startProtocolBtn.setText('开始通讯')
2 years ago
self.startProtocolBtn.setIcon(QIcon('Static/start.png'))
2 years ago
self.protocolTimer.stop()
def readValues(self):
self.devicesManange.readAreas()
2 years ago
dockWidgets = self.findChildren(QDockWidget) #找到四个dockWidget窗口
for dockWidget in dockWidgets:
2 years ago
if dockWidget.widget().currentWidget().objectName() == 'initWidget':
# print(dockWidget.widget().currentWidget().objectName())
2 years ago
continue
2 years ago
areaTabWidget = dockWidget.widget().currentWidget()#判断四个窗口里是否
2 years ago
if areaTabWidget.currentWidget().objectName() == 'initWidget':
2 years ago
# print(2)
2 years ago
continue
if areaTabWidget.currentWidget().state:
2 years ago
# print(3)
2 years ago
continue
# masterAndSlave = dockWidget.windowTitle()[2:5]
# proType = dockWidget.windowTitle()
# dataType = dataTypeCombox.currentText()
# dataTypeAndModel = masterAndSlave + dataType
# if dataTypeAndModel in ['主站AI', '主站DI', '从站AO', '从站DO']:
2 years ago
# devicecurIndex =.currentIndex()
# deviceTabText =.tabText(devicecurIndex)
2 years ago
# try:
areacurindex = areaTabWidget.currentIndex()
# deviceName = deviceTabText + proType
2 years ago
buttonlayoutWidget = areaTabWidget.currentWidget().rightAreaWidgets#获取buttonlayout
2 years ago
buttonlayoutWidget.readValues(curIndex = areacurindex)
# except Exception as e:
# print(e)
2 years ago
2 years ago
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()
2 years ago
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_())