Изменить цвет случайных слов текста в QLabel

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

Как это можно реализовать?

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(299, 417)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(10, 40, 281, 371))
        font = QtGui.QFont()
        font.setPointSize(16)
        self.label.setFont(font)
        self.label.setStyleSheet("QLabel {\n"
"    background-color:rgb(221, 221, 221);\n"
"}")
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(10, 10, 281, 23))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "Сквозь волнистые туманы\n"
"Пробирается луна,\n"
"На печальные поляны\n"
"Льет печально свет она.\n"
"\n"
"По дороге зимней, скучной\n"
"Тройка борзая бежит,\n"
"Колокольчик однозвучный\n"
"Утомительно гремит.\n"
"\n"
"Что-то слышится родное\n"
"В долгих песнях ямщика:\n"
"То разгулье удалое,\n"
"То сердечная тоска…"))
        self.pushButton.setText(_translate("MainWindow", "Кнопка"))

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

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

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

Можно попробовать примерно так:

from random import choices, randint
from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(299, 417)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(10, 40, 281, 371))
        font = QtGui.QFont()
        font.setPointSize(16)
        self.label.setFont(font)
        self.label.setStyleSheet("QLabel {\n"
"    background-color:rgb(221, 221, 221);\n"
"}")
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(10, 10, 281, 23))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.label.setText(_translate("MainWindow", "Сквозь волнистые туманы\n"
"Пробирается луна,\n"
"На печальные поляны\n"
"Льет печально свет она.\n"
"\n"
"По дороге зимней, скучной\n"
"Тройка борзая бежит,\n"
"Колокольчик однозвучный\n"
"Утомительно гремит.\n"
"\n"
"Что-то слышится родное\n"
"В долгих песнях ямщика:\n"
"То разгулье удалое,\n"
"То сердечная тоска…"))
        self.pushButton.setText(_translate("MainWindow", "Кнопка"))


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        
        self.text = self.label.text()                                              # !!! 
        self.pushButton.clicked.connect(self.on_clicked)
   
    def on_clicked(self):
        lst = self.text.split()

        n = randint(3, 5)
        words = choices(lst, k=n)
        
        text = self.text
        for word in words:
            text = text.replace(word, f'<span style="color: #f00;">{word}</span>')  # !!! 
        
        text = text.replace('\n', '<br>')                                           # !!! 
        self.label.setTextFormat(QtCore.Qt.RichText)                                # !!! 
        self.label.setText(text)


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

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

→ Ссылка