Python/Pyside代码没有按顺序执行?

2024-09-30 16:32:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Pyside构建一个基于Qt的GUI。在一个可以访问QMainWindow(_theMainWindow)类的特定类中,该类又可以访问另外两个Qt小部件(theScan&;theScanProgress),我试图通过执行

def initiateScan(self):
    self._theMainWindow.theScan.theScanProgress.show()

这一切都很好,出现了theScanProgress小部件。在

但是,当我添加使应用程序休眠的行(和一个print语句)时,如下所示

^{pr2}$

程序似乎在小部件出现之前进入休眠状态,即time.sleep(3)self._theMainWindow.theScan.theScanProgress.show()之前执行

你知道为什么会这样吗?在


Tags: self应用程序部件defshowguiqtamp
2条回答

这是因为主循环处理gui事件。如果不使用线程,则一次只能执行一个函数。我强烈怀疑show发出一个进入事件队列的信号,而这个信号又被阻塞,直到当前函数返回。在

换句话说,Qt是事件驱动的,它一次只能执行一个事件。您调用的initiateScan在堆栈中添加了一个事件来执行函数(类似于您按下按钮,发出信号,然后触发函数),该函数可以进行一些计算,更改对象的内部状态,并将事件添加到堆栈中。show的作用是向它的所有孩子发出一个信号,让他们向他们展示自己。要运行该代码,必须等待当前事件(具有睡眠的函数)返回。在sleep期间,由于完全相同的原因,整个gui将没有响应。在

[我可能毁了一些艺术术语]

show只安排进度小部件的出现。但是,由于您使用sleep阻塞了主线程,因此在您释放它之前,主线程无法执行计划的操作。在

你必须使用线程或另一种方法等待3秒。在

相关问题 更多 >