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

Рейтинг: 1Ответов: 1Опубликовано: 05.04.2023

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

Проблема в том, что в датафрейм не передаются значения из QComboBox, которые лежат в ячейках этой таблицы.

Как сделать так, чтобы значения, выбранные в QComboBox, которые находятся в QTableWidget, передавались в датафрейм также, как и все значения из этой таблицы?

from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets
from PyQt5.QtWidgets import *           # Импортировали всё, в том числе,  QApplication
from PyQt5.QtGui import *               # QPainter создаёт фигуры, QBrush - текстура, QPen - дазайн
from PyQt5.QtCore import *
import sys
import pandas as pd


app = QApplication([])
tab = QTabWidget()
tab.setGeometry(0, 0, QApplication.desktop().width(), QApplication.desktop().height())


class Получить_из_Жители:
    df = pd.DataFrame(
        {
            '№': [0, 1, 2, 3, 4, 5, 6, 7],
            'Наличие КПУ': ["", "", "", "", "", "", "", ""] 
            
        }                
    )
    # Создаём табли23 и заполняем её
    headers = df.columns.values.tolist()               # Список имён столбцов
    table = QTableWidget()
    table.setColumnCount(len(headers))                    # Считает количество столбцов для их последующего переименования
    table.setHorizontalHeaderLabels(headers)              # Наименования столбцов
    table.setColumnWidth(0, 120)                          # Ширина столбца 1
    table.setColumnWidth(1, 150)                          # Ширина столбца 2
    table.setColumnWidth(2, 410)
    table.verticalHeader().setVisible(False)              # Удаляет идексы строк
    for i, row in df.iterrows():
        table.setRowCount(8)                         # Пользователь выберен кол-во кв
        for j in range(table.columnCount()):
            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)
            table.setCellWidget(apartment_number, 1, row)
        apartment_number += 1
        
class Загружаем_в_базу_данных:
    global data
    data = Получить_из_Жители.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):
            table_item = data.item(row,col)
            df_list2.append('' if table_item is None else str(table_item.text()))
        df_list.append(df_list2)
    df = pd.DataFrame(df_list, columns=headers)

    print(df)


tab.addTab(Получить_из_Жители.table, "Жители")
tab.setFont(QFont('Times New Roman', 13))

tab.show()
sys.exit(app.exec_())

Ответы

▲ 1Принят

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

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

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