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.

162 lines
5.6 KiB
Python

7 months ago
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QSize, Qt
from PyQt5.Qt import *
from PyQt5.QtGui import QPixmap, QIcon
from PyQt5.QtWidgets import QHBoxLayout, QAbstractItemView, QTableView, QVBoxLayout, QSplitter, \
QApplication, QGroupBox, QLabel, QGridLayout, QLineEdit, QComboBox, QTextEdit, QCheckBox,QVBoxLayout,QListView, QMainWindow
from PyQt5.QtWidgets import QListWidget, QStackedWidget, QFrame
from PyQt5.QtWidgets import QListWidgetItem, QSizePolicy
from PyQt5.QtWidgets import QWidget, QSpacerItem, QHeaderView
from PyQt5.QtWebEngineWidgets import QWebEngineView
from PyQt5.QtWebEngineWidgets import QWebEnginePage
from utils.DBModels.ProtocolModel import InfluxMem
from utils import Globals
from model.HistoryDBModel.HistoryDBManage import HistoryDBManage
import datetime
import pyecharts.options as opts
from pyecharts.charts import Line
import numpy as np
from Static import static
class HistoryTrend(object):
def __init__(self, view):
self.line = Line(init_opts= opts.InitOpts(width = str(view.size().width() - 20) + 'px', height = str(view.size().height() - 30) + 'px'))
self.setOpts()
def addXAxis(self, xAxis):
self.line.add_xaxis(xaxis_data=xAxis)
def addYAxis(self, lineName, yAxis):
self.line.add_yaxis(
series_name=lineName,
y_axis=yAxis,
markpoint_opts=opts.MarkPointOpts(
data=[
opts.MarkPointItem(type_="max", name="最大值"),
opts.MarkPointItem(type_="min", name="最小值"),
]
),
markline_opts=opts.MarkLineOpts(
data=[opts.MarkLineItem(type_="average", name="平均值")]
),
)
def setOpts(self):
self.line.set_global_opts(
title_opts=opts.TitleOpts(title="趋势图"),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
toolbox_opts=opts.ToolboxOpts(is_show=True),
xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False),
datazoom_opts=[
opts.DataZoomOpts(xaxis_index=0, range_start=0, range_end=100),
],
)
@property
def html(self):
return self.line.render_embed()
class TrendWidgets(QWidget):
def __init__(self, parent=None):
super(TrendWidgets, self).__init__(parent)
3 months ago
# self.setAttribute(Qt.WA_StyledBackground, True) # 移除无效属性
7 months ago
self.gridLayout = QtWidgets.QGridLayout(self)
self.gridLayout.setObjectName("gridLayout")
3 months ago
# 变量列表
self.varListWidget = QListWidget()
self.varListWidget.setObjectName("varListWidget")
self.varListWidget.itemDoubleClicked.connect(self.showVarTrend)
self.gridLayout.addWidget(self.varListWidget, 0, 0, 15, 4)
7 months ago
3 months ago
# 趋势图WebView
7 months ago
self.trendWebView = QWebEngineView()
self.trendWebView.setObjectName("trendWebView")
self.gridLayout.addWidget(self.trendWebView, 0, 4, 15, 22)
self.gridLayout.setSpacing(10)
self.gridLayout.setContentsMargins(20, 20, 20, 20)
3 months ago
Globals.setValue('HistoryWidget', self)
7 months ago
3 months ago
def exchangeProject(self):
self.historyDB = Globals.getValue('historyDBManage')
self.refreshVarList()
7 months ago
def deleteMem(self):
3 months ago
pass # 历史mem相关功能已废弃
7 months ago
def itemCheckstate(self):
3 months ago
pass # 历史mem相关功能已废弃
7 months ago
@QtCore.pyqtSlot(str)
def on_lineEdit_textChanged(self, text):
3 months ago
pass # 历史mem相关功能已废弃
7 months ago
def listContext(self, position):
3 months ago
pass # 历史mem相关功能已废弃
7 months ago
def delVarRecard(self):
3 months ago
pass # 历史mem相关功能已废弃
7 months ago
def getMems(self):
3 months ago
pass # 历史mem相关功能已废弃
7 months ago
def refreshList(self, index):
3 months ago
pass # 历史mem相关功能已废弃
7 months ago
def createHtml(self, varNames):
3 months ago
pass # 历史mem相关功能已废弃
def refreshVarList(self):
# 显示进度条
self.varListWidget.clear()
varNames = []
try:
sql = f'SELECT DISTINCT("varName") FROM "{self.historyDB.table}"'
df = self.historyDB.client.query(sql, mode="pandas")
import pandas as pd
if isinstance(df, pd.DataFrame) and 'varName' in df.columns:
varNames = df['varName'].tolist()
except Exception as e:
print(f"获取变量名失败: {e}")
varNames = []
for name in varNames:
item = QListWidgetItem(str(name))
self.varListWidget.addItem(item)
def showVarTrend(self, item):
varName = item.text()
# 查询该变量历史数据
data, timeList = self.historyDB.queryVarHistory(varName)
if not data or not timeList:
self.trendWebView.setHtml('<h3>无历史数据</h3>')
return
# 构建趋势图
line = Line(init_opts=opts.InitOpts(width='900px', height='500px'))
line.add_xaxis(timeList)
line.add_yaxis(varName, data)
line.set_global_opts(
title_opts=opts.TitleOpts(title=f"{varName} 历史趋势"),
tooltip_opts=opts.TooltipOpts(trigger="axis"),
xaxis_opts=opts.AxisOpts(type_="category", boundary_gap=False),
datazoom_opts=[opts.DataZoomOpts(xaxis_index=0, range_start=0, range_end=100)],
)
html = line.render_embed()
7 months ago
page = QWebEnginePage(self.trendWebView)
3 months ago
page.setHtml('<meta charset="utf-8">\n<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">\n' + html)
7 months ago
self.trendWebView.setPage(page)
self.trendWebView.reload()