Комбинированное добавить/удаление текста в QTextEdit

Есть виджет QTextEdit, при наступлении события в него выводится текст (информация о событии), при наступлении другого события ОДНОВРЕМЕННОГО с первым, к тексту добавляется еще текст (информация о событии 2).

Загвоздка в том как удалить тот текст, событие которого перестало, а другой если событие еще актуально остался в строке.

Пробовал через append() и все я не знаю куда капнуть.

 def on_messageSignal(self, msg):
    try:
        val = str(msg)
        if val == "1":
            self.img = QtGui.QPixmap('icons/contener.png')
            self.pixmap.setPixmap(self.img)
            self.graphicsView.setStyleSheet("background-color: red;")
            self.textEdit.append("Аппаратная открыта!")
            
            # pygame.init()
            # sound = pygame.mixer.Sound('kalitka.mp3')
            # sound.play()              
        else:
            self.img = QtGui.QPixmap('icons/contener.png')
            self.pixmap.setPixmap(self.img)
            self.graphicsView.setStyleSheet("background-color: white;")
            self.textEdit.clear()
            #pygame.quit()
           

    except ValueError:
        print("error: Not is number")


@QtCore.pyqtSlot(str)
def on_messageSignal1(self, msg):

    try:
        val = str(msg)
        if val == "1":
            self.img1 = QtGui.QPixmap('icons/zabor_open.png')
            self.pixmap1.setPixmap(self.img1)
            self.graphicsView_2.setStyleSheet("background-color: red;")
            self.textEdit.append("Проникновение на территорию!")
            #self.label_2.setText("Работа\nдизеля!")
            pygame.init()
            sound = pygame.mixer.Sound('kalitka.mp3')
            sound.play()              
        else:
            self.img1 = QtGui.QPixmap('icons/zabor_close.png')
            self.pixmap1.setPixmap(self.img1)
            self.graphicsView_2.setStyleSheet("background-color: white;")
            self.textEdit.clear()
            pygame.quit()
           

    except ValueError:
        print("error: Not is number")

эта часть кода которая выводит текст сообщения при сробатывании датчика и меняет картинку

Как видно при наступлении 2-х событий, сработали 2 датчика, картинки покраснели и вывелось 2 сообщения в одном текстбоксе.

Нужно чтобы если один датчик отключается УДАЛЯЛОСЬ сообщение, которое привязано к этому датчику, а остальной текст оставался пока не выключится другой датчик.


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

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

Учитывая что это ваш ПЕРВЫЙ ВОПРОС, позволю себе дать вам некотрые рекомендации:

  • чтобы получать быстрые и правильные ответы - вы должны научиться создавать минимально-воспроизводимый пример;

  • как создать минимальный и воспроизводимый пример;

  • все дополнения, которые вы хотите сообщить, надо прописывать в теле вопроса, а не в комментариях к нему.

Из того что я понял, ваша задача может выглядеть примерно так:

import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.Qt import *


class MainWindow(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        
        self.checkOne = QtWidgets.QCheckBox('Событие one')
        self.checkTwo = QtWidgets.QCheckBox('Событие two')

        self.labelOne = QLabel()
        self.labelOne.setPixmap(QPixmap('off.png').scaled(50, 50))
        self.labelTwo = QLabel()
        self.labelTwo.setPixmap(QPixmap('off.png').scaled(50, 50))
        
        self.textEdit = QTextEdit()
        
        self.layout = QtWidgets.QGridLayout(self)
        self.layout.addWidget(self.textEdit, 0, 0, 1, 2)
        self.layout.addWidget(self.labelOne, 1 , 0)
        self.layout.addWidget(self.checkOne, 1 , 1)
        self.layout.addWidget(self.labelTwo, 2 , 0)
        self.layout.addWidget(self.checkTwo, 2 , 1)
       
        self.checkOne.stateChanged.connect(
            lambda state=self.checkOne.isChecked(), cb=self.checkOne: \
                   self.selectCheckBox(state, cb))
        self.checkTwo.stateChanged.connect(
            lambda state=self.checkTwo.isChecked(), cb=self.checkTwo: \
                   self.selectCheckBox(state, cb))

    def selectCheckBox(self, toggle, cb):
        text = ''
        
        if toggle and cb.text() == 'Событие one':
            self.labelOne.setPixmap(QPixmap('on.png').scaled(50, 50))
            if self.checkTwo.isChecked():
                text = text + 'Событие two\n'
            text = text + 'Событие one'
        elif not toggle and cb.text() == 'Событие one':
            self.labelOne.setPixmap(QPixmap('off.png').scaled(50, 50))
            if self.checkTwo.isChecked():
                text = text + 'Событие two\n'
            
        elif toggle and cb.text() == 'Событие two':
            self.labelTwo.setPixmap(QPixmap('on.png').scaled(50, 50))
            if self.checkOne.isChecked():
                text = text + 'Событие one\n'
            text = text + 'Событие two'
            
        elif not toggle and cb.text() == 'Событие two':
            self.labelTwo.setPixmap(QPixmap('off.png').scaled(50, 50))
            if self.checkOne.isChecked():
                text = text + 'Событие one'

        self.textEdit.setText(text)


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

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


off.png

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

on.png

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

→ Ссылка
Автор решения: Александр

Прошу меня простить за то что коряво излагаю вопрос, научусь) ваш код помог, спасибо добрый человек!

if val == "1":
            self.img = QtGui.QPixmap('icons/contener.png')
            self.pixmap.setPixmap(self.img)
            self.graphicsView.setStyleSheet("background-color: red;")
            self.text = self.text + 'Блок контейнер открыт!'
            self.textEdit.setText(self.text)
                                       
        else:
            self.img = QtGui.QPixmap('icons/contener.png')
            self.pixmap.setPixmap(self.img)
            self.graphicsView.setStyleSheet("background-color: white;")
            if 'Блок контейнер открыт!' in self.text:
                self.text=self.text.replace('Блок контейнер открыт!','')
            
                self.textEdit.setText(self.text)
→ Ссылка