首页 > 解决方案 > Python:指令后更新 GUI

问题描述

我设计了一个程序来解决魔方问题,现在我正在使用 PySide 为它构建一个 GUI。我的程序会生成一个解决立方体所需的动作列表,然后一个一个地执行它们。我希望我的程序在每次移动之间的短时间内显示立方体的状态。

目前,我正在尝试使用时间模块让程序在执行动作之间等待。基本上是这样的:

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

我认为这种方法可以正常工作。但是,当我运行应用程序时,它看起来像是在每个睡眠调用的总和时间内处于睡眠状态,然后显示算法的最终结果。理想情况下,我想让它显示动作,睡眠 0.1,显示动作,睡眠 0.1 等。

睡眠功能是否适合我想要获得的行为类型?我应该使用完全不同的东西吗?谢谢你的建议。

标签: pythonpysidesleep

解决方案


看到更多代码会很好,但看起来您可能正在阻塞主 Qt 线程。要完成您想做的事情,您需要多线程并使用pyQtSignals 来更新 UI。这是一个(可能是错误的)模板

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,所以你的实现需要适应它。


推荐阅读