Проблема с кодом PyQt5. Python

Данный код должен при запуске заменять первый столбец в таблице tableWidget_3, а также вычислять разницу времени от первого dataEdit.

Но, при запуске кода происходит это:

    Traceback (most recent call last):
  File "G:\PyCharm\Gui_Программы\Python\Новая папка\SL_lke2.py", line 139, in <module>
    ex = Widget()
  File "G:\PyCharm\Gui_Программы\Python\Новая папка\SL_lke2.py", line 39, in __init__
    self.dateTime0 = self.tableWidget_3.cellWidget(0, 0).dateTime()
AttributeError: 'NoneType' object has no attribute 'dateTime'

main.py:

import sys
from PyQt5 import QtCore, QtWidgets, QtGui, uic
from PyQt5.Qt import *


class Widget(QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi("UI_lke2.1.ui", self) 


        self.tableWidget_3.horizontalHeader().setSectionResizeMode(
            QtWidgets.QHeaderView.Stretch)

        self.btn_add = QtWidgets.QPushButton('Add')
        self.btn_add.clicked.connect(self.add_row)
        self.btn_delete = QtWidgets.QPushButton("Delete")
        self.btn_delete.clicked.connect(self.delete_row)

        self.gridLayout.addWidget(self.tableWidget_3, 0, 0, 1, 2)
        self.gridLayout.addWidget(self.btn_add, 1, 0, 1, 1)
        self.gridLayout.addWidget(self.btn_delete, 1, 1, 1, 1)

        for _ in range(3):
            rowPosition = self.tableWidget_3.rowCount()
            self.tableWidget_3.insertRow(rowPosition)  # !!! insertRow

            date_from = QtWidgets.QDateTimeEdit()
            dateTime = QtCore.QDateTime().currentDateTime()
            date_from.setDateTime(QtCore.QDateTime(
                QtCore.QDate(2021, 8, 26), QtCore.QTime(15, 0, 0)
            )
            )
            date_from.dateTimeChanged.connect(
                lambda dateTime, row=rowPosition:
                self.date_changed(dateTime, row))
            self.tableWidget_3.setCellWidget(rowPosition, 0, date_from)

        self.dateTime0 = self.tableWidget_3.cellWidget(0, 0).dateTime()
        self.date_changed(self.dateTime0, 0)
        self.btn_add.setFocus()

    def add_row(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)

        self.date_changed(dateTime, rowPosition)

    def delete_row(self):
        row = self.tableWidget_3.currentRow()

        if row == 0:
            QMessageBox.warning(
                self,
                "ВНИМАНИЕ",
                "<b style='color: red;'>НЕ НАДО УДАЛЯТЬ ПЕРВУЮ СТРОКУ!</b>"
            )
            return
        elif row == -1:
            msg = QMessageBox.question(
                self,
                'Message',
                "Выберите строку, которую вы хотите удалить.",
                QMessageBox.Ok
            )
            return
        else:
            msg = QMessageBox.question(
                self,
                "Внимание подтвердите удаление строки!",
                "Вы действительно хотите удалить "
                f"строку <b style='color: red;'>{row + 1}</b> ?",
                QMessageBox.Ok | QMessageBox.Cancel
            )
            if msg == QtWidgets.QMessageBox.Cancel:
                return

            for _row in range(self.tableWidget_3.rowCount()):
                date_from = self.tableWidget_3.cellWidget(_row, 0)
                date_from.dateTimeChanged.disconnect()

            self.tableWidget_3.removeRow(row)

            for _row in range(self.tableWidget_3.rowCount()):
                date_from = self.tableWidget_3.cellWidget(_row, 0)
                date_from.dateTimeChanged.connect(
                    lambda dateTime, row=_row:
                    self.date_changed(dateTime, row))
            self.btn_add.setFocus()


    def date_changed(self, dateTime, row):
        if not self.tableWidget_3.cellWidget(row, 0):  # +++
            return  # +++

        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)

    def buttonLoader(self):
        pass
        data_for_word = []
        rows = self.tableWidget_3.rowCount()
        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)
    app.setFont(QtGui.QFont("Times", 12, QtGui.QFont.Bold))
    ex = Widget()
    ex.resize(500, 400)
    ex.show()
    sys.exit(app.exec_())

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

Код ошибки:

Process finished with exit code -1073740791 (0xC0000409)

Код ошибки cmd:

Unknown property Heigth
Unknown property Heigth
Unknown property Heigth
Unknown property Heigth
Unknown property Heigth
Unknown property Heigth
Unknown property Heigth
Unknown property Heigth
Unknown property Heigth
Unknown property Heigth
Unknown property Heigth
Unknown property Heigth
Unknown property Heigth
Unknown property Heigth
Unknown property Heigth
Traceback (most recent call last):
  File "G:\PyCharm\Gui_╧ЁюуЁрьь√\Python\═ютр  яряър\SL_lke2.py", line 43, in dateTime0_init
    self.dateTime0 = self.tableWidget_3.cellWidget(0, 0).dateTime()
AttributeError: 'NoneType' object has no attribute 'dateTime'

Минимальный пример таблицы: test.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>320</width>
    <height>240</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <widget class="QTableWidget" name="tableWidget_3">
      <row>
       <property name="text">
        <string>1</string>
       </property>
      </row>
      <row>
       <property name="text">
        <string>2</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>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>320</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

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

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

Попробуйте сделать так, чтобы расчет

self.dateTime0 = self.tableWidget_3.cellWidget(0, 0).dateTime()

выполнялся после отрисовки окна.

import sys
from PyQt5 import QtCore, QtWidgets, QtGui, uic
from PyQt5.Qt import *


class Widget(QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi("UI_lke2.ui", self) 


        self.tableWidget_3.horizontalHeader().setSectionResizeMode(
            QtWidgets.QHeaderView.Stretch)

        self.btn_add = QtWidgets.QPushButton('Add')
        self.btn_add.clicked.connect(self.add_row)
        self.btn_delete = QtWidgets.QPushButton("Delete")
        self.btn_delete.clicked.connect(self.delete_row)

        self.gridLayout.addWidget(self.tableWidget_3, 0, 0, 1, 2)
        self.gridLayout.addWidget(self.btn_add, 1, 0, 1, 1)
        self.gridLayout.addWidget(self.btn_delete, 1, 1, 1, 1)

        for _ in range(3):
            rowPosition = self.tableWidget_3.rowCount()
            self.tableWidget_3.insertRow(rowPosition)  # !!! insertRow

            date_from = QtWidgets.QDateTimeEdit()
            dateTime = QtCore.QDateTime().currentDateTime()
            date_from.setDateTime(QtCore.QDateTime(
                QtCore.QDate(2021, 8, 26), QtCore.QTime(15, 0, 0)
            )
            )
            date_from.dateTimeChanged.connect(
                lambda dateTime, row=rowPosition:
                self.date_changed(dateTime, row))
            self.tableWidget_3.setCellWidget(rowPosition, 0, date_from)
# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
            QtCore.QTimer.singleShot(10, self.dateTime0_init) 

    def dateTime0_init(self):
        self.dateTime0 = self.tableWidget_3.cellWidget(0, 0).dateTime()
        self.date_changed(self.dateTime0, 0)
        self.btn_add.setFocus()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    def add_row(self):

    ...
...

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>320</width>
    <height>240</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>MainWindow</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
     <widget class="QTableWidget" name="tableWidget_3">
      <column>
       <property name="text">
        <string>1</string>
       </property>
      </column>
      <column>
       <property name="text">
        <string>2</string>
       </property>
      </column>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>320</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

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


Update

Я же вам где-то писал, что в таблице, которую создаете в Qt Designer - СТРОК НЕ ДОЛЖНО БЫТЬ!!! Удалите строки в таблице в Qt Designer.

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

→ Ссылка