Как передать в датафрейм выбранные в 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_())
