如果我打开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_()
答案 0 :(得分:4)
在交互式会话中使用PyQt / PySide时,事件处理会在后台自动设置,允许您直接与对象进行交互。因此,例如,您可以创建并显示一个窗口,然后在窗口仍然可见的情况下从python shell中添加其他窗口小部件。这种行为特定于交互式会话 - 只有这样才能让您轻松地试验事物,而无需自己设置事件处理的麻烦。
我不知道这个魔法是如何完成的 - 我没有兴趣找到它,因为它与普通的PyQt / PySide应用程序的工作原理无关。它只是一个开发工具,可以方便地进行测试。
对于从脚本启动的普通PyQt / PySide应用程序,必须显式调用app.exec_()
才能启动事件处理。否则,只要所有代码都被执行,脚本就会退出(就像任何其他python脚本一样)。
修改强>:
PyQt文档中有一节提供了有关事物实际工作方式的更多信息:Using PyQt4 from the Python Shell。