diff --git a/src/controller/__pycache__/controller.cpython-310.pyc b/src/controller/__pycache__/controller.cpython-310.pyc index d35f371..dfd9346 100644 Binary files a/src/controller/__pycache__/controller.cpython-310.pyc and b/src/controller/__pycache__/controller.cpython-310.pyc differ diff --git a/src/controller/__pycache__/mediator.cpython-310.pyc b/src/controller/__pycache__/mediator.cpython-310.pyc index e1b40d9..8d1ef3d 100644 Binary files a/src/controller/__pycache__/mediator.cpython-310.pyc and b/src/controller/__pycache__/mediator.cpython-310.pyc differ diff --git a/src/controller/__pycache__/monitor.cpython-310.pyc b/src/controller/__pycache__/monitor.cpython-310.pyc index 3591fbc..7aac475 100644 Binary files a/src/controller/__pycache__/monitor.cpython-310.pyc and b/src/controller/__pycache__/monitor.cpython-310.pyc differ diff --git a/src/controller/__pycache__/passportFormer.cpython-310.pyc b/src/controller/__pycache__/passportFormer.cpython-310.pyc index d3bf475..a158557 100644 Binary files a/src/controller/__pycache__/passportFormer.cpython-310.pyc and b/src/controller/__pycache__/passportFormer.cpython-310.pyc differ diff --git a/src/controller/monitor.py b/src/controller/monitor.py index cac2975..1c24db6 100644 --- a/src/controller/monitor.py +++ b/src/controller/monitor.py @@ -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() diff --git a/src/controller/passportFormer.py b/src/controller/passportFormer.py index ad7ca1c..a773078 100644 --- a/src/controller/passportFormer.py +++ b/src/controller/passportFormer.py @@ -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]] diff --git a/src/gui/__pycache__/mainGui.cpython-310.pyc b/src/gui/__pycache__/mainGui.cpython-310.pyc index ebb4886..4fc53b1 100644 Binary files a/src/gui/__pycache__/mainGui.cpython-310.pyc and b/src/gui/__pycache__/mainGui.cpython-310.pyc differ diff --git a/src/gui/__pycache__/plotter.cpython-310.pyc b/src/gui/__pycache__/plotter.cpython-310.pyc index 927972c..629f6aa 100644 Binary files a/src/gui/__pycache__/plotter.cpython-310.pyc and b/src/gui/__pycache__/plotter.cpython-310.pyc differ diff --git a/src/gui/__pycache__/reportGui.cpython-310.pyc b/src/gui/__pycache__/reportGui.cpython-310.pyc index 26aef5c..5167370 100644 Binary files a/src/gui/__pycache__/reportGui.cpython-310.pyc and b/src/gui/__pycache__/reportGui.cpython-310.pyc differ diff --git a/src/gui/__pycache__/settings_window.cpython-310.pyc b/src/gui/__pycache__/settings_window.cpython-310.pyc index 2f37975..dea8ff3 100644 Binary files a/src/gui/__pycache__/settings_window.cpython-310.pyc and b/src/gui/__pycache__/settings_window.cpython-310.pyc differ diff --git a/src/gui/plotter.py b/src/gui/plotter.py index 95d5c7a..9865c16 100644 --- a/src/gui/plotter.py +++ b/src/gui/plotter.py @@ -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) \ No newline at end of file diff --git a/src/gui/reportGui.py b/src/gui/reportGui.py index 10a7e59..ab8e62b 100644 --- a/src/gui/reportGui.py +++ b/src/gui/reportGui.py @@ -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: """ diff --git a/src/gui/settings_window.py b/src/gui/settings_window.py index f159165..d98f64c 100644 --- a/src/gui/settings_window.py +++ b/src/gui/settings_window.py @@ -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") diff --git a/src/utils/__pycache__/qt_settings.cpython-310.pyc b/src/utils/__pycache__/qt_settings.cpython-310.pyc index 58e1566..ab55d50 100644 Binary files a/src/utils/__pycache__/qt_settings.cpython-310.pyc and b/src/utils/__pycache__/qt_settings.cpython-310.pyc differ diff --git a/src/utils/base/__pycache__/base.cpython-310.pyc b/src/utils/base/__pycache__/base.cpython-310.pyc index bc21cfb..e19bdba 100644 Binary files a/src/utils/base/__pycache__/base.cpython-310.pyc and b/src/utils/base/__pycache__/base.cpython-310.pyc differ