python - Python:指令后更新 GUI
问题描述
我设计了一个程序来解决魔方问题,现在我正在使用 PySide 为它构建一个 GUI。我的程序会生成一个解决立方体所需的动作列表,然后一个一个地执行它们。我希望我的程序在每次移动之间的短时间内显示立方体的状态。
目前,我正在尝试使用时间模块让程序在执行动作之间等待。基本上是这样的:
for move in algorithm:
executeMove()
updateDisplay()
time.sleep(0.1)
我认为这种方法可以正常工作。但是,当我运行应用程序时,它看起来像是在每个睡眠调用的总和时间内处于睡眠状态,然后显示算法的最终结果。理想情况下,我想让它显示动作,睡眠 0.1,显示动作,睡眠 0.1 等。
睡眠功能是否适合我想要获得的行为类型?我应该使用完全不同的东西吗?谢谢你的建议。
解决方案
看到更多代码会很好,但看起来您可能正在阻塞主 Qt 线程。要完成您想做的事情,您需要多线程并使用pyQtSignal
s 来更新 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
,所以你的实现需要适应它。
推荐阅读
- animation - 如何为梯形上的两个以上点设置动画?
- hadoop - HDFS 磁盘使用情况是否反映了我 PC 上本地硬盘空间的使用情况?
- javascript - 将字符串数组传递给字符串文字中的函数
- python - 从 3d numpy 数组中删除 2d 切片
- haskell - 简单的 Liquidhaskell 示例失败了预期的行为
- javascript - 滚动到结束页面时的活动功能
- sql-server - 创建2个表ID,当第一个递增时第二个重新启动
- java - 如果读写是原子的,为什么需要 volatile
- c# - 如何从字典C#中返回tvalues
- ios - SwiftUI 右对齐标签