Изменение цвета строк QTableWidget PyQt5
Мне нужно выделить рандомными цветами топ 5 самых дорогих товаров взятых из файла price.csv и по нажатию кнопки обновить цвета. Так же программа умеет высчитыввать общую сумму чека. Я выполнил основную часть кода, но не могу реализовать раскраску tableWidget разными цветами.
Уменя есть Hex рандомизатор
def r_hex():
r = lambda: randint(0, 255)
return '#%02X%02X%02X' % (r(), r(), r())
Но у меня не выходит вставить результат его выполнения в setStyleSheet и применить его к каждой строке
self.setStyleSheet("""
QTableWidget {
background-color: #55FF77;
color: blue;
}
""")
Внизу весь код не считая ui и пример того как должно работать
import csv
import sys
from random import randint
from PyQt5 import uic
from PyQt5.QtWidgets import QMainWindow, QApplication, QTableWidgetItem
def r_hex():
r = lambda: randint(0, 255)
return '#%02X%02X%02X' % (r(), r(), r())
class Bill(QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi("untitled.ui", self)
self.prise_list = {}
self.initUI()
def initUI(self):
self.setWindowTitle('Интерактивный чек')
self.FullFill()
self.tableWidget.itemChanged.connect(self.UpDate)
self.btn.clicked.connect(self.Repaint)
def FullFill(self):
with open('price.csv', encoding="utf8") as csvfile:
reader = csv.reader(csvfile, delimiter=';', quotechar='"')
next(reader)
for index, row in enumerate(reader):
self.prise_list[row[0]] = int(row[1])
# Сортирую от большего к меньшему словарь prise_list по его значениям
self.prise_list = {k: v for k, v in sorted(self.prise_list.items(), key=lambda item: item[1], reverse=True)}
# Устанавливаю столько строк в таблице сколько есть элементов в списке
self.tableWidget.setRowCount(len(self.prise_list))
# Заполняю 1 столбец названием товаров
[self.tableWidget.setItem(n, 0, QTableWidgetItem(item))
for n, item in enumerate(self.prise_list)]
# 2 столбец ценами
[self.tableWidget.setItem(n, 1, QTableWidgetItem(str(item)))
for n, item in enumerate(self.prise_list.values())]
# третий колтчесво куплинного тавара (там 0)
[self.tableWidget.setItem(n, 2, QTableWidgetItem("0"))
for n in range(len(self.prise_list))]
# составляю цвет
self.setStyleSheet("""
QTableWidget {
background-color: #55FF77;
color: blue;
}
""")
def UpDate(self):
# Рассчитываю сумму к оплате
try:
total = sum([int(self.tableWidget.item(i, 1).text()) * int(self.tableWidget.item(i, 2).text())
for i in range(len(self.prise_list))])
except Exception:
total = "Error"
# Показываю сумму
self.bill.setText(str(total))
def Repaint(self):
# Обновляю виджет по ножатию кнопки
self.repaint()
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyle("Fusion")
ex = Bill()
ex.show()
sys.exit(app.exec())
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Цвет заднего фона можно устанавливать индивидуально через метод setBackground, достаточно перебрать первые 5 строк таблицы и установить цвет заднего фона у ячеек
Пример:
from PyQt5.QtGui import QColor
...
for row in range(5):
rowColor = QColor(r_hex())
for col in range(self.tableWidget.columnCount()):
item = self.tableWidget.item(row, col)
item.setBackground(rowColor)
