Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Изменение цвета символов в QTextEdit [RSS Feed]

#1 Апрель 24, 2024 03:43:02

Devik
Зарегистрирован: 2024-04-24
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение цвета символов в QTextEdit

Есть 2 QTextEdit: textedit - для ввода текста; textedit_bg - фоновый текст, с которого вводятся символы.

Нужно, чтобы при вводе неверного символа, он окрашивался в красный в textedit, также символ заменяется и в textedit_bg, но уже без изменения цвета (т.к его не будет видно). Если неверный символ стирается, вернуть фоновый символ, который был до изменения. И так должно работать через интервалы, т.е правильные и неправильные символы могут чередоваться.

Код:

 from sys import argv, exit
from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *
from random import shuffle
texts = ['Contented you dearest pleased happiness afraid use. Bachelor entirely vanity alone out travelling terms '
         'along. Otherwise open prepared prosperous weddings tastes. Cousin engage knew confined distrusts. Fifteen '
         'around adapted doubtful opinions ten boy introduced merits late those admire.',
         'Examine general what calling friends relied precaution highly disposed. Connection ignorant vexed enabled '
         'husbands explained norland strangers morning past. Vexed interested dull listening sitting wise. Voice '
         'newspaper its been improve are hope horrible eldest. Dwelling graceful scarcely very.']
class Window(QMainWindow):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.setWindowTitle('TextEdit')
        self.setMinimumSize(820, 0)
        self.setMaximumSize(820, 1200)
        self.centralwidget = QWidget(self)
        self.centralwidget.setObjectName(u"centralwidget")
        self.setCentralWidget(self.centralwidget)
        self.layout = QGridLayout(self.centralwidget)
        self.layout.setObjectName(u"layout")
        self.textedit_bg = QTextEdit(self)
        self.textedit_bg.setObjectName(u"textedit_bg")
        self.textedit_bg.setStyleSheet('''
            #textedit_bg {
                background-color: #FF7F50;
                color: #FFFF00;
                font: 16pt "Anonymous Pro";
            }
        ''')
        self.textedit_bg.setWordWrapMode(QTextOption.NoWrap)
        self.textedit = QTextEdit(self)  # !!! lineedit
        self.textedit.setObjectName(u"textedit")
        self.textedit.setStyleSheet('''
            #textedit {
                background-color: transparent;
                color: #0000CD;
                font: 16pt "Anonymous Pro";
            }
        ''')
        self.textedit.setWordWrapMode(QTextOption.NoWrap)
        self.textedit.cursorPositionChanged.connect(self._change_cursor)
        self.textedit.selectionChanged.connect(self._change_selection)
        self.layout.addWidget(self.textedit_bg, 1, 1)
        self.layout.addWidget(self.textedit, 1, 1)
        self.button = QPushButton('Create Text', self)
        self.layout.addWidget(self.button, 2, 1)
        self.button.clicked.connect(self.capacity)
        self.textedit_bg.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.textedit_bg.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.textedit.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.textedit.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.textedit_bg.setFixedHeight(132)
        self.textedit.setFixedHeight(132)
        self.textedit.setFocus()
        self.text_res = ''
        self.index = 0
        self.index_error = []
        self.textedit.textChanged.connect(self.result)
    def result(self):
        text = self.textedit.toPlainText()
        text_bg = self.textedit_bg.toPlainText().split('\n')[0]
        text_no_mistakes = '\n'.join(self.text_res[self.index - 1:self.index + 3])
        text_entered = ''
        if 0 <= len(text) <= len(text_bg):
            for i, t in enumerate(text_bg[:len(text)]):
                if t != text[i]:
                    text_entered += text[i]
                    continue
                text_entered += t
            self.textedit_bg.setText(text_entered + text_no_mistakes[len(text):])
        if len(text) > len(text_bg.split('\n')[0]):
            self.textedit.textCursor().deletePreviousChar()
            return
    def capacity(self):
        if not self.text_res:
            self.text_res = self.get_texts()
        if self.index == len(self.text_res) - 4:
            for i in self.text_res[:self.index]:
                self.text_res.remove(i)
            self.text_res += self.get_texts()
            self.index = 0
        text = '\n'.join(self.text_res[self.index:self.index + 4])
        self.textedit_bg.setText(text)
        self.index += 1
    def get_texts(self):
        shuffle(texts)
        result = []
        for i, item in enumerate(texts):
            lst = []
            for w in item.split():
                if 787 < self.__get_pixels_wide(' '.join(lst + [w])):
                    result.append(lst)
                    lst = []
                lst.append(w)
            result.append(lst)
        return list(map(' '.join, result))
    def _change_cursor(self):
        cursor = self.textedit.textCursor()
        if cursor.positionInBlock() < len(self.textedit.document().toPlainText()):
            cursor.movePosition(QTextCursor.End)
            self.textedit.setTextCursor(cursor)
    def _change_selection(self):
        cursor = self.textedit.textCursor()
        cursor.clearSelection()
        self.textedit.setTextCursor(cursor)
    def __get_pixels_wide(self, words):
        return self.textedit_bg.fontMetrics().boundingRect(words).width()
if __name__ == "__main__":
    app = QApplication(argv)
    window = Window()
    window.show()
    exit(app.exec())

Офлайн

#2 Апрель 24, 2024 12:53:44

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2699
Репутация: +  182  -
Профиль   Отправить e-mail  

Изменение цвета символов в QTextEdit

Тебе символы раскрашивать надо? Тогда используй метод setTextColor



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Апрель 24, 2024 17:45:01

Devik
Зарегистрирован: 2024-04-24
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение цвета символов в QTextEdit

Rodegast
setTextColor
А как мне раскрасить определенных индексы?

Офлайн

#4 Апрель 24, 2024 18:51:11

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2699
Репутация: +  182  -
Профиль   Отправить e-mail  

Изменение цвета символов в QTextEdit

Примерно так:
1) Устанавливаешь курсов в нужную позицию

 cursor = self.textedit.textCursor()
cursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, позиция)
self.textedit.setTextCursor(cursor)
2) Устанавливаем цвет текста
 self.textedit.setTextColor(QColor(цвет))
3) Вставляем текст
 self.textedit.insertPlainText(текст)
Если нужно более продвинутое раскрашивание, то смотри в сторону QSyntaxHighlighter.
https://github.com/PySide/Examples/blob/master/examples/richtext/syntaxhighlighter.py



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Апрель 24, 2024 18:57:22)

Офлайн

#5 Апрель 24, 2024 21:29:58

Devik
Зарегистрирован: 2024-04-24
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение цвета символов в QTextEdit

Ну проблема в том, что перемещение курсора у меня отключено в функции _change_cursor, поэтому с перемещением курсора не подойдет.

Офлайн

#6 Апрель 24, 2024 23:12:49

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2699
Репутация: +  182  -
Профиль   Отправить e-mail  

Изменение цвета символов в QTextEdit

> Ну проблема в том, что перемещение курсора у меня отключено в функции _change_cursor

Кто тебе мешает сделать disconnect на время выделения текста?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#7 Апрель 25, 2024 05:11:42

Devik
Зарегистрирован: 2024-04-24
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Изменение цвета символов в QTextEdit


Rodegast
> Кто тебе мешает сделать disconnect на время выделения текста?
Ну выделение тоже отключено, функцией _change_selection

Офлайн

#8 Апрель 25, 2024 11:50:14

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2699
Репутация: +  182  -
Профиль   Отправить e-mail  

Изменение цвета символов в QTextEdit

Тогда используй QSyntaxHighlighter и не мучайся.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

  • Начало
  • » GUI
  • » Изменение цвета символов в QTextEdit[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version