Обновление QPlainTextEdit контрола при добавлении данных

Необходимо выводить текст на форме. Какой контрол выбрать для этих целей не знаю, поэтому остановился на QPlainTextEdit.

Каждые несколько секунд добавляются данные для вывода и выводятся в своем потоке на форму.

Проблема заключается в отображении. Первая запись выводится отлично, а последующих не видно, необходимо совершить событие на контролеь, например нажать на контрол и только тогда записи появятся.

def start(self):
        while(1):
                self.richEdit.appendPlainText("text");
                
                # так пробовал не помогает
                #self.richEdit.update()

Как решить данную проблему?

UPD: Бесконечный цикл находится в другом потоке, он постоянно слушает устройство и при необходимости выводит сообщение, но не обновляет контрол. В данном случае думаю QTimer не подходит


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

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

Нельзя использовать цикл while(1) ы основном потоке - это замораживает интерфейс.

Если ваша задача по получению данных не замораживает интерфейс и ее не надо помещать в дополнительный поток, то вам достаточно QTimer.

import sys 
import random
from PyQt5.Qt import *


class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        
        self.richEdit = QPlainTextEdit('Hello World') 
        layout = QGridLayout(self)
        layout.addWidget(self.richEdit)        
        
        self.text = ''
        
        self.timer = QTimer()                             
        self.timer.setInterval(2000)                    # Миллисекунды    
        self.timer.timeout.connect(self.onStart)      
        self.timer.start()                              
        
    def onStart(self):
        self.text = f'text {random.randint(1, 200)}'    # тут вы получаете какой-то текст
        self._append()
        
    def _append(self):
        self.richEdit.appendPlainText(self.text)      
        

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

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


UPD: Бесконечный цикл находится в другом потоке, он постоянно слушает устройство и при необходимости выводит сообщение, но не обновляет контрол. В данном случае думаю QTimer не подходит

Нельзя взаимодействовать в дополнительном потоке с виджетами. В Qt вы должны использовать сигналы и слоты.

import sys 
import random
from PyQt5.Qt import *


# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
class WorkThread(QThread):
    threadSignal = pyqtSignal(str)

    def __init__(self):
        super().__init__()

    def run(self):
        while  True:
            text = f'text {random.randint(1, 200)}'        # тут вы получаете какой-то текст
            self.threadSignal.emit(text)
            self.msleep(2000)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        
        self.richEdit = QPlainTextEdit('Hello World') 
        layout = QGridLayout(self)
        layout.addWidget(self.richEdit)        
        
        self.thread = WorkThread()
        self.thread.threadSignal.connect(self.on_threadSignal) 
        self.thread.start()        
       
    def on_threadSignal(self, text):
        self.richEdit.appendPlainText(text)      
        

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MyWidget()
    w.show()
    sys.exit(app.exec_())
→ Ссылка