Как передать в датафрейм выбранные в QComboBox (который вставлен в ячейку QTableWidget) значения?

У меня есть QTableWidget, содержащий столбец, полностью заполненный QComboBox. Значения этого QTableWidget передаю в pandas.DataFrame(). Проблема в том, что в датафрейм не передаются значения из QComboBox (которые лежат в ячейках этой таблицы). Как сделать так, чтобы значения, выбранные в QComboBox (которые находятся в QTableWidget) передавались в датафрейм также, как и все значения из этой таблицы?


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

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

Попробуйте так:

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


class Get_from_Inhabitants(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        df = pd.DataFrame(
            {
                '№': [0, 1, 2, 3, 4, 5, 6, 7],
                'Наличие КПУ': ["11", "22", "33", "44", "55", "66", "77", "88"] 
                
            }                
        )
        
        # Создаём табли23 и заполняем её
        headers = df.columns.values.tolist()               # Список имён столбцов
# +++        
        self.table = QTableWidget(8, 3, self)
        self.table.resize(640, 200)
        
        self.table.setColumnCount(len(headers))            # Считает количество столбцов для их последующего переименования
        self.table.setHorizontalHeaderLabels(headers)      # Наименования столбцов
        self.table.setColumnWidth(0, 120)                  # Ширина столбца 1
        self.table.setColumnWidth(1, 150)                  # Ширина столбца 2
        self.table.setColumnWidth(2, 410)
    
    
        self.table.verticalHeader().setVisible(False)      # Удаляет идексы строк
        for i, row in df.iterrows():
#            self.table.setRowCount(8)             # Пользователь выберен кол-во кв
            for j in range(self.table.columnCount()):
                self.table.setItem(i, j, QTableWidgetItem(str(row[j])))

    
        # Заполняем столбец "Наличие КПУ" комбобоксами с вариантами выбора значения "Да" и "Нет"z
        apartment_number = 0
        for row in df['Наличие КПУ']:
            if df['№'].loc[apartment_number] != '':
                row = QtWidgets.QComboBox()
                list = ["Да", "Нет"]
                row.addItems(list)
                self.table.setCellWidget(apartment_number, 1, row)
            apartment_number += 1
            
# +++
    def uploading_to_database(self):        
        data = self.table
        col_count = data.columnCount()
        row_count = data.rowCount()  

        headers = [str(data.horizontalHeaderItem(i).text()) \
            for i in range(col_count)]  
            
        df_list = []
        
        for row in range(row_count):
            df_list2 = []
            for col in range(col_count):
# +++
                if col % 2:
                    table_item = data.cellWidget(row, col).currentText()
                    df_list2.append('' if table_item is None else table_item)
                else:
                    table_item = data.item(row, col)
                    df_list2.append('' if table_item is None else str(table_item.text()))
                
            df_list.append(df_list2)
            
        df2 = pd.DataFrame(df_list, columns=headers)
        print(df2)

   
# +++
class Window(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        
        self.tab = QTabWidget(self)
        
        self.inhabitants = Get_from_Inhabitants()
        layout = QVBoxLayout(self.tab)
        layout.addWidget(self.inhabitants)
        
        self.tab.addTab(self.inhabitants, "Жители")
        
        button = QPushButton('Uploading_to_database')
        button.clicked.connect(self.inhabitants.uploading_to_database)
        
        layout_main_window = QtWidgets.QVBoxLayout(self)
        layout_main_window.addWidget(self.tab)
        layout_main_window.addWidget(button)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    app.setFont(QFont('Times New Roman', 13))
    w = Window()
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

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

→ Ссылка