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