Вы не можете обновить пользовательский интерфейс вне цикла 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
.