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

Posted

技术标签:

【中文标题】Python / Pyside 代码没有按顺序执行?【英文标题】:Python / Pyside Code not executing sequentially? 【发布时间】:2013-05-22 14:10:23 【问题描述】:

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

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

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

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

def initiateScan(self):
    self._theMainWindow.theScan.theScanProgress.show()
    print("test")
    time.sleep(3)

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

任何想法为什么会发生这种情况?

【问题讨论】:

你能告诉我们theScanProgress是什么类型吗? 它是一个 QDialog 对象(使用 QtDesigner 创建并使用 pyside-uic 工具编译为 .py 文件 【参考方案1】:

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

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

[我可能扼杀了一些艺术术语]

【讨论】:

所以,在实践中,事件的顺序是这样的?:initialScan 被调用,然后 show() 发出信号,该信号被放入队列,sleep(3) 使进程进入睡眠状态并且只有 show() 实际被处理? (或者我们应该说:从事件队列中出列)。我还要说,通过调试器,show() 以某种方式将程序带到启动 GUI 应用程序的主 .py 文件,更具体地说,是 app.exec_() 调用。经过一番调查,这似乎是每个与 GUI 相关的方法调用的规则:它们都将程序转移到 app.exec_()【参考方案2】:

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

你必须使用线程或寻找其他方式等待 3 秒。

【讨论】:

以上是关于Python / Pyside 代码没有按顺序执行?的主要内容,如果未能解决你的问题,请参考以下文章

python3的Pyside-uic?

Python流程控制-1 顺序执行

PHP没有按顺序执行

PySide2:如何使装饰槽在其工作线程上执行?

在 Python 中无需单击即可执行函数 | Pyside [重复]

NodeJS HTTP请求未按顺序执行