PyQT6 | QTableWidgetItem Проблема с кодом и тестирующей системой

Написал код под задачу

import csv
import sys
from PyQt6.QtWidgets import QWidget, QApplication, QVBoxLayout, QLineEdit, QTableWidgetItem, QTableWidget


class InteractiveReceipt(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(300, 300, 500, 500)
        self.setWindowTitle('Интерактивный чек')
        self.initUI()

    def initUI(self):
        with open('price.csv', encoding='utf-8') as file:
            reader = csv.reader(file, delimiter=';')
            data = list(reader)[1:]
        rows = []

        for row in data:
            if len(row) >= 2 and row[0] and row[1]:
                name = row[0].strip('"')
                price = row[1]
                rows.append([name, price])

        self.tableWidget = QTableWidget()
        self.total = QLineEdit()

        self.tableWidget.setColumnCount(3)
        self.tableWidget.setHorizontalHeaderLabels(['Название', 'Цена', 'Количество'])
        self.tableWidget.setRowCount(len(rows))

        for i, row in enumerate(rows):
            name, price = row
            self.tableWidget.setItem(i, 0, QTableWidgetItem(name))
            self.tableWidget.setItem(i, 1, QTableWidgetItem(price))
            quantity_Edit = QLineEdit('0')
            quantity_Edit.textChanged.connect(self.mathing)
            self.tableWidget.setCellWidget(i, 2, quantity_Edit)

        layout = QVBoxLayout()
        layout.addWidget(self.tableWidget)
        layout.addWidget(self.total)
        self.setLayout(layout)

        self.mathing()

    def mathing(self):
        total = 0
        try:
            for i in range(self.tableWidget.rowCount()):
                item = self.tableWidget.item(i, 1)
                price = int(item.text())
                widget = self.tableWidget.cellWidget(i, 2)
                quantity = int(widget.text())
                total += quantity * price
            self.total.setText(str(total))
        except ValueError:
            return


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = InteractiveReceipt()
    window.show()
    sys.exit(app.exec())

Но тестирующая система выдаёт

Ввод:

test_case = 1

names = ["Гвозди", "Молотки", "Перфоратор", "Шурупы", "Болты", "Гайки"]
prices = [100, 200, 400, 125, 25, 40]
form_string = '\n'.join(f'"{name}";{price};' for name, price in zip(names, prices))

with open("price.csv", "w", encoding='UTF-8') as price:
    price.write("Название;Цена\n" + form_string)

Ожидаемый результат:

OK

Вывод:

0
error
<class 'AssertionError'>

Test : 1 has not passed 

Сообщение:

Different number of lines: out = 5, corr = 1

Можете подсказать в чём проблема пожалуйста и как её устранить?


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

Автор решения: Valls

Проблему решил самостоятельно.

Природа объектов:

QTableWidgetItem - это данные таблицы, элемент содержимого
QLineEdit - это виджет, элемент интерфейса для ввода

Система не видела.

Итоговый код:

import csv
import sys
from PyQt6.QtWidgets import QWidget, QApplication, QVBoxLayout, QLineEdit, QTableWidgetItem, QTableWidget

class InteractiveReceipt(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(300, 300, 500, 500)
        self.setWindowTitle('Интерактивный чек')
        self.initUI()

    def initUI(self):
        with open('price.csv', encoding='utf-8') as file:
            reader = csv.reader(file, delimiter=';')
            data = list(reader)[1:]
        rows = []

        for row in data:
            if len(row) >= 2 and row[0] and row[1]:
                name = row[0].strip('"')
                price = row[1]
                rows.append([name, price])

        self.tableWidget = QTableWidget()
        self.total = QLineEdit()

        self.tableWidget.setColumnCount(3)
        self.tableWidget.setHorizontalHeaderLabels(
            ['Название', 'Цена', 'Количество'])
        self.tableWidget.setRowCount(len(rows))

        for i, row in enumerate(rows):
            name, price = row
            self.tableWidget.setItem(i, 0, QTableWidgetItem(name))
            self.tableWidget.setItem(i, 1, QTableWidgetItem(price))
            quantity_Edit = QLineEdit('0')
            quantity_Edit.textChanged.connect(self.mathing)
            self.tableWidget.setCellWidget(i, 2, quantity_Edit)

        layout = QVBoxLayout()
        layout.addWidget(self.tableWidget)
        layout.addWidget(self.total)
        self.setLayout(layout)

        self.mathing()

    def mathing(self):
        total = 0
        try:
            for i in range(self.tableWidget.rowCount()):
                item = self.tableWidget.item(i, 1)
                price = int(item.text())
                widget = self.tableWidget.cellWidget(i, 2)
                quantity = int(widget.text())
                total += quantity * price
            self.total.setText(str(total))
            print(total)
        except ValueError:
            return


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = InteractiveReceipt()
    window.show()
    sys.exit(app.exec())
→ Ссылка