class WidgetPandas(QWidget): def __init__(self, parent=None, df=None): super().__init__(parent) if df is None: df = pd.DataFrame() self.tablemodel = PandasDataFrameModel(df=df) self.tableview = QTableView() self.tableview.setModel(self.tablemodel) tableboxlayout = QVBoxLayout() self.tableview.setMinimumWidth(500) self.tableview.setMinimumHeight(250) self.tableview.setWordWrap(False) self.tableview.setShowGrid(False) tableboxlayout.addWidget(self.tableview) self.setLayout(tableboxlayout) @Slot(pd.DataFrame) def setDataFrame(self, df: pd.DataFrame): if df is None: df = pd.DataFrame() self.tablemodel.set_df(df) @Slot() def refreshTable(self): self.tablemodel.beginResetModel() self.tablemodel.endResetModel()
class VernierUpdate(QWidget): def __init__(self, parent=None): super(VernierUpdate, self).__init__(parent) wl_coarse = np.linspace(1480, 1600, 60001) self.fig_coarse = FigureWithToolbar(width=7, height=4) self.fig_coarse.set_limits(ylim=(-30, 5), auto_x=True, auto_y=False) self.fig_coarse.set_labels('Wavelength [nm]', 'Transmission [dB]') self.fig_coarse.plot_line(wl_coarse, np.zeros_like(wl_coarse), label='Vernier') wl_fine = np.linspace(1540, 1541, 201) self.fig_fine = FigureWithToolbar(width=7, height=4) self.fig_fine.set_limits(ylim=(-1, 0), auto_x=True, auto_y=False) self.fig_fine.set_labels('Wavelength [nm]', 'Transmission [dB]') self.fig_fine.plot_line(wl_fine, np.zeros_like(wl_fine), label='MRR1') self.fig_fine.plot_line(wl_fine, np.zeros_like(wl_fine), label='MRR2') self.fig_fine.plot_line(wl_fine, np.zeros_like(wl_fine), label='Vernier') self.peaks_model = PandasModel( pd.DataFrame({ 'Peak wl [nm]': np.full((5, ), fill_value=np.nan), 'Peak lvl [dB]': np.full((5, ), fill_value=np.nan) })) self.peaks_table = QTableView() self.peaks_table.setModel(self.peaks_model) self.peaks_table.setMinimumWidth(160) layout = QHBoxLayout() layout.addWidget(self.fig_coarse) layout.addWidget(self.fig_fine) layout.addWidget(self.peaks_table) self.setLayout(layout) @Slot(object, object) def update_coarse(self, wl, transmission): self.fig_coarse.update_in_place((wl, ), (transmission, )) @Slot(float) def update_fine(self, wl, fine_1, fine_2, fine_vernier): # New fine wavelength range self.fig_fine.update_in_place((wl, wl, wl), (fine_1, fine_2, fine_vernier)) self.fig_fine.update_axes() @Slot() def update_table(self, df): self.peaks_model.set_data(df) self.peaks_table.updateGeometry()
class DataOpenDialog(QDialog): def __init__( self, expected_columns, obligatory_columns, all_columns=None, parent: typing.Optional[PySide2.QtWidgets.QWidget] = None, ): super().__init__(parent) self.file = None self.allcolumns = all_columns if all_columns else expected_columns self.columns = expected_columns self.obligatorycolumns = obligatory_columns self.setWindowTitle('Open Data File') self.filename = QLineEdit() self.filename.setReadOnly(True) self.filename.setMinimumWidth(150) self.loadbutton = QPushButton("Load...") self.loadbutton.clicked.connect(self.file_dialog) layout_left = QVBoxLayout() filebox = QGroupBox('File') layoutf = QFormLayout() layoutf.addRow('File', self.filename) layoutf.addRow('', self.loadbutton) filebox.setLayout(layoutf) layout_left.addWidget(filebox) self.columnsbox = ColumnsGroupBox('Columns order', expected_columns=expected_columns, all_columns=all_columns) self.columnsbox.columns_changes.connect(self.on_columns_order_changed) layout_left.addWidget(self.columnsbox) layout_left.addStretch() layout_right = QVBoxLayout() previewbox = QGroupBox('File 10 lines preview') previewboxlayout = QVBoxLayout() self.preview = QTextEdit() self.preview.setReadOnly(True) self.preview.setLineWrapMode(QTextEdit.NoWrap) self.preview.setMinimumWidth(500) self.preview.setMinimumHeight(170) previewboxlayout.addWidget(self.preview) previewbox.setLayout(previewboxlayout) layout_right.addWidget(previewbox) self.tablemodel = PandasDataFrameModel(df=pd.DataFrame()) self.tableview = QTableView() self.tableview.setModel(self.tablemodel) tablebox = QGroupBox('Data preview') tableboxlayout = QVBoxLayout() self.tableview.setMinimumWidth(500) self.tableview.setMinimumHeight(250) self.tableview.setWordWrap(False) self.tableview.setShowGrid(False) tableboxlayout.addWidget(self.tableview) tablebox.setLayout(tableboxlayout) layout_right.addWidget(tablebox) layout = QHBoxLayout() layout.addLayout(layout_left) layout.addLayout(layout_right) layoutmain = QVBoxLayout() layoutmain.addLayout(layout) self.buttonbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.buttonbox.accepted.connect(self.accept) self.buttonbox.rejected.connect(self.reject) layoutmain.addWidget(self.buttonbox) self.setLayout(layoutmain) self.update_ok() @property def df(self): return self.tablemodel.df def file_dialog(self): filedialog = QFileDialog(caption='Select Data File') filedialog.setFileMode(QFileDialog.ExistingFile) if filedialog.exec(): self.file = filedialog.selectedFiles()[0] self.filename.setText(self.file) lines = [] with open(self.file) as fd: for _ in range(10): lines.append(fd.readline()) self.preview.setText(''.join(lines)) reader = DataFrameReader(self.file) self.tablemodel.set_df(reader.df) self.tablemodel.set_columns(self.columnsbox.columns) self.tableview.resizeRowsToContents() self.update_ok() @Slot() def on_columns_order_changed(self): self.tablemodel.set_columns(self.columnsbox.columns) self.update_ok() def is_ok(self): columns = set(self.tablemodel.df.columns) for c in self.obligatorycolumns: if not isinstance(c, tuple): c = (c, ) c = set(c) if c.isdisjoint(columns): return False return True def update_ok(self): self.buttonbox.button(QDialogButtonBox.Ok).setEnabled(self.is_ok())