LINUX.ORG.RU

pyqt QPlainTextEdit и проблемы с прорисовкой

 , ,


0

1

Всем доброго времени суток!

Делаю GUI силами pyqt5, и мне надо сделать так чтобы был лог динамичный, то есть многоточно работает скрипт и мне надо писать результат работы в лог в интерфейсе, добавлять туда строки новые постоянно.

Для этого использую QT версии 5, там есть виджет QPlainTextEdit - это и есть лог.

Проблема в том что если добавлять по тупому туда значения например циклом - то всё нормально работает, но разумеется пока он туда пишет - зависает интерфейс и пока цикл не закончится то не разлочится.

Но у меня многоточное приложение, я сделал так - потоки работают и в отдельную очередь закидывают то что мне надо в логе увидеть, и отдельный рабочий в 1 поток делает постоянно append в этот лог-виджет.

Всё работает чудесно и замечательно, однако почему-то отрисовка не срабатывает, и чтобы мне там увидеть изменения что туда записало в лог - я беру мышку и выделяю всю область, только после этого я могу видеть что туда записало в эту текстовую область. Вот как это починить можно?


потоки работают и в отдельную очередь закидывают то что мне надо в логе увидеть, и отдельный рабочий в 1 поток делает постоянно append в этот лог-виджет

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

XMs ★★★★★
()
Ответ на: комментарий от XMs

Большое спасибо за совет. Не сочтите за наглость, не могли бы вы пожалуйста небольшой пример запилить?

Вот есть такой код:

#!/usr/bin/env python3

from PyQt5.QtWidgets import *
import sys

class Window(QWidget):
    def __init__(self):
        QWidget.__init__(self)

        layout = QGridLayout()
        self.setLayout(layout)

        plaintextedit = QPlainTextEdit()
        plaintextedit.setPlaceholderText("This is some placeholder text.")
        layout.addWidget(plaintextedit, 0, 0)

        # plaintextedit.appendPlainText("123")

app = QApplication(sys.argv)

screen = Window()
screen.show()

sys.exit(app.exec_())

И надо запилить отправку сигнала чтобы по нему доавлялся «123»

rubro
() автор топика
Ответ на: комментарий от rubro

За наглость не сочту, но пример не предоставлю, так как питон не разумею. На плюсах в сокращённом виде это будет выглядеть как-то так:

class worker: public QThread
  {
	Q_OBJECT
	...
	protected:
		virtual void run() override
		  {
			while(CONDITION)
			  {
				emit logMessage(getLogMessage());
			  }
		  }
	...
	signals:
		void logMessage(QString);
  }



int main(int argc, char **argv)
  {
	QApplication app(argc, argv);
	QPlainTextEdit edit;
	worker w;

	connect(&w,    SIGNAL(logMessage(QString)),
	        &edit, SLOT(appendPlainText(QString)));

	edit.show();
	w.start();
	return app.exec();
  }
Надеюсь, используемые механизмы ясны и на питон это можно перевести без проблем

XMs ★★★★★
()
Последнее исправление: XMs (всего исправлений: 1)

Возможно, стоит попробовать вызвать метод .paintEvent(). Это событие отвечает за перерисовку, я в последний раз так делал в подобной ситуации. Ещё есть метод вроде .repaint(), тоже должен работать.

evilface ★★
()
Ответ на: комментарий от XMs

Да, update(). Сначала вспомнил про него, но глянул не в тот код, увидел repaint(), решил что не то.

evilface ★★
()

Всем спасибо за советы!

Ребят подскажите как вот тут передать в функции входные параметры?

self.button_start.clicked.connect(self.append_log)
self.append_log - вот эта функция, почему-то через connect ни в какую не даёт засунуть свои параметры.

Весь код вот так выглядит:

from PyQt5.QtWidgets import *


class Window(QWidget):
    def __init__(self):
        QWidget.__init__(self)

        layout = QGridLayout()
        self.setLayout(layout)

        self.plaintextedit = QPlainTextEdit()
        layout.addWidget(self.plaintextedit, 0, 0)

        # блок управления
        self.button_start = QPushButton("Кнопка")
        layout.addWidget(self.button_start, 1, 0)
        self.button_start.clicked.connect(self.append_log)

    # пишем что нам надо
    def append_log(self, task):
        # вот этот кусок кода не хочет работать
        # self.plaintextedit.appendPlainText(task)
        self.plaintextedit.appendPlainText("123")

app = QApplication(sys.argv)

screen = Window()
screen.show()

sys.exit(app.exec_())

rubro
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.