Проблема с считыванием данных из tableWidget
Имеется код:
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QWidget, QLabel
from PyQt5 import uic
from PyQt5.QtWidgets import QMainWindow
from PyQt5 import QtCore, QtWidgets
from PyQt5.Qt import *
class Widget(QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi("UI_lke2.1.ui", self)
# Добавить/удалить строку в tableWidget_2
self.pushButton_7.clicked.connect(self.buttonAdd)
self.pushButton_8.clicked.connect(self.buttonDelete)
# Добавить/удалить строку в tableWidget_3
self.pushButton_9.clicked.connect(self.buttonAdd_2)
self.pushButton_10.clicked.connect(self.buttonDelete_2)
#
self.pushButton.clicked.connect(self.buttonSave)
for row in range(self.tableWidget_3.rowCount()):
date_from = QtWidgets.QDateTimeEdit()
date_from.setDateTime(
QtCore.QDateTime(QtCore.QDate(2021, 8, 26),
QtCore.QTime(15, 0, 0))
)
self.tableWidget_3.setCellWidget(row, 0, date_from)
for row in range(self.tableWidget_3.rowCount()):
date_from = QDateTimeEdit()
date_from.setDateTime(
QDateTime(QDate(2021, 9, 2))
)
date_from.dateTimeChanged.connect(
lambda dateTime, row=row: self.date_changed(dateTime, row))
self.tableWidget_3.setCellWidget(row, 0, date_from)
self.dateTime0 = self.tableWidget_3.cellWidget(0, 0).dateTime()
# Расчет времени от начального значения
def date_changed(self, dateTime, row):
if row == 0:
self.dateTime0 = self.tableWidget_3.cellWidget(row, 0).dateTime()
for row in range(1, self.tableWidget_3.rowCount()):
dateTime2 = self.tableWidget_3.cellWidget(row, 0).dateTime()
item = QTableWidgetItem()
item.setData(Qt.DisplayRole,
self.dateTime0.secsTo(dateTime2) / 60. / 60.)
self.tableWidget_3.setItem(row, 1, item)
return
dateTime2 = self.tableWidget_3.cellWidget(row, 0).dateTime()
item = QTableWidgetItem()
item.setData(Qt.DisplayRole,
self.dateTime0.secsTo(dateTime2) / 60. / 60.)
self.tableWidget_3.setItem(row, 1, item)
# Кнопка дабовляющая строку в таблицу tableWidget_2
def buttonAdd(self):
rowPosition = self.tableWidget_2.rowCount()
self.tableWidget_2.insertRow(rowPosition)
# Кнопка удаляющая строку в таблицу tableWidget_2
def buttonDelete(self):
if self.tableWidget_2.rowCount() > 0:
self.tableWidget_2.removeRow(self.tableWidget_2.rowCount()-1)
# Кнопка дабовляющая строку в таблицу tableWidget_3
def buttonAdd_2(self):
rowPosition = self.tableWidget_3.rowCount()
self.tableWidget_3.insertRow(rowPosition)
date_from = QtWidgets.QDateTimeEdit()
dateTime = QtCore.QDateTime().currentDateTime()
date_from.setDateTime(dateTime)
date_from.dateTimeChanged.connect(
lambda dateTime, row=rowPosition:
self.date_changed(dateTime, row))
self.tableWidget_3.setCellWidget(rowPosition, 0, date_from)
# Кнопка удаляющая строку в таблицу tableWidget_3
def buttonDelete_2(self):
if self.tableWidget_3.rowCount() > 0:
self.tableWidget_3.removeRow(self.tableWidget_2.rowCount() - 1)
# Сохранение данных из tableWidget_3
def buttonSave(self):
data_for_word = []
rows = self.tableWidget_3.rowCount()
self.cols = self.tableWidget_3.columnCount()
for row in range(rows):
dateTime = self.tableWidget_3.cellWidget(row, 0). \
dateTime().toString('dd.MM.yyyy hh:mm')
item = self.tableWidget_3.item(row, 1)
_data = item.data(Qt.DisplayRole)
data_for_word.append([dateTime, _data])
print(f'\n{data_for_word}\n')
print(*data_for_word, sep='\n')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Widget()
ex.show()
sys.exit(app.exec_())
Который по нажатию на кнопку pushButton должен сохранять данные из таблицы в массив, но этого не происходит. В cmd показывает ошибку:
Unknown property Heaigth
Unknown property Heaigth
Unknown property Heaigth
Traceback (most recent call last):
File "G:\PyCharm\Gui_╧ЁюуЁрьь√\Python\═ютр яряър\SL_lke2.py", line 96, in buttonSave
_data = item.data(Qt.DisplayRole)
AttributeError: 'NoneType' object has no attribute 'data'
Как решить данную проблему?
Пример заполнения:
UI_lke2.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>640</width>
<height>480</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="pushButton_10">
<property name="text">
<string>Удалить</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_9">
<property name="text">
<string>Добавить</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="0">
<widget class="QTableWidget" name="tableWidget_3">
<row>
<property name="text">
<string>New Row</string>
</property>
</row>
<column>
<property name="text">
<string>1</string>
</property>
</column>
<column>
<property name="text">
<string>2</string>
</property>
</column>
<column>
<property name="text">
<string>3</string>
</property>
</column>
<column>
<property name="text">
<string>4</string>
</property>
</column>
<column>
<property name="text">
<string>5</string>
</property>
</column>
<column>
<property name="text">
<string>6</string>
</property>
</column>
<column>
<property name="text">
<string>7</string>
</property>
</column>
<column>
<property name="text">
<string>8</string>
</property>
</column>
<column>
<property name="text">
<string>9</string>
</property>
</column>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>Считать данные</string>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>640</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Вы предоставили модуль UI_lke2.ui, который не соответствует переменным модуля main.py. Пожалуйста будьте внимательнее и прежде чем опубликовать вопрос, проверяйте чтобы ваше приложение запускалось.
Ошибка в том, что ячейка 2 в строке New Row - пустая.
Результат строки item = self.tableWidget_3.item(row, 1) - None,
а None не имеет атрибута data, о чем вам и сообщается:
AttributeError: 'NoneType' object has no attribute 'data'
Замените строку:
_data = item.data(Qt.DisplayRole)
на
_data = item.data(Qt.DisplayRole) if item else 0
