Форум сайта python.su
Есть 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())
Офлайн
Тебе символы раскрашивать надо? Тогда используй метод setTextColor
Офлайн
RodegastА как мне раскрасить определенных индексы?
setTextColor
Офлайн
Примерно так:
1) Устанавливаешь курсов в нужную позицию
cursor = self.textedit.textCursor() cursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, позиция) self.textedit.setTextCursor(cursor)
self.textedit.setTextColor(QColor(цвет))
self.textedit.insertPlainText(текст)
Отредактировано Rodegast (Апрель 24, 2024 18:57:22)
Офлайн
Ну проблема в том, что перемещение курсора у меня отключено в функции _change_cursor, поэтому с перемещением курсора не подойдет.
Офлайн
> Ну проблема в том, что перемещение курсора у меня отключено в функции _change_cursor
Кто тебе мешает сделать disconnect на время выделения текста?
Офлайн
RodegastНу выделение тоже отключено, функцией _change_selection
> Кто тебе мешает сделать disconnect на время выделения текста?
Офлайн
Тогда используй QSyntaxHighlighter и не мучайся.
Офлайн