gpt4 book ai didi

python - PyQt/PySide 事件循环在哪里运行?

转载 作者:太空狗 更新时间:2023-10-30 03:00:47 26 4
gpt4 key购买 nike

如果我打开 Python 解释器并输入以下行:

from PyQt4 import QtGui
app = QtGui.QApplication([])
w = QtGui.QLineEdit()
w.show()

然后会出现一个文本输入小部件。我可以在与口译员互动时与它互动。如果我附加了任何事件处理程序,它们也会被调用。

如果我做 导入时间; time.sleep(10),Widget 无响应 10 秒。

如果我运行 app.exec_(),该调用会阻塞,直到我关闭应用程序。

我的问题是:如果小部件已经响应事件,运行 app.exec_() 有什么意义?有什么不同吗?它只是一种防止应用程序关闭同时仍在为 Qt 的事件循环提供服务的方法吗(while True: pass 会导致事件循环阻塞,正如我们从执行 time.sleep(10 ))

我还想了解 Qt 在何处连接到 CPython 以允许解释器和 GUI 处于事件状态。我知道 Python 2(可能还有 3?)有一个所谓的 PyOS_InputHook 机制,大约每秒调用 10 次。 IPython 使用它来运行 GUI(需要付出很多努力才能以每秒 10 次以上的速度处理 GUI 事件)。当我实例化一个 QApplication 时是否发生了同样的事情?如果是这样,那么调用 app.exec_()

的意义何在?

最佳答案

当您在交互式 session 中使用 PyQt/PySide 时,事件处理会在后台自动设置,允许您直接与对象交互。因此,例如,您可以创建并显示一个窗口,然后在该窗口仍然可见时从 python shell 中向其添加其他小部件。不过,这种行为是特定于交互式 session 的 - 它只是为了让您可以轻松地进行实验,而无需自己设置事件处理的麻烦。

根据 PyQt 文档,PyOS_InputHook 用于在交互式解释器等待用户输入时处理事件(请参阅:Using PyQt5 from the Python Shell)- 并且 PySide 可能也使用了类似的机制。

对于从脚本启动的普通 PyQt/PySide 应用程序,您必须显式调用 app.exec_() 以启动事件处理。否则,脚本将在所有代码执行完毕后立即退出(即就像任何其他 Python 脚本一样)。

(要更深入地了解 Qt 的事件处理,请参阅:Threads, Events, QObjects)。

关于python - PyQt/PySide 事件循环在哪里运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28060218/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com