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

341 lines
13 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\
2 years ago
,QVBoxLayout, QProgressBar, QLabel
2 years ago
from PyQt5.QtCore import Qt, QTimer, QSize
2 years ago
from PyQt5.QtGui import QIcon, QWindow, QPixmap
2 years ago
from utils.DBModels.BaseModel import *
2 years ago
from model.ClientModel.Client import Client
2 years ago
from UI.DeviceWidget import DeviceTab
2 years ago
from model.ProjectModel.DeviceManage import DevicesManange
2 years ago
2 years ago
from protocol.BatterySerial.BatteryProtocol import BatteryManange
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QProgressBar, QVBoxLayout, QWidget
from PyQt5.QtCore import Qt, QRect, QSize
from PyQt5.QtGui import QPainter, QFont, QColor
2 years ago
from utils import Globals
2 years ago
class CustomProgressBar(QProgressBar):
def __init__(self, parent=None):
super().__init__(parent)
self.setTextVisible(False)
self.setFont(QFont("Arial", 10)) # 设置字体大小和类型
def paintEvent(self, event):
super().paintEvent(event)
painter = QPainter(self)
value = self.value()
percentage = round(value / self.maximum() * 100, 1)
text = f"剩余电量{percentage}%"
painter.drawText(self.rect(), Qt.AlignCenter, text)
2 years ago
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 = []
2 years ago
# win32gui.EnumWindows(callback, hwnds)
while True:
win32gui.EnumWindows(callback, hwnds)
if hwnds:
return hwnds[0]
# 如果没有找到窗口,则等待一段时间再尝试
time.sleep(0.1)
# return hwnds
# return hwnds[0]
2 years ago
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.batteryManange = BatteryManange()
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.batteryTimer = QTimer()
self.batteryTimer.timeout.connect(self.refreshProgressBar)
self.batteryTimer.start(3000)
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'))
2 years ago
self.startProtocolBtn.setIconSize(QSize(23, 23))
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'))
2 years ago
self.switchBtn.setIconSize(QSize(25, 25))
2 years ago
self.switchBtn.setCheckable(True)
self.switchBtn.clicked.connect(self.switchWidget)
2 years ago
2 years ago
self.batteryProBar = CustomProgressBar()
self.batteryProBar.setRange(0, 100)
self.batteryStateLabel = QLabel()
self.batteryStateLabel.setObjectName('batteryLabel')
2 years ago
self.switchTouchBtn = QPushButton("触控模式")
2 years ago
self.switchTouchBtn.setIconSize(QSize(25, 25))
2 years ago
self.switchTouchBtn.setObjectName('switchTouchBtn')
self.switchTouchBtn.setIcon(qtawesome.icon('fa.keyboard-o', color='#1fbb6f'))
self.switchTouchBtn.clicked.connect(self.switchTouchMode)
self.switchTouchBtn.setCheckable(True)
2 years ago
# 创建按钮
self.minimizeButton = QPushButton(QIcon('Static/min.png'), "")
self.minimizeButton.setObjectName('minButton')
self.closeButton = QPushButton(QIcon('Static/close.png'), "")
self.closeButton.setObjectName('closeButton')
# 按钮点击事件连接
self.minimizeButton.clicked.connect(self.showMinimized)
self.closeButton.clicked.connect(self.close)
hLayout = QHBoxLayout()
hLayout.addWidget(self.minimizeButton)
hLayout.addWidget(self.closeButton)
iconLabel = QLabel()
pix = QPixmap('Static/Hicent.png')
scaledPixmap = pix.scaled(168, 28, Qt.KeepAspectRatio)
iconLabel.setPixmap(scaledPixmap)
iconLabel.setScaledContents(True)
toolbarLayout.addWidget(iconLabel, 1)
toolbarLayout.addWidget(QWidget(), 1)
2 years ago
toolbarLayout.addWidget(self.startProtocolBtn, 1)
toolbarLayout.addWidget(self.switchBtn, 1)
2 years ago
toolbarLayout.addWidget(self.switchTouchBtn, 1)
2 years ago
toolbarLayout.addWidget(QWidget(), 20)
2 years ago
# toolbarLayout.addWidget(QLabel('电量:'), 1)
toolbarLayout.addWidget(self.batteryProBar, 1)
toolbarLayout.addWidget(self.batteryStateLabel, 1)
2 years ago
toolbarLayout.addWidget(QWidget(), 1)
toolbarLayout.addLayout(hLayout, 1)
2 years ago
toolbarLayout.setSpacing(20)
toolbarLayout.setContentsMargins(0, 0, 0, 0)
2 years ago
2 years ago
dpMasterDockWidget = QDockWidget('DP主站')
2 years ago
dpMasterDockWidget.setWidget(DeviceTab(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(DeviceTab(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(DeviceTab(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(DeviceTab(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/Hicent.jpg'))
self.setWindowTitle("PROFIBUS总线测试工具")
2 years ago
self.refreshProgressBar()
2 years ago
self.devicesManange.connect()
2 years ago
self.setWindowFlags(Qt.FramelessWindowHint)
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
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
def refreshProgressBar(self):
# self.temp = temp / 10 if temp > -3276.8 else float('nan') # 假设温度值需要除以10得到实际℃数
# self.current = current # mA
# self.volt = volt # mV
# self.remaintime = remaintime # 分钟
# self.capacity = capacity # mAH
# self.cappercent = cappercent # 百分比%
# self.state = state # 充放电状态
result = self.batteryManange.readBatteryInfo()
self.batteryProBar.setValue(result.cappercent)
self.batteryStateLabel.setText(result.chargingStatus)
2 years ago
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('变量读写')
2 years ago
self.showMaximized()
2 years ago
# 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
self.batteryManange.close()
2 years ago
2 years ago
def switchTouchMode(self):
if self.switchTouchBtn.isChecked():
Globals.setValue('_touchMode', 1)
self.switchTouchBtn.setText('键盘模式')
else:
Globals.setValue('_touchMode', 0)
self.switchTouchBtn.setText('触控模式')
2 years ago
def toggleMaximize(self):
if self.isMaximized():
self.showNormal()
self.maxRestoreButton.setIcon(QIcon('maximizeIcon.png'))
else:
self.showMaximized()
self.maxRestoreButton.setIcon(QIcon('restoreIcon.png')) # 替换为合适的还原图标路径
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_())