Как отобразить данные в tableWidget при клике по item в listaWidget?

Как реализовать отображение табличных данных из файла .csv в tableWidget по нажатию на item из listWidget, всегда с выгрузкой данных из первого item в первой колонке и выгрузкой данных из item, по которому кликнули, во второй?

import sys
import csv
import pandas as pd
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.Qt import *

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(374, 327)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem)
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout_2.addWidget(self.pushButton)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem1)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setObjectName("listWidget")
        self.horizontalLayout.addWidget(self.listWidget)
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(0)
        self.tableWidget.setRowCount(0)
        self.horizontalLayout.addWidget(self.tableWidget)
        self.verticalLayout.addLayout(self.horizontalLayout)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 374, 22))
        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)

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


class TEST(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(TEST, self).__init__()

        self.setupUi(self)
        self.pushButton.clicked.connect(self.select_file)
        self.listWidget.itemClicked.connect(self.tab_data)

    def select_file(self):
        print("1")

        self.f_name = QtWidgets.QFileDialog.getOpenFileName(self.listWidget, 'β갻?sv', '.', 'csv(*.csv)')[0]
        if not self.f_name:
            return
        with open(self.f_name, newline='') as d:
            reader = csv.reader(d, delimiter=";")
            count = 0
            for row in reader:
                if count == 0:
                    f'{" ".join(row)}'
                    for item in row:
                        self.listWidget.addItem(item)
                else:
                    return
                count += 1

    def tab_data(self):

        numColomn = 0
        if numColomn == 0:
            numRows = len(self.c_name.index)
        else:
            numRows = numColomn
        self.tableWidget.setColumnCount(len(self.c_name.columns))
        self.tableWidget.setRowCount(numRows)
        for i in range(numRows):
            for j in range(len(self.c_name.columns)):
                self.tableWidget.setItem(i, j, QtWidgets.QListWidgetItem(str(self.c_name.iat[i, j])))
        self.c_name = pd.read_csv(self.f_name)

        numColomn = 0
        if numColomn == 0:
            numRows = len(self.c_name.index)
        else:
            numRows = numColomn

            

self.tableWidget.setColumnCount(len(self.c_name.columns))
            self.tableWidget.setRowCount(numRows)
            self.tableWidget.setHorizontalHeaderLabels(self.c_name)

            for i in range(numRows):
                for j in range(len(self.c_name.columns)):
                    self.tableWidget.setItem(i, j, QtWidgets.QTableWidgetItem(str(self.c_name.iat[i, j])))

                    self.tableWidget.resizeColumnsToContents()
                    self.tableWidget.resizeRowsToContents()
        print("2")



if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ui = TEST()
    ui.show()
    sys.exit(app.exec_())

Ответы (1 шт):

Автор решения: S. Nick

Я не совсем понимаю какие данные вы собираетесь выгружать.
Пожалуйста, всегда публикуйте пример своих данных, которые вы используете для тестирования и показывайте изображение, на котором будет понятно что и куда вы хотите выгрузить при нажатии на item из listaWidget.

Я понял вашу задачу так:

main.py

import sys
import csv
# import pandas as pd
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.Qt import *


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(374, 327)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem)
        
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout_2.addWidget(self.pushButton)
        
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem1)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        
        self.listWidget = QtWidgets.QListWidget(self.centralwidget)
        self.listWidget.setObjectName("listWidget")
        self.horizontalLayout.addWidget(self.listWidget)
        
        self.tableWidget = QtWidgets.QTableWidget(self.centralwidget)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setColumnCount(0)
        self.tableWidget.setRowCount(0)
        self.horizontalLayout.addWidget(self.tableWidget)
        
        self.verticalLayout.addLayout(self.horizontalLayout)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 374, 22))
        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)

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


class TEST(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(TEST, self).__init__()
        self.setupUi(self)
        
        self.pushButton.clicked.connect(self.select_file)
        self.listWidget.itemClicked.connect(self.tab_data)
        
        self.csv_reader_rows = []                                                   # +++

    def select_file(self):
        self.f_name = QtWidgets.QFileDialog.getOpenFileName(self.listWidget, 'β갻?sv', '.', 'csv(*.csv)')[0]
        if not self.f_name:
            return
            
        self.listWidget.clear()                                                     # +++  
        self.tableWidget.setRowCount(0)                                             # +++    
        self.tableWidget.setColumnCount(0)                                          # +++
        self.csv_reader_rows = []                                                   # +++
        
        with open(self.f_name, newline='') as d:
            reader = csv.reader(d, delimiter=";")
            
            count = 0
            for row in reader:
                self.csv_reader_rows.append(row)                                   # +++
                if count == 0:
                    f'{" ".join(row)}'
                    for item in row:
                        self.listWidget.addItem(item)
                else:
#                    return                                                        # ---
                    pass                                                           # +++
                    
                count += 1

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
    def tab_data(self, item):
        #print(* self.csv_reader_rows, sep='\n')
        print(f'item.text={item.text()}, row={self.listWidget.currentRow()}\n') 
        
        numColumns = 1
        self.tableWidget.setColumnCount(numColumns)
        numRows = len(self.csv_reader_rows) - 1
        self.tableWidget.setRowCount(numRows)
        self.tableWidget.setHorizontalHeaderLabels([item.text()])
        
        row = self.listWidget.currentRow()
        for i in range(numRows):
            for j in range(numColumns):
                item = QtWidgets.QTableWidgetItem(str(self.csv_reader_rows[i+1][row]))
                self.tableWidget.setItem(i, j, item)
                self.tableWidget.resizeColumnsToContents()
                self.tableWidget.resizeRowsToContents()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ui = TEST()
    ui.show()
    sys.exit(app.exec_())

test.csv

csv_test;a;b;c;d;e
Hello;1;2;3;4;5
World;11;22;33;44;55

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка