Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/64: Рейтинг темы: голосов - 64, средняя оценка - 4.86
29 / 29 / 0
Регистрация: 31.01.2020
Сообщений: 181

Интерактивный чек

22.10.2020, 18:49. Показов 15153. Ответов 9

Студворк — интернет-сервис помощи студентам
Вам дан файл в формате csv с ценами на товары некоторого магазина (например, такой), содержащий название товара и его цену через разделитель ’;’. С помощью виджетов PyQT отобразите содержимое файла в виде таблицы и добавьте колонку «Количество», в которой значения для каждого из товаров первоначально будет равно нулю. Пользователь может менять значение в поле «Количество».

Кроме того, добавьте отображение итоговой суммы покупок, используя наиболее подходящий для этого на ваш взгляд виджет. Отображаемое значение в виджете должно рассчитываться как сумма цен товаров, умноженных на их количество. При изменении количества любого из товаров должна пересчитываться итоговая сумма.
Миниатюры
Интерактивный чек  
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.10.2020, 18:49
Ответы с готовыми решениями:

Длинный чек
Для работы небольшого магазинчика вас попросили сделать небольшой набор функций, обеспечивающих работу с чеками. В качестве пробной версии...

Длинный чек
Ограничение времени 1 секунда Ограничение памяти 64Mb Ввод стандартный ввод или input.txt Вывод стандартный вывод или...

Интерактивный график
Добрый день спаситепомоги. Пытаюсь найти простой способ сделать график в html, где бы график менялся от выбранных юзером опций. Нужно...

9
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
26.10.2020, 08:55
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import sys
from PySide2 import QtWidgets, QtCore
 
 
DATA_BASE = [
    ["Гвозди",      100,    0],
    ["Молоток",     200,    0],
    ["Перфоратор",  400,    0],
    ["Шурупы",      125,    0],
    ["Болты",       25,     0],
    ["Гайки",       40,     0]
]
 
 
class Table(QtWidgets.QTableView, QtCore.QAbstractTableModel):
 
    amountChanged: QtCore.SignalInstance = QtCore.Signal(int)
 
    def __init__(self, parent: QtWidgets.QWidget = None):
        QtWidgets.QTableView.__init__(self, parent)
        self.verticalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
        self.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
 
        QtCore.QAbstractTableModel.__init__(self, parent)
        self.setModel(self)
 
        if not parent:
            self.show()
 
    def rowCount(self, parent: QtCore.QModelIndex = ...) -> int:
        return len(DATA_BASE)
 
    def columnCount(self, parent: QtCore.QModelIndex = ...) -> int:
        return 3
 
    def headerData(self, section: int, orientation: QtCore.Qt.Orientation, role: int = ...) -> any:
        if role == QtCore.Qt.DisplayRole and orientation == QtCore.Qt.Horizontal:
            return ["Название", "Цена", "Количество"][section]
        elif role == QtCore.Qt.DisplayRole and orientation == QtCore.Qt.Vertical:
            return section
 
    def data(self, index: QtCore.QModelIndex, role: int = ...) -> any:
        if role in (QtCore.Qt.DisplayRole, QtCore.Qt.EditRole):
            return DATA_BASE[index.row()][index.column()]
 
    def setData(self, index: QtCore.QModelIndex, value: any, role: int = ...) -> bool:
        if role == QtCore.Qt.EditRole:
            DATA_BASE[index.row()][index.column()] = value
            self.amountChanged.emit(sum(a * p for _, a, p in DATA_BASE))
            self.dataChanged(index, index, [role])
            return True
        return False
 
    def flags(self, index: QtCore.QModelIndex) -> QtCore.Qt.ItemFlags:
        return (QtCore.Qt.ItemIsEnabled
                | QtCore.Qt.ItemIsSelectable
                | (0 if index.column() != 2 else QtCore.Qt.ItemIsEditable))
 
 
class Window(QtWidgets.QWidget):
 
    def __init__(self, parent: QtWidgets.QWidget = None):
        QtWidgets.QWidget.__init__(self, parent)
 
        self.table = Table(self)
        self.total = QtWidgets.QLineEdit("0", self)
        self.total.setReadOnly(True)
 
        self.table.amountChanged.connect(lambda v: self.total.setText(str(v)))
 
        layout = QtWidgets.QFormLayout(self)
        layout.addRow(self.table)
        layout.addRow("Итого:", self.total)
 
        if not parent:
            self.show()
 
 
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    window = Window()
    sys.exit(app.exec_())
3
4 / 3 / 1
Регистрация: 20.06.2022
Сообщений: 9
01.11.2022, 19:11
виджет делайте сами)

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import csv
import sys
 
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidgetItem
from PyQt5 import QtCore, QtGui, QtWidgets
 
class MyWidget(QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi('Интерактивный чек.ui', self)
        self.setWindowTitle('Интерактивный чек')
        self.loadTable('price.csv')
        self.tableWidget.itemChanged.connect(self.sum)
 
    def loadTable(self, table_name):
        with open(table_name, encoding="utf8") as csvfile:
            reader = csv.reader(csvfile, delimiter=';', quotechar='"')
            title = next(reader)
            self.tableWidget.setColumnCount(len(title) + 1)
            self.tableWidget.setHorizontalHeaderLabels(title + ["Количество"])
            self.tableWidget.setRowCount(0)
            for i, row in enumerate(reader):
                self.tableWidget.setRowCount(self.tableWidget.rowCount() + 1)
                for j, elem in enumerate(row):
                    self.tableWidget.setItem(i, j, QTableWidgetItem(elem))
                    self.tableWidget.setItem(i, 2, QTableWidgetItem("0"))
        self.tableWidget.resizeColumnsToContents()
        self.tableWidget.horizontalHeader().setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
 
    def sum(self):
        overall = 0
        price = [int(self.tableWidget.item(z, 1).text()) for z in range(self.tableWidget.rowCount())]
        count = [int(self.tableWidget.item(z, 2).text()) for z in range(self.tableWidget.rowCount())]
        for z in range(len(price)):
            overall += price[z] * count[z]
        self.overall.setText(str(overall))
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyWidget()
    ex.show()
    sys.exit(app.exec())
0
0 / 0 / 0
Регистрация: 04.11.2022
Сообщений: 2
04.11.2022, 12:16
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import csv
import sys
 
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidgetItem
 
 
class DataShower(QMainWindow):
    def __init__(self):
        super().__init__()
        self.items = []
        uic.loadUi('untitled.ui', self)
        self.loadUi()
 
    def loadUi(self):
        with open('price.csv', encoding='utf-8') as r:
            data = csv.reader(r, delimiter=';')
            for item, price in sorted(list(data)[1:], key=lambda x: int(x[1]), reverse=True):
                self.items.append([QTableWidgetItem(item), QTableWidgetItem(price), QTableWidgetItem('0')])
        self.tableView.setRowCount(len(self.items))
        for row in range(len(self.items)):
            for colum in range(3):
                self.tableView.setItem(row, colum, self.items[row][colum])
        self.tableView.itemChanged.connect(self.change)
 
    def change(self):
        finalPrice = str(sum([int(self.tableView.item(row, 1).text()) * int(self.tableView.item(row, 2).text()) 
                              for row in range(len(self.items))]))
        self.lineEdit.setText(finalPrice)
0
7 / 7 / 0
Регистрация: 27.02.2022
Сообщений: 35
17.10.2023, 16:06
Добавлено через 3 минуты
iSmokeJC


С одной стороны ты прав, с другой же стороны каждый человек стоит перед своим выбором: списывать / делать самому
Да и к тому же чем меньше умных людей, тем проще проходить куда-либо, так что ребятааа списывайте скореее мой кооод


Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import sys
import csv
from PyQt5.QtWidgets import QApplication, QMainWindow, QLineEdit, QTableWidget, QTableWidgetItem
from PyQt5.QtCore import Qt
 
 
class InteractiveReceipt(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(500, 250, 600, 600)
        self.setFixedSize(600, 600)
        self.setWindowTitle('DataShower')
        self.setMouseTracking(True)
 
        self.total = QLineEdit("0", self)
        self.total.setEnabled(False)
        self.total.setGeometry(250, 525, 100, 50)
 
        with open("price.csv", mode="r", encoding="UTF 8") as input_file:
            reader = csv.reader(input_file, delimiter=";", quotechar='"')
            self.data = [[name, value] for (name, value, *args) in reader if len(args)]
 
        self.tableWidget = QTableWidget(len(self.data), 3, self)
        self.tableWidget.setHorizontalHeaderLabels(['Название', 'Цена', 'Количество'])
        self.tableWidget.horizontalHeader().setDefaultSectionSize(200)
        self.tableWidget.setGeometry(0, 0, 800, 500)
 
        for index, line in enumerate(self.data):
            arr = QTableWidgetItem(line[0]), QTableWidgetItem(line[1]), QTableWidgetItem('0')
 
            for elem in arr:
                elem.setTextAlignment(Qt.AlignCenter)
 
            self.tableWidget.setItem(index, 0, arr[0])
            self.tableWidget.setItem(index, 1, arr[1])
            self.tableWidget.setItem(index, 2, arr[2])
 
        self.tableWidget.cellChanged.connect(self.change_data)
 
    def change_data(self):
        r = self.tableWidget.rowCount()
        total = sum(
            int(self.tableWidget.item(row, 1).text()) * int(self.tableWidget.item(row, 2).text()) for row in range(r))
        self.total.setText(str(total))
 
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = InteractiveReceipt()
    ex.show()
    sys.exit(app.exec())
1
17.10.2023, 16:25

Не по теме:

Цитата Сообщение от Shipuchka_47 Посмотреть сообщение
ребятааа списывайте скореее мой кооод
наверное, ребятам уже код без надобности... через три года-то :)

0
7 / 7 / 0
Регистрация: 27.02.2022
Сообщений: 35
17.10.2023, 19:21
Вдруг кому-то ещё попадётся данная задача, почему нет)
0
2 / 2 / 0
Регистрация: 31.03.2024
Сообщений: 32
29.10.2024, 13:39
Поверьте, в задаче ни на йоту ничего не изменилось

Добавлено через 3 минуты
Вам дан файл price.csv с ценами на товары некоторого магазина, содержащий название товара и его цену через разделитель ’;’.
С помощью QTableWidget отобразите содержимое файла в виде таблицы и добавьте колонку «Количество», в которой значения для каждого из товаров первоначально будет равно нулю. Пользователь может менять значение в поле «Количество».

Кроме того, добавьте отображение итоговой суммы покупок, используя для этого отдельный виджет. Отображаемое значение в виджете должно рассчитываться как сумма цен товаров, умноженных на их количество. При изменении количества любого из товаров должна пересчитываться итоговая сумма.

https://contest.yandex.ru/test... g2Mzg1MCJ9

Класс, реализующий окно приложения, назовите InteractiveReceipt. Виджет, содержащий таблицу, назовите tableWidget. Поле с выводом итоговой суммы должно быть типа QLineEdit с названием total



А это сама задача и ссылка на gif
0
Эксперт PythonЭксперт Java
19530 / 11067 / 2931
Регистрация: 21.10.2017
Сообщений: 23,294
29.10.2024, 13:41
IT-Attack, и дальше что?
0
2 / 2 / 0
Регистрация: 31.03.2024
Сообщений: 32
29.10.2024, 14:53
QWidget: Must construct a QApplication before a QWidget
make: *** [Makefile:5: run] Aborted

Каждый раз, как вылетает такая ошибка я не понимаю, что с ней делать. Вроде, все понятно - просто надо QApplication поставить раньше QWidget, но при повторной отправке яндекс говорит тоже самое. Я не знаю, как быть. Помогите, пожалуйста.

Кстати, как на этом сайте настроить уведомления на ответы на мои сообщения, чтобы, когда мне кто-то отвечал, я мог это увидеть? А не то, чтобы я оставил ответ и никогда больше о нем не вспоминал.

Добавлено через 58 секунд
iSmokeJC, просто указал, что ничего не поменялось

Добавлено через 4 минуты
Кстати, вы "разминаетесь" перед работой тем, что помогаете кому-либо на форуме или по доброте душевной помогаете Я.Лицеистам? Все время, что читал комментарии, было интересно спросить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.10.2024, 14:53
Помогаю со студенческими работами здесь

Matplotlib: интерактивный граф
Здравствуйте! Можно ли в matplotlib сделать интерактивный граф? Я написал граф, вывел его в окне. Следующий шаг - кликаю мышкой по...

Интерактивный режим Python
Помогите пожалуйста разобраться. У меня есть класс "CLASS" с некоторыми методами, допустим функция "REMOVE()" - одна из методов...

Чек
Напишите функцию export_check(text), которая принимает на вход текст, где каждая строка состоит из: названия товара (строка) цены за...

Чек
Есть код, работает на всех компиляторах, которые я знаю, но 'компилятор - учитель' не пропускает. В чем проблема? Вот код: from...

Чек
Напишите функцию export_check(text), которая принимает на вход текст, где каждая строка состоит из: 1. названия товара (строка) 2....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru