Python: обновление графического интерфейса после инструкции - PullRequest
0 голосов
/ 27 июня 2018

Я разработал программу для решения кубиков Рубика, и сейчас я создаю графический интерфейс для нее, используя PySide. Моя программа генерирует список ходов, необходимых для решения куба, а затем выполняет их один за другим. Я бы хотел, чтобы моя программа показывала состояние куба в течение короткого промежутка времени между каждым ходом.

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

for move in algorithm:
    executeMove()
    updateDisplay()
    time.sleep(0.1)

Я полагал, что этот метод будет работать нормально. Однако, когда я запускаю приложение, оно выглядит так, как будто оно спит в течение суммарного времени каждого из вызовов сна, а затем показывает конечный результат алгоритма. В идеале я хотел бы, чтобы он показывал движение, спал 0,1, показывал движение, спал 0,1 и т. Д.

Является ли функция сна идеальной для поведения, которое я пытаюсь получить? Должен ли я использовать что-то совсем другое? Спасибо за ваши предложения.

1 Ответ

0 голосов
/ 27 июня 2018

Было бы хорошо увидеть немного больше кода, но похоже, что вы, вероятно, блокируете основной поток Qt. Чтобы выполнить то, что вы хотите сделать, вам нужно быть многопоточным и использовать pyQtSignal s для обновления пользовательского интерфейса. Вот (возможно, глючит) шаблон

class MainWindow(QtWidgets.QMainWindow):
    updateSignal = QtCore.pyqtSignal()
    def __init__(self, algorithm):
        super(MainWindow, self).__init__()
        self.algorithm = algorithm
        self.updateSignal.connect(self.updateDisplay)
        self.loopThread = None
        self.startMonitoring()
    def startMonitoring(self):
        self.loopThread = MonitorLoop(self.updateSignal.emit, self.algorithm)
        self.loopThread.start()
    def updateDisplay(self):
        """ Update the UI here"""
        pass


class MonitorLoop(QtCore.QThread):
    def __init__(self, signal, algorithm):
        super(MonitorLoop, self).__init__()
        self.signal = signal # needs to be a pyQtSignal if it will update the UI
        self.algorithm = algorithm
    def run(self):
        for move in self.algorithm:
            executeMove()
            self.signal()
            time.sleep(0.1)

Если вы используете Qt 4, вам придется заменить QtGui на QWidgets. Конечно, я на самом деле не знаю, что такое algorithm, поэтому ваша реализация должна будет учесть это.

...