PyQt事件循环在哪里运行?

时间:2015-01-21 05:27:40

标签: python pyqt

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

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

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

如果我import time; time.sleep(10),则Widget会在10秒内无响应。

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

我的问题是,如果Widget已经响应事件,那么运行app.exec_()的重点是什么?有什么不同吗?它只是一种阻止应用程序关闭的方式,同时仍然为Qt的事件循环提供服务(while True: pass会导致事件循环阻塞,正如我们从time.sleep(10)那样理解的那样)

我还想了解Qt挂钩CPython的位置,它允许解释器和GUI处于活动状态。我知道Python 2(可能还有3个?)有一个所谓的PyOS_InputHook机制,大约每秒调用10次。 IPython使用它来运行GUI(需要花费很多精力来处理GUI事件,速度超过每秒10次)。当我实例化QApplication时,是否会发生同样的事情?如果是这样,再次,调用app.exec_()

的重点是什么

1 个答案:

答案 0 :(得分:4)

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

我不知道这个魔法是如何完成的 - 我没有兴趣找到它,因为它与普通的PyQt / PySide应用程序的工作原理无关。它只是一个开发工具,可以方便地进行测试。

对于从脚本启动的普通PyQt / PySide应用程序,必须显式调用app.exec_()才能启动事件处理。否则,只要所有代码都被执行,脚本就会退出(就像任何其他python脚本一样)。

修改

PyQt文档中有一节提供了有关事物实际工作方式的更多信息:Using PyQt4 from the Python Shell