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 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())