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

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