У меня проблема с поддержанием отзывчивости GUI с использованием PyQt и Qthreads.То, что я делаю, это порождаю рабочий Qthread из графического интерфейса, который является тяжелым процессором.Рабочий Qthread посылает сигнал, содержащий числовое значение в каждом цикле.В графическом интерфейсе сигнал связан с функцией обновления, которая принимает числовое значение и перерисовывает графический интерфейс.Я использую стандартный механизм Qt SIGNAL / SLOT.
Все это похоже на документацию, которую я нашел в Интернете относительно PyQt, графических интерфейсов и Qthreads.Проблема в том, что рабочий поток запускает сигнал так часто, что графический интерфейс становится очень вялым.Решение состоит в том, чтобы рабочий поток запускал сигнал реже, но я хотел бы получить быстрое обновление прогресса.
Это все кажется очень стандартным материалом, и все же я не могу найти правильныйрешение.Возможно, мне нужно изменить дизайн?
Любая помощь будет оценена.
Код:
import calculator as ca
class GUI(QMainWindow):
def __init__(self, config):
QMainWindow.__init__(self)
self.w_thread = WorkerThread()
self.connect(self.w_thread, SIGNAL("update(PyQt_PyObject)"), self.update_gui)
def start_calc(self):
self.w_thread.start()
def update_gui(self, progress_value):
self.progress_value = progress_value
self.repaint()
def paintEvent(self, event):
paint = QPainter()
paint.begin(self)
paint.drawText(300, 300, "progress: " + str(self.progress_value))
paint.end()
class WorkerThread(QThread):
def __init__(self):
QThread.__init__(self)
def __del__(self):
self.wait()
def run(self):
ca.run_calculations(self)
*************** calculator.py ***************
def run_calculations(thread=None):
while current_cycle < total_cycles:
do_calculations()
if current_cycle % 100 == 0:
thread.emit(SIGNAL("update(PyQt_PyObject)"), current_progress_value)
qApp.processEvents()
current_cycle += 1