как извлечь значения заголовка фрейма данных и сохранить их в qlistwidget с использованием pyqt5 в python

#python #dataframe #pyqt5 #qlistwidget #qcheckbox

#python #фрейм данных #pyqt5 #qlistwidget #qcheckbox

Вопрос:

У меня есть приложение с графическим интерфейсом, которое загружает CSV-файл в виде фрейма данных в QTableView и выполняет некоторые функции с данными. одна из функций заключается в извлечении заголовков и сохранении их в QListWidget с флажком или группой флажков.До сих пор я мог просто печатать значения заголовка.

код:

 from PyQt5 import QtCore, QtGui, QtWidgets

import pandas as pd

from PandasModel import PandasModel

import seaborn as sns
import cufflinks as cf
import plotly
import plotly.offline as py
import plotly.express as px 
import plotly.graph_objs as go
from plotly.offline.offline import iplot
cf.go_offline()
cf.set_config_file(offline=False, world_readable=True)


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent=None)
        self.gridLayout_3 = QtWidgets.QGridLayout(self)
        self.gridLayout_3.setObjectName("gridLayout_3")
       
        self.gridLayout_2 = QtWidgets.QGridLayout()
        self.gridLayout_2.setObjectName("gridLayout_2")
       
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")
        
        self.pathLE = QtWidgets.QLineEdit(self)
        self.gridLayout_2.addWidget(self.pathLE, 0, 1, 1, 1)
        

        
        self.loadBtn = QtWidgets.QPushButton("Select File", self)
        self.loadBtn.clicked.connect(self.loadFile)
        self.gridLayout_2.addWidget(self.loadBtn, 0, 0, 1, 1)
        self.gridLayout_3.addLayout(self.gridLayout_2, 0, 0, 1, 4)

       
        self.displayHeader = QtWidgets.QPushButton("Display header", self)
        self.displayHeader.clicked.connect(lambda: self.print_df_header(self.df))
        self.gridLayout.addWidget(self.displayHeader, 2, 0, 1, 1)

        self.pandasTv = QtWidgets.QTableView(self)
        self.verticalLayout.addWidget(self.pandasTv)

        self.pandasTv.setSortingEnabled(True)


     def loadFile(self):
        fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self, "Open File", "", "CSV Files (*.csv)");
        self.pathLE.setText(fileName)
        df = pd.read_csv(fileName)
        model = PandasModel(df)
        self.pandasTv.setModel(model)
        self.df = df


    def print_df_header(self,df):
        print(self.df.columns.tolist())

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
  

Ответ №1:

Надеюсь, это поможет:

 from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setGeometry(QtCore.QRect(170, 100, 256, 192))
        self.listWidget.setObjectName("listWidget")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        self.newCheckBox=QtWidgets.QCheckBox(self.centralwidget)

        
        
        header=QtWidgets.QListWidgetItem()
        
        self.listWidget.addItem(header)
        self.listWidget.addItem("Data")
        
        header.setCheckState(1)
        header.setText("Header")

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
  

Ответ №2:

Я нашел решение для своего вопроса, это было очень просто, и я добавил флажок для каждого элемента.

  def print_df_header(self,df):
        savelist = list(self.df)
        for item in savelist:
            qitem = QtWidgets.QListWidgetItem ( ) 
            qitem.setText ( item ) 
            qitem.setCheckState ( QtCore.Qt.Unchecked ) 
            self.header_list.addItem ( qitem )
        print(list(self.df))