Python PyQt отдельный бэкэнд от GUI - PullRequest
0 голосов
/ 25 мая 2018

Я хочу, чтобы моему бэкэнду Python не приходилось ждать, пока мой PyQt GUI будет рисовать (много) вещей.Есть ли лучший / правильный способ сделать это в PyQt, чем в примере кода ниже?Нужно ли использовать многопоточный импорт или у PyQt есть свой лучший способ сделать это?

import time
from threading import Thread

class Backend(Thread):
    def __init__(self):
        super().__init__()

    def run(self):
        for i in range(20):
            print("Backend heavy work")
            time.sleep(4)


class GUI(Thread):
    def __init__(self):
        super().__init__()

    def run(self):
        for i in range(20):
            print("GUI drawing stuff")
            time.sleep(0.5)

if __name__ == '__main__':
    thread_backend = Backend()
    thread_gui = GUI()

    thread_backend.start()
    thread_gui.start()

Я пытался сделать это с Qtimer, но не получил его на работу.Спасибо!

1 Ответ

0 голосов
/ 26 мая 2018

Вы не можете обновить пользовательский интерфейс вне цикла Qt.Что вы можете сделать, так это использовать сигналы qt для подключения к методам, выполняющим эту работу за вас.В качестве примера

class GUI(QtCore.QObject): # must be a class that inherits QObject to use signals, I believe
    drawSignal = QtCore.pyqtSignal(int)
    def __init__(self):
        super().__init__()
        self.drawSignal.connect(self._drawStuff) # The underscore thing is a little hacky, but sort of pythonic I think, and makes the API clean.
        self.drawStuff = self.drawSignal.emit
    def _drawStuff(self, i):
        # do whatever you want to the gui here
        pass


class GUILoop(Thread):
    def __init__(self, gui):
        super().__init__()
        self.gui = gui
    def run(self):
        for i in range(20):
            self.gui.drawStuff(i)
            time.sleep(0.5)

if __name__ == '__main__':
    gui = GUI()
    thread_backend = Backend()
    thread_gui = GUILoop(gui)

    thread_backend.start()
    thread_gui.start()

Это может показаться немного странным, но оно хорошо соответствует сильным сторонам Qt и Python.Возможно, имеет смысл просто добавить сигналы в ваш класс QMainWindow, который уже является QObject.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...