Python / Pyside代码不按顺序执行?

时间:2013-05-22 14:10:24

标签: python qt user-interface pyside

我正在使用Pyside构建基于Qt的GUI。在有权访问QMainWindow(_theMainWindow)类的特定类中,该类又可以访问其他2个Qt小部件(theScan& theScanProgress)我正在尝试{{1}最后一个执行

show()

这很好用,会出现theScanProgress小部件。

但是,当我添加使应用程序进入睡眠状态的行(以及打印语句)时,如下所示

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

程序似乎在小部件出现之前就进入睡眠状态,就好像def initiateScan(self): self._theMainWindow.theScan.theScanProgress.show() print("test") time.sleep(3) 之前time.sleep(3)被执行一样

为什么会发生这种情况?

2 个答案:

答案 0 :(得分:0)

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

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

[我可能已经玷污了一些艺术术语]

答案 1 :(得分:0)

show仅调度进度窗口小部件的外观。但是,由于您使用sleep阻止了主线程,因此主线程在释放之前无法执行计划操作。

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