dev: добавил обработчик ошибок в модули + определил тип вводимых данных в окна настроек

This commit is contained in:
Andrew 2024-12-24 16:25:50 +03:00
parent 8179a33964
commit a66495af52
15 changed files with 100 additions and 53 deletions

View File

@ -51,7 +51,6 @@ class DirectoryMonitor(BaseDirectoryMonitor):
def update_plots(self):
if self._files is not None:
print("updPlot")
self._mediator.notify(self, self._files)
def custom_csv_extract_only(self, path: str):
@ -62,15 +61,12 @@ class DirectoryMonitor(BaseDirectoryMonitor):
self._mediator.notify(self, [None])
def start_raport(self) -> None:
print("startRaport")
self.stop()
self._files = []
print(self._files)
self._files = ['']
self._mediator.notify(self, [None])
def start_seeking(self) -> None:
print("startSeeking")
self._init_state()
self.start()

View File

@ -1,4 +1,7 @@
import pandas as pd
import traceback
import sys
from loguru import logger
from utils.base.base import BasePointPassportFormer, BaseIdealDataBuilder
@ -32,8 +35,16 @@ class idealDataBuilder(BaseIdealDataBuilder):
class PassportFormer(BasePointPassportFormer):
def form_passports(self, data: list[pd.DataFrame]) -> list[list[pd.DataFrame, dict, int]]:
return_data = [self._build_passports_pocket(dataframe) for dataframe in data]
self._mediator.notify(self, return_data)
try:
return_data = [self._build_passports_pocket(dataframe) for dataframe in data]
except:
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
pymsg = "Traceback info:\n" + tbinfo + "\nError Info:\n" + str(sys.exc_info()[1])
logger.error(pymsg)
return_data = []
finally:
self._mediator.notify(self, return_data)
def _build_passports_pocket(self, dataframe: pd.DataFrame) -> list[pd.DataFrame, dict, int]:
@ -64,11 +75,9 @@ class PassportFormer(BasePointPassportFormer):
cache_key = self._generate_cache_key(params_list)
if cache_key in self._ideal_data_cashe :
ideal_data = self._ideal_data_cashe[cache_key]
print(f"Cache hit")
else:
ideal_data = self._build_ideal_data(idealDataBuilder=idealDataBuilder, params=params_list)
self._ideal_data_cashe[cache_key] = ideal_data
print(f"Cache miss. Computed and cached.")
if events is not None:
idx = i+1 if idx_shift else i
point_timeframe = [events[self._stages[0]][0][i], events[self._stages[-1]][1][idx]]

View File

@ -1,5 +1,8 @@
from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel, QGraphicsRectItem
import copy
import traceback
import sys
from loguru import logger
import pyqtgraph as pg
import pandas as pd
from typing import Optional, Any
@ -308,8 +311,16 @@ class PlotWidget(BasePlotWidget):
...
]
"""
widgets_datapack = [self._build_widget(data_sample) for data_sample in data]
self._mediator.notify(self, widgets_datapack)
try:
widgets_datapack = [self._build_widget(data_sample) for data_sample in data]
except:
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
pymsg = "Traceback info:\n" + tbinfo + "\nError Info:\n" + str(sys.exc_info()[1])
logger.error(pymsg)
widgets_datapack = [QLabel(pymsg)]
finally:
self._mediator.notify(self, widgets_datapack)

View File

@ -2,7 +2,10 @@ import pyqtgraph as pg
from pyqtgraph.parametertree import Parameter, ParameterTree
from typing import Union
from PyQt5 import QtWidgets
from cachetools import LRUCache
import traceback
import sys
from loguru import logger
class ReportSettings(QtWidgets.QWidget):
@ -12,28 +15,34 @@ class ReportSettings(QtWidgets.QWidget):
def build(self, index, reg_items: dict, curve_items: dict) -> None:
"""Создает ParameterTree для элементов всех графиков выбранной вкладки"""
self._clear()
param_tree = ParameterTree()
layout = self.layout()
layout.addWidget(param_tree)
"""if index in self._tab_cashe:
body = self._tab_cashe[index]
else:
try:
self._clear()
param_tree = ParameterTree()
layout = self.layout()
layout.addWidget(param_tree)
"""if index in self._tab_cashe:
body = self._tab_cashe[index]
else:
body= [
self._generate_reg_params(reg_items),
self._generate_curve_params(curve_items)
]
self._tab_cashe[index] = body"""
body= [
self._generate_reg_params(reg_items),
self._generate_curve_params(curve_items)
]
self._tab_cashe[index] = body"""
body= [
self._generate_reg_params(reg_items),
self._generate_curve_params(curve_items)
]
# Добавляем параметры в дерево
params = Parameter.create(name='params', type='group', children=body)
params.sigTreeStateChanged.connect(
lambda: self._update_settings(reg_items, curve_items, params)
)
param_tree.setParameters(params, showTop=False)
self._generate_reg_params(reg_items),
self._generate_curve_params(curve_items)
]
# Добавляем параметры в дерево
params = Parameter.create(name='params', type='group', children=body)
params.sigTreeStateChanged.connect(
lambda: self._update_settings(reg_items, curve_items, params)
)
param_tree.setParameters(params, showTop=False)
except:
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
pymsg = "Traceback info:\n" + tbinfo + "\nError Info:\n" + str(sys.exc_info()[1])
logger.error(pymsg)
def _clear(self) -> None:
"""

View File

@ -2,8 +2,9 @@ from typing import Callable, Optional, Any
from PyQt5.QtWidgets import (QWidget, QPushButton,
QLineEdit, QHBoxLayout,
QVBoxLayout, QLabel,
QTableWidget, QTableWidgetItem)
from PyQt5.QtGui import QIntValidator
QTableWidget, QTableWidgetItem,
QStyledItemDelegate)
from PyQt5.QtGui import QIntValidator, QDoubleValidator
from utils.json_tools import read_json, write_json
from utils import qt_settings as qts
@ -88,33 +89,34 @@ class settingsWindow(QWidget):
self._param_table.setColumnCount(0)
return
column_count = len(self._data[first_key]) + 1
column_count = len(self._data[first_key])
self._param_table.setRowCount(len(self._data))
self._param_table.setColumnCount(column_count)
self._param_table.setVerticalHeaderLabels(self._data.keys())
for i, (key, items) in enumerate(self._data.items()):
self._param_table.setItem(i, 0, QTableWidgetItem(key))
int_delegate = ValidatorDelegate(data_type='int', parent=self._param_table)
float_delegate = ValidatorDelegate(data_type='float', parent=self._param_table)
str_delegate = ValidatorDelegate(data_type='str', parent=self._param_table)
for i, (_, items) in enumerate(self._data.items()):
for j, item in enumerate(items):
self._param_table.setItem(i, j+1, QTableWidgetItem(str(item)))
self._param_table.setItem(i, j, QTableWidgetItem(str(item)))
if type(item) == int:
self._param_table.setItemDelegateForRow(i, int_delegate)
elif type(item) == float:
self._param_table.setItemDelegateForRow(i, float_delegate)
else:
self._param_table.setItemDelegateForRow(i, str_delegate)
def _save(self) -> None:
"""Сохраняет текущие параметры из таблицы в self._data и вызывает _upd_func()."""
new_data = {}
row_count = self._param_table.rowCount()
col_count = self._param_table.columnCount()
for i in range(row_count):
key_item = self._param_table.item(i, 0)
if key_item is None:
continue
key = key_item.text()
# Если ключ пустой, пропускаем
if not key:
continue
for i, key in enumerate(self._data.keys()):
row_data = []
for j in range(1, col_count):
for j in range(col_count):
cell_item = self._param_table.item(i, j)
if cell_item is None:
continue
@ -154,7 +156,7 @@ class settingsWindow(QWidget):
return
prev_columns = self._param_table.columnCount()
desired_columns = num_points + 1
desired_columns = num_points
if desired_columns <= prev_columns:
return
@ -188,6 +190,26 @@ class OperatorSettings(settingsWindow):
pass
class ValidatorDelegate(QStyledItemDelegate):
def __init__(self, data_type='str', parent=None):
super().__init__(parent)
self.data_type = data_type
if self.data_type == 'int':
self.validator = QIntValidator()
elif self.data_type == 'float':
self.validator = QDoubleValidator()
self.validator.setNotation(QDoubleValidator.StandardNotation)
else:
self.validator = None
def createEditor(self, parent, option, index):
editor = QLineEdit(parent)
if self.validator:
editor.setValidator(self.validator)
return editor
if __name__ == '__main__':
import pyqtgraph as pg
app = pg.mkQApp("Parameter Tree Example")