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.devicesManange.connect() 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_())